<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="generator" content="TiddlyWiki" />
<meta name="tiddlywiki-version" content="5.1.15" />
<meta name="format-detection" content="telephone=no">
<link id="faviconLink" rel="shortcut icon" href="favicon.ico">
<title>plugins — docs for plugins by tobibeer</title>
<div id="styleArea">
<style data-tiddler-title="$:/boot/boot.css" data-tiddler-type="text/css" type="text/css">/*
Basic styles used before we boot up the parsing engine
*/
/*
Error message and password prompt
*/
.tc-password-wrapper, .tc-error-form {
font-family: sans-serif;
z-index: 20000;
position: fixed;
text-align: center;
width: 200px;
top: 4em;
left: 50%;
margin-left: -144px; /* - width/2 - paddingHorz/2 - border */
padding: 16px 16px 16px 16px;
border-radius: 8px;
}
.tc-error-form {
color: #fff;
text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
background-color: rgb(255, 75, 75);
border: 8px solid rgb(255, 0, 0);
width: 480px;
margin-left: -244px; /* - width/2 - paddingHorz/2 - border */
}
.tc-error-form div {
padding-bottom: 1em;
}
.tc-error-prompt {
color: #000;
text-shadow: none;
}
.tc-password-wrapper {
color: #000;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
background-color: rgb(197, 235, 183);
border: 8px solid rgb(164, 197, 152);
}
.tc-password-wrapper form {
text-align: left;
}
.tc-password-wrapper h1 {
font-size: 16px;
line-height: 20px;
padding-bottom: 16px;
}
.tc-password-wrapper input {
width: 100%;
}
</style>
</div>
<style type="text/css">
html .tc-story-river:after {
content: "";
display: block; }
/*
Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #f0f0f0;
-webkit-text-size-adjust: none;
}
.hljs,
.hljs-subst,
.hljs-tag .hljs-title,
.nginx .hljs-title {
color: black;
}
.hljs-string,
.hljs-title,
.hljs-constant,
.hljs-parent,
.hljs-tag .hljs-value,
.hljs-rule .hljs-value,
.hljs-preprocessor,
.hljs-pragma,
.hljs-name,
.haml .hljs-symbol,
.ruby .hljs-symbol,
.ruby .hljs-symbol .hljs-string,
.hljs-template_tag,
.django .hljs-variable,
.smalltalk .hljs-class,
.hljs-addition,
.hljs-flow,
.hljs-stream,
.bash .hljs-variable,
.pf .hljs-variable,
.apache .hljs-tag,
.apache .hljs-cbracket,
.tex .hljs-command,
.tex .hljs-special,
.erlang_repl .hljs-function_or_atom,
.asciidoc .hljs-header,
.markdown .hljs-header,
.coffeescript .hljs-attribute,
.tp .hljs-variable {
color: #800;
}
.smartquote,
.hljs-comment,
.hljs-annotation,
.diff .hljs-header,
.hljs-chunk,
.asciidoc .hljs-blockquote,
.markdown .hljs-blockquote {
color: #888;
}
.hljs-number,
.hljs-date,
.hljs-regexp,
.hljs-literal,
.hljs-hexcolor,
.smalltalk .hljs-symbol,
.smalltalk .hljs-char,
.go .hljs-constant,
.hljs-change,
.lasso .hljs-variable,
.makefile .hljs-variable,
.asciidoc .hljs-bullet,
.markdown .hljs-bullet,
.asciidoc .hljs-link_url,
.markdown .hljs-link_url {
color: #080;
}
.hljs-label,
.ruby .hljs-string,
.hljs-decorator,
.hljs-filter .hljs-argument,
.hljs-localvars,
.hljs-array,
.hljs-attr_selector,
.hljs-important,
.hljs-pseudo,
.hljs-pi,
.haml .hljs-bullet,
.hljs-doctype,
.hljs-deletion,
.hljs-envvar,
.hljs-shebang,
.apache .hljs-sqbracket,
.nginx .hljs-built_in,
.tex .hljs-formula,
.erlang_repl .hljs-reserved,
.hljs-prompt,
.asciidoc .hljs-link_label,
.markdown .hljs-link_label,
.vhdl .hljs-attribute,
.clojure .hljs-attribute,
.asciidoc .hljs-attribute,
.lasso .hljs-attribute,
.coffeescript .hljs-property,
.hljs-phony {
color: #88f;
}
.hljs-keyword,
.hljs-id,
.hljs-title,
.hljs-built_in,
.css .hljs-tag,
.hljs-doctag,
.smalltalk .hljs-class,
.hljs-winutils,
.bash .hljs-variable,
.pf .hljs-variable,
.apache .hljs-tag,
.hljs-type,
.hljs-typename,
.tex .hljs-command,
.asciidoc .hljs-strong,
.markdown .hljs-strong,
.hljs-request,
.hljs-status,
.tp .hljs-data,
.tp .hljs-io {
font-weight: bold;
}
.asciidoc .hljs-emphasis,
.markdown .hljs-emphasis,
.tp .hljs-units {
font-style: italic;
}
.nginx .hljs-built_in {
font-weight: normal;
}
.coffeescript .javascript,
.javascript .xml,
.lasso .markup,
.tex .hljs-formula,
.xml .javascript,
.xml .vbscript,
.xml .css,
.xml .hljs-cdata {
opacity: 0.5;
}
.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8;-webkit-text-size-adjust:none}.hljs-comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:teal}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.hljs-dartdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.scss .hljs-preprocessor{color:#900;font-weight:bold}.hljs-list .hljs-keyword,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rule .hljs-property,.django .hljs-tag .hljs-keyword{color:navy;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body,.hljs-name{color:teal}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.clojure .hljs-keyword,.scheme .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa}
.tc-reveal.appear-block,
.tc-popup.appear {
border-radius: 5px;
padding: 1px 1em;
-webkit-box-shadow: 2px 2px 4px rgba(0,0,0,0.3);
-moz-box-shadow: 2px 2px 4px rgba(0,0,0,0.3);
box-shadow: 2px 2px 4px rgba(0,0,0,0.3);
;
}
.tc-popup.appear {
padding: 0 1em;
background: #ffffff;
}
.appear-reveal.appear-inline{
margin-left:5px;
}
.appear-reveal.appear-inline.appear-once{
margin-left:0;
}
.tc-external-tiddler{
position:relative;overflow:hidden;
}
.tc-external-tiddler > iframe{
position:absolute;border:0;width:100%;
}
.tb-inc-controls{
margin-top:-2em;
padding: 5px;
display:none;
}
.tb-inc-tab-content .tb-inc{
margin:0;
padding:0;
position:relative;
}
.tb-inc-tab-content .tb-inc-controls{
position:absolute;
margin-top:-5px;
right:0;
top:0;
}
.tb-inc:hover > .tb-inc-controls{
display:block;
float:right;
}
.tc-plantuml-txt {
border:0;
width:100%;
height:400px;
}
.tc-plantuml-edit.tc-tiddlylink-external{
text-decoration:none;
}
.tc-popup.tc-preview-tiddler{
max-width:600px;
width:100%;
padding:1em;
}
.tc-rating {
vertical-align:middle;
}
.tc-rating,
.tc-rating .tc-rate{
display:inline-block;
}
.tc-rating button{
cursor:text;
float:right;
font-size:1.1em;
text-align:center;
color:#ccc;
}
.tc-rating .tc-rate{
cursor:pointer;
}
.tc-rating:hover .tc-rate{
opacity:.25;
}
.tc-rating .tc-rate:hover,
.tc-rating .tc-rate:hover ~ button[class^="tc-rating-"],
.tc-rating .tc-rate:hover ~ button[class*=" tc-rating-"] {
color:orange;
opacity:1;
}
.tc-rating .tc-selected,
.tc-rating .tc-selected ~ button[class^="tc-rating-"],
.tc-rating .tc-selected ~ button[class*=" tc-rating-"]{
color:orange;
}.tc-rating-template {
position:absolute;
right:48px;
}.tc-rating .tc-reset-rating {
color:#ccc;
opacity:.25;
padding:0 5px;
cursor:pointer;
}
.tc-rating .tc-reset-rating:hover {
color:#999;
opacity:1 !important;
}.tc-rating.light .tc-rating-1 {
opacity:0.4 !important;
}
.tc-rating.light .tc-rating-2 {
opacity:0.55 !important;
}
.tc-rating.light .tc-rating-3 {
opacity:0.7 !important;
}
.tc-rating.light .tc-rating-4 {
opacity:0.85;
}
.tc-sparkl{
border: 0;
background: transparent;
}.tc-sparkl-bar {
height:1em;
display:inline-block;
overflow:hidden;
}.tc-sparkl-bar b {
outline: 0;
height:0;
position:relative;
display:inline-block;
vertical-align: top;
border-left-color:transparent;
border-top-color:transparent;
border-top-style:solid;
border-bottom: 2em solid #5778d8;
background: transparent;
box-sizing:content-box;
}.tc-sparkl-bar:hover b{
border-top-color: #ecf2ff;
border-bottom-color: #547599;
}.tc-sparkl-dots .tc-sparkl-bar b {
height:2px;
border-bottom-color:transparent;
}.tc-sparkl-dots .tc-sparkl-bar:hover b{
border-bottom-color: #ecf2ff;
}.tc-sparkl-dot {
position:absolute;
background: #5778d8;
}.tc-sparkl-bar:hover .tc-sparkl-dot{
background: #547599;
}
.xlist{
margin:0;
}
.xlist dt{
font-size:1.2em;
}
.xlist dd{
margin-left:14px;
}
.xlist dd:before{
content: "»";padding-right:7px;
}
.tc-sidebar-header {
text-shadow: 0 1px 0 rgba(255,255,255, 0.8);
}.tc-tiddler-info {
-webkit-box-shadow: inset 1px 2px 3px rgba(0,0,0,0.1);
-moz-box-shadow: inset 1px 2px 3px rgba(0,0,0,0.1);
box-shadow: inset 1px 2px 3px rgba(0,0,0,0.1);
}@media screen {
.tc-tiddler-frame {
-webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.3);
-moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.3);
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.3);
}
}@media (max-width: 960px) {
.tc-tiddler-frame {
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
}.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {
-webkit-transition: fill 150ms ease-in-out;
-moz-transition: fill 150ms ease-in-out;
transition: fill 150ms ease-in-out;
}.tc-tiddler-controls button.tc-selected,
.tc-page-controls button.tc-selected {
-webkit-filter: drop-shadow(0px -1px 2px rgba(0,0,0,0.25));
-moz-filter: drop-shadow(0px -1px 2px rgba(0,0,0,0.25));
filter: drop-shadow(0px -1px 2px rgba(0,0,0,0.25));
}.tc-tiddler-frame input.tc-edit-texteditor {
-webkit-box-shadow: inset 0 1px 8px rgba(0, 0, 0, 0.15);
-moz-box-shadow: inset 0 1px 8px rgba(0, 0, 0, 0.15);
box-shadow: inset 0 1px 8px rgba(0, 0, 0, 0.15);
}.tc-edit-tags {
-webkit-box-shadow: inset 0 1px 8px rgba(0, 0, 0, 0.15);
-moz-box-shadow: inset 0 1px 8px rgba(0, 0, 0, 0.15);
box-shadow: inset 0 1px 8px rgba(0, 0, 0, 0.15);
}.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
border: none;
outline: none;
}textarea.tc-edit-texteditor {
font-family: ;
}canvas.tc-edit-bitmapeditor {
-webkit-box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5);
box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5);
}.tc-drop-down {
border-radius: 4px;
-webkit-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
}.tc-block-dropdown {
border-radius: 4px;
-webkit-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
}.tc-modal {
border-radius: 6px;
-webkit-box-shadow: 0 3px 7px rgba(0,0,0,0.3);
-moz-box-shadow: 0 3px 7px rgba(0,0,0,0.3);
box-shadow: 0 3px 7px rgba(0,0,0,0.3);
}.tc-modal-footer {
border-radius: 0 0 6px 6px;
-webkit-box-shadow: inset 0 1px 0 #fff;
-moz-box-shadow: inset 0 1px 0 #fff;
box-shadow: inset 0 1px 0 #fff;
;
}.tc-alert {
border-radius: 6px;
-webkit-box-shadow: 0 3px 7px rgba(0,0,0,0.6);
-moz-box-shadow: 0 3px 7px rgba(0,0,0,0.6);
box-shadow: 0 3px 7px rgba(0,0,0,0.6);
}.tc-notification {
border-radius: 6px;
-webkit-box-shadow: 0 3px 7px rgba(0,0,0,0.3);
-moz-box-shadow: 0 3px 7px rgba(0,0,0,0.3);
box-shadow: 0 3px 7px rgba(0,0,0,0.3);
text-shadow: 0 1px 0 rgba(255,255,255, 0.8);
}.tc-sidebar-lists .tc-tab-set .tc-tab-divider {
border-top: none;
height: 1px;
background-image: linear-gradient(left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%);
background-image: -o-linear-gradient(left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%);
background-image: -moz-linear-gradient(left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%);
background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%);
background-image: -ms-linear-gradient(left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%);
}.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {
background-image: linear-gradient(left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%);
background-image: -o-linear-gradient(left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%);
background-image: -moz-linear-gradient(left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%);
background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%);
background-image: -ms-linear-gradient(left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%);
}.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {
background-image: linear-gradient(left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%);
background-image: -o-linear-gradient(left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%);
background-image: -moz-linear-gradient(left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%);
background-image: -webkit-linear-gradient(left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%);
background-image: -ms-linear-gradient(left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%);
}.tc-message-box img {
-webkit-box-shadow: 1px 1px 3px rgba(0,0,0,0.5);
-moz-box-shadow: 1px 1px 3px rgba(0,0,0,0.5);
box-shadow: 1px 1px 3px rgba(0,0,0,0.5);
}.tc-plugin-info {
-webkit-box-shadow: 1px 1px 3px rgba(0,0,0,0.5);
-moz-box-shadow: 1px 1px 3px rgba(0,0,0,0.5);
box-shadow: 1px 1px 3px rgba(0,0,0,0.5);
}
/*
** Start with the normalize CSS reset, and then belay some of its effects
*//*! normalize.css v3.0.0 | MIT License | git.io/normalize */
/**
* 1. Set default font family to sans-serif.
* 2. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* Remove default margin.
*/
body {
margin: 0;
}
/* HTML5 display definitions
========================================================================== */
/**
* Correct `block` display not defined in IE 8/9.
*/
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary {
display: block;
}
/**
* 1. Correct `inline-block` display not defined in IE 8/9.
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
*/
audio,
canvas,
progress,
video {
display: inline-block; /* 1 */
vertical-align: baseline; /* 2 */
}
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Address `[hidden]` styling not present in IE 8/9.
* Hide the `template` element in IE, Safari, and Firefox < 22.
*/
[hidden],
template {
display: none;
}
/* Links
========================================================================== */
/**
* Remove the gray background color from active links in IE 10.
*/
a {
background: transparent;
}
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
a:active,
a:hover {
outline: 0;
}
/* Text-level semantics
========================================================================== */
/**
* Address styling not present in IE 8/9, Safari 5, and Chrome.
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
*/
b,
strong {
font-weight: bold;
}
/**
* Address styling not present in Safari 5 and Chrome.
*/
dfn {
font-style: italic;
}
/**
* Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari 5, and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/**
* Address styling not present in IE 8/9.
*/
mark {
background: #ff0;
color: #000;
}
/**
* Address inconsistent and variable font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* Embedded content
========================================================================== */
/**
* Remove border when inside `a` element in IE 8/9.
*/
img {
border: 0;
}
/**
* Correct overflow displayed oddly in IE 9.
*/
svg:not(:root) {
overflow: hidden;
}
/* Grouping content
========================================================================== */
/**
* Address margin not present in IE 8/9 and Safari 5.
*/
figure {
margin: 1em 40px;
}
/**
* Address differences between Firefox and other browsers.
*/
hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}
/**
* Contain overflow in all browsers.
*/
pre {
overflow: auto;
}
/**
* Address odd `em`-unit font size rendering in all browsers.
*/
code,
kbd,
pre,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
/* Forms
========================================================================== */
/**
* Known limitation: by default, Chrome and Safari on OS X allow very limited
* styling of `select`, unless a `border` property is set.
*/
/**
* 1. Correct color not being inherited.
* Known issue: affects color of disabled elements.
* 2. Correct font properties not being inherited.
* 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
*/
button,
input,
optgroup,
select,
textarea {
color: inherit; /* 1 */
font: inherit; /* 2 */
margin: 0; /* 3 */
}
/**
* Address `overflow` set to `hidden` in IE 8/9/10.
*/
button {
overflow: visible;
}
/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Firefox, IE 8+, and Opera
* Correct `select` style inheritance in Firefox.
*/
button,
select {
text-transform: none;
}
/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
*/
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
}
/**
* Re-set default cursor for disabled elements.
*/
button[disabled],
html input[disabled] {
cursor: default;
}
/**
* Remove inner padding and border in Firefox 4+.
*/
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
input {
line-height: normal;
}
/**
* It's recommended that you don't attempt to style these elements.
* Firefox's implementation doesn't respect box-sizing, padding, or width.
*
* 1. Address box sizing set to `content-box` in IE 8/9/10.
* 2. Remove excess padding in IE 8/9/10.
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
* `font-size` values of the `input`, it causes the cursor style of the
* decrement button to change from `default` to `text`.
*/
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
* (include `-moz` to future-proof).
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}
/**
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
* Safari (but not Chrome) clips the cancel button when the search input has
* padding (and `textfield` appearance).
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Define consistent border, margin, and padding.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct `color` not being inherited in IE 8/9.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/
legend {
border: 0; /* 1 */
padding: 0; /* 2 */
}
/**
* Remove default vertical scrollbar in IE 8/9.
*/
textarea {
overflow: auto;
}
/**
* Don't inherit the `font-weight` (applied by a rule above).
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
*/
optgroup {
font-weight: bold;
}
/* Tables
========================================================================== */
/**
* Remove most spacing between table cells.
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
td,
th {
padding: 0;
}
*, input[type="search"] {
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}html button {
line-height: 1.2;
color: ;
background: ;
border-color: ;
}/*
** Basic element styles
*/html {
font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", "DejaVu Sans", sans-serif;
text-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}html:-webkit-full-screen {
background-color: #ececec;
}body.tc-body {
font-size: 14px;
line-height: 20px;
word-wrap: break-word;
color: #333333;
background-color: #ececec;
fill: #333333;
}h1, h2, h3, h4, h5, h6 {
line-height: 1.2;
font-weight: 300;
}pre {
display: block;
padding: 14px;
margin-top: 1em;
margin-bottom: 1em;
word-break: normal;
word-wrap: break-word;
white-space: pre-wrap;
background-color: #f5f5f5;
border: 1px solid #cccccc;
padding: 0 3px 2px;
border-radius: 3px;
font-family: Monaco, Consolas, "Lucida Console", "DejaVu Sans Mono", monospace;
}code {
color: #dd1144;
background-color: #f7f7f9;
border: 1px solid #e1e1e8;
white-space: pre-wrap;
padding: 0 3px 2px;
border-radius: 3px;
font-family: Monaco, Consolas, "Lucida Console", "DejaVu Sans Mono", monospace;
}blockquote {
border-left: 5px solid #bbb;
margin-left: 25px;
padding-left: 10px;
quotes: "\201C""\201D""\2018""\2019";
}blockquote.tc-big-quote {
font-family: Georgia, serif;
position: relative;
background: #f5f5f5;
border-left: none;
margin-left: 50px;
margin-right: 50px;
padding: 10px;
border-radius: 8px;
}blockquote.tc-big-quote cite:before {
content: "\2014 \2009";
}blockquote.tc-big-quote:before {
font-family: Georgia, serif;
color: #bbb;
content: open-quote;
font-size: 8em;
line-height: 0.1em;
margin-right: 0.25em;
vertical-align: -0.4em;
position: absolute;
left: -50px;
top: 42px;
}blockquote.tc-big-quote:after {
font-family: Georgia, serif;
color: #bbb;
content: close-quote;
font-size: 8em;
line-height: 0.1em;
margin-right: 0.25em;
vertical-align: -0.4em;
position: absolute;
right: -80px;
bottom: -20px;
}dl dt {
font-weight: bold;
margin-top: 6px;
}textarea,
input[type=text],
input[type=search],
input[type=""],
input:not([type]) {
color: #333333;
background: #ffffff;
}.tc-muted {
color: #bbb;
}svg.tc-image-button {
padding: 0px 1px 1px 0px;
}.tc-icon-wrapper > svg {
width: 1em;
height: 1em;
}kbd {
display: inline-block;
padding: 3px 5px;
font-size: 0.8em;
line-height: 1.2;
color: #333333;
vertical-align: middle;
background-color: #ffffff;
border: solid 1px #bbb;
border-bottom-color: #bbb;
border-radius: 3px;
box-shadow: inset 0 -1px 0 #bbb;
}/*
Markdown likes putting code elements inside pre elements
*/
pre > code {
padding: 0;
border: none;
background-color: inherit;
color: inherit;
}table {
border: 1px solid #dddddd;
width: auto;
max-width: 100%;
caption-side: bottom;
margin-top: 1em;
margin-bottom: 1em;
}table th, table td {
padding: 0 7px 0 7px;
border-top: 1px solid #dddddd;
border-left: 1px solid #dddddd;
}table thead tr td, table th {
background-color: #f0f0f0;
font-weight: bold;
}table tfoot tr td {
background-color: #a8a8a8;
}.tc-csv-table {
white-space: nowrap;
}.tc-tiddler-frame img,
.tc-tiddler-frame svg,
.tc-tiddler-frame canvas,
.tc-tiddler-frame embed,
.tc-tiddler-frame iframe {
max-width: 100%;
}.tc-tiddler-body > embed,
.tc-tiddler-body > iframe {
width: 100%;
height: 600px;
}/*
** Links
*/button.tc-tiddlylink,
a.tc-tiddlylink {
text-decoration: none;
font-weight: normal;
color: #5778d8;
-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */
}.tc-sidebar-lists a.tc-tiddlylink {
color: #999999;
}.tc-sidebar-lists a.tc-tiddlylink:hover {
color: #444444;
}button.tc-tiddlylink:hover,
a.tc-tiddlylink:hover {
text-decoration: underline;
}a.tc-tiddlylink-resolves {
}a.tc-tiddlylink-shadow {
font-weight: bold;
}a.tc-tiddlylink-shadow.tc-tiddlylink-resolves {
font-weight: normal;
}a.tc-tiddlylink-missing {
font-style: italic;
}a.tc-tiddlylink-external {
text-decoration: underline;
color: #0000ee;
background-color: inherit;
}a.tc-tiddlylink-external:visited {
color: #0000aa;
background-color: inherit;
}a.tc-tiddlylink-external:hover {
color: inherit;
background-color: inherit;
}/*
** Drag and drop styles
*/.tc-tiddler-dragger {
position: relative;
z-index: -10000;
}.tc-tiddler-dragger-inner {
position: absolute;
top: -1000px;
left: -1000px;
display: inline-block;
padding: 8px 20px;
font-size: 16.9px;
font-weight: bold;
line-height: 20px;
color: #ffffff;
text-shadow: 0 1px 0 rgba(0, 0, 0, 1);
white-space: nowrap;
vertical-align: baseline;
background-color: #333333;
border-radius: 20px;
}.tc-tiddler-dragger-cover {
position: absolute;
background-color: #ececec;
}.tc-dropzone {
position: relative;
}.tc-dropzone.tc-dragover:before {
z-index: 10000;
display: block;
position: fixed;
top: 0;
left: 0;
right: 0;
background: rgba(0,200,0,0.7);
text-align: center;
content: "Drop here (or use the 'Escape' key to cancel)";
}.tc-droppable > .tc-droppable-placeholder {
display: none;
}.tc-droppable.tc-dragover > .tc-droppable-placeholder {
display: block;
border: 2px dashed rgba(0,200,0,0.7);
}.tc-draggable {
cursor: move;
}/*
** Plugin reload warning
*/.tc-plugin-reload-warning {
z-index: 1000;
display: block;
position: fixed;
top: 0;
left: 0;
right: 0;
background: #ffe476;
text-align: center;
}/*
** Buttons
*/button svg, button img, label svg, label img {
vertical-align: middle;
}.tc-btn-invisible {
padding: 0;
margin: 0;
background: none;
border: none;
cursor: pointer;
}.tc-btn-boxed {
font-size: 0.6em;
padding: 0.2em;
margin: 1px;
background: none;
border: 1px solid #cccccc;
border-radius: 0.25em;
}html body.tc-body .tc-btn-boxed svg {
font-size: 1.6666em;
}.tc-btn-boxed:hover {
background: #bbb;
color: #ffffff;
}html body.tc-body .tc-btn-boxed:hover svg {
fill: #ffffff;
}.tc-btn-rounded {
font-size: 0.5em;
line-height: 2;
padding: 0em 0.3em 0.2em 0.4em;
margin: 1px;
border: 1px solid #bbb;
background: #bbb;
color: #ffffff;
border-radius: 2em;
}html body.tc-body .tc-btn-rounded svg {
font-size: 1.6666em;
fill: #ffffff;
}.tc-btn-rounded:hover {
border: 1px solid #bbb;
background: #ffffff;
color: #bbb;
}html body.tc-body .tc-btn-rounded:hover svg {
fill: #bbb;
}.tc-btn-icon svg {
height: 1em;
width: 1em;
fill: #bbb;
}.tc-btn-text {
padding: 0;
margin: 0;
}.tc-btn-big-green {
display: inline-block;
padding: 8px;
margin: 4px 8px 4px 8px;
background: #34c734;
color: #ffffff;
fill: #ffffff;
border: none;
font-size: 1.2em;
line-height: 1.4em;
text-decoration: none;
}.tc-btn-big-green svg,
.tc-btn-big-green img {
height: 2em;
width: 2em;
vertical-align: middle;
fill: #ffffff;
}.tc-sidebar-lists input {
color: #333333;
}.tc-sidebar-lists button {
color: #333333;
fill: #333333;
}.tc-sidebar-lists button.tc-btn-mini {
color: #c0c0c0;
}.tc-sidebar-lists button.tc-btn-mini:hover {
color: #444444;
}button svg.tc-image-button, button .tc-image-button img {
height: 1em;
width: 1em;
}.tc-unfold-banner {
position: absolute;
padding: 0;
margin: 0;
background: none;
border: none;
width: 100%;
width: calc(100% + 2px);
margin-left: -43px;
text-align: center;
border-top: 2px solid #f8f8f8;
margin-top: 4px;
}.tc-unfold-banner:hover {
background: #f8f8f8;
border-top: 2px solid #dddddd;
}.tc-unfold-banner svg, .tc-fold-banner svg {
height: 0.75em;
fill: #cccccc;
}.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {
fill: #888888;
}.tc-fold-banner {
position: absolute;
padding: 0;
margin: 0;
background: none;
border: none;
width: 23px;
text-align: center;
margin-left: -35px;
top: 6px;
bottom: 6px;
}.tc-fold-banner:hover {
background: #f8f8f8;
}@media (max-width: 960px) {.tc-unfold-banner {
position: static;
width: calc(100% + 59px);
}.tc-fold-banner {
width: 16px;
margin-left: -16px;
font-size: 0.75em;
}}/*
** Tags and missing tiddlers
*/.tc-tag-list-item {
position: relative;
display: inline-block;
margin-right: 7px;
}.tc-tags-wrapper {
margin: 4px 0 14px 0;
}.tc-missing-tiddler-label {
font-style: italic;
font-weight: normal;
display: inline-block;
font-size: 11.844px;
line-height: 14px;
white-space: nowrap;
vertical-align: baseline;
}button.tc-tag-label, span.tc-tag-label {
display: inline-block;
padding: 0.16em 0.7em;
font-size: 0.9em;
font-weight: 400;
line-height: 1.2em;
color: #ffffff;
white-space: nowrap;
vertical-align: baseline;
background-color: #7777ee;
border-radius: 1em;
}.tc-untagged-separator {
width: 10em;
left: 0;
margin-left: 0;
border: 0;
height: 1px;
background: #d8d8d8;
}button.tc-untagged-label {
background-color: #999999;
}.tc-tag-label svg, .tc-tag-label img {
height: 1em;
width: 1em;
fill: #ffffff;
vertical-align: text-bottom;
}.tc-tag-manager-table .tc-tag-label {
white-space: normal;
}.tc-tag-manager-tag {
width: 100%;
}/*
** Page layout
*/.tc-topbar {
position: fixed;
z-index: 1200;
}.tc-topbar-left {
left: 29px;
top: 5px;
}.tc-topbar-right {
top: 5px;
right: 29px;
}.tc-topbar button {
padding: 8px;
}.tc-topbar svg {
fill: #bbb;
}.tc-topbar button:hover svg {
fill: #333333;
}.tc-sidebar-header {
color: #acacac;
fill: #acacac;
}.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {
font-weight: 300;
}.tc-sidebar-header .tc-sidebar-lists p {
margin-top: 3px;
margin-bottom: 3px;
}.tc-sidebar-header .tc-missing-tiddler-label {
color: #acacac;
}.tc-advanced-search input {
width: 60%;
}.tc-search a svg {
width: 1.2em;
height: 1.2em;
vertical-align: middle;
}.tc-page-controls {
margin-top: 14px;
font-size: 1.5em;
}.tc-page-controls button {
margin-right: 0.5em;
}.tc-page-controls a.tc-tiddlylink:hover {
text-decoration: none;
}.tc-page-controls img {
width: 1em;
}.tc-page-controls svg {
fill: #aaaaaa;
}.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {
fill: #000000;
}.tc-menu-list-item {
white-space: nowrap;
}.tc-menu-list-count {
font-weight: bold;
}.tc-menu-list-subitem {
padding-left: 7px;
}.tc-story-river {
position: relative;
}@media (max-width: 960px) {.tc-sidebar-header {
padding: 14px;
min-height: 32px;
margin-top: 0px;
}.tc-story-river {
position: relative;
padding: 0;
}
}@media (min-width: 960px) {.tc-message-box {
margin: 21px -21px 21px -21px;
}.tc-sidebar-scrollable {
position: fixed;
top: 0px;
left: 770px;
bottom: 0;
right: 0;
overflow-y: auto;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
margin: 0 0 0 -42px;
padding: 71px 0 28px 42px;
}html[dir="rtl"] .tc-sidebar-scrollable {
left: auto;
right: 770px;
}.tc-story-river {
position: relative;
left: 0px;
top: 0px;
width: 770px;
padding: 42px 42px 42px 42px;
}}@media print {body.tc-body {
background-color: transparent;
}.tc-sidebar-header, .tc-topbar {
display: none;
}.tc-story-river {
margin: 0;
padding: 0;
}.tc-story-river .tc-tiddler-frame {
margin: 0;
border: none;
padding: 0;
}
}/*
** Tiddler styles
*/.tc-tiddler-frame {
position: relative;
margin-bottom: 28px;
background-color: #ffffff;
border: 1px solid #ffffff;
}
.tc-tiddler-info {
padding: 14px 42px 14px 42px;
background-color: #f8f8f8;
border-top: 1px solid #dddddd;
border-bottom: 1px solid #dddddd;
}.tc-tiddler-info p {
margin-top: 3px;
margin-bottom: 3px;
}.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {
background-color: #f8f8f8;
border-bottom: 1px solid #f8f8f8;
}.tc-view-field-table {
width: 100%;
}.tc-view-field-name {
width: 1%; /* Makes this column be as narrow as possible */
text-align: right;
font-style: italic;
font-weight: 200;
}.tc-view-field-value {
}@media (max-width: 960px) {
.tc-tiddler-frame {
padding: 14px 14px 14px 14px;
}.tc-tiddler-info {
margin: 0 -14px 0 -14px;
}
}@media (min-width: 960px) {
.tc-tiddler-frame {
padding: 28px 42px 42px 42px;
width: 686px;
border-radius: 2px;
}.tc-tiddler-info {
margin: 0 -42px 0 -42px;
}
}.tc-site-title,
.tc-titlebar {
font-weight: 300;
font-size: 2.35em;
line-height: 1.2em;
color: #182955;
margin: 0;
}.tc-site-title {
color: #182955;
}.tc-tiddler-title-icon {
vertical-align: middle;
}.tc-system-title-prefix {
color: #bbb;
}.tc-titlebar h2 {
font-size: 1em;
display: inline;
}.tc-titlebar img {
height: 1em;
}.tc-subtitle {
font-size: 0.9em;
color: #c0c0c0;
font-weight: 300;
}.tc-tiddler-missing .tc-title {
font-style: italic;
font-weight: normal;
}.tc-tiddler-frame .tc-tiddler-controls {
float: right;
}.tc-tiddler-controls .tc-drop-down {
font-size: 0.6em;
}.tc-tiddler-controls .tc-drop-down .tc-drop-down {
font-size: 1em;
}.tc-tiddler-controls > span > button,
.tc-tiddler-controls > span > span > button,
.tc-tiddler-controls > span > span > span > button {
vertical-align: baseline;
margin-left:5px;
}.tc-tiddler-controls button svg, .tc-tiddler-controls button img,
.tc-search button svg, .tc-search a svg {
fill: #cccccc;
}.tc-tiddler-controls button svg, .tc-tiddler-controls button img {
height: 0.75em;
}.tc-search button svg, .tc-search a svg {
height: 1.2em;
width: 1.2em;
margin: 0 0.25em;
}.tc-tiddler-controls button.tc-selected svg,
.tc-page-controls button.tc-selected svg {
fill: #444444;
}.tc-tiddler-controls button.tc-btn-invisible:hover svg,
.tc-search button:hover svg, .tc-search a:hover svg {
fill: #888888;
}@media print {
.tc-tiddler-controls {
display: none;
}
}.tc-tiddler-help { /* Help prompts within tiddler template */
color: #bbb;
margin-top: 14px;
}.tc-tiddler-help a.tc-tiddlylink {
color: #888888;
}.tc-tiddler-frame .tc-edit-texteditor {
width: 100%;
margin: 4px 0 4px 0;
}.tc-tiddler-frame input.tc-edit-texteditor,
.tc-tiddler-frame textarea.tc-edit-texteditor,
.tc-tiddler-frame iframe.tc-edit-texteditor {
padding: 3px 3px 3px 3px;
border: 1px solid #cccccc;
background-color: #f8f8f8;
line-height: 1.3em;
-webkit-appearance: none;
font-family: ;
}.tc-tiddler-frame .tc-binary-warning {
width: 100%;
height: 5em;
text-align: center;
padding: 3em 3em 6em 3em;
background: #ffe476;
border: 1px solid #b99e2f;
}canvas.tc-edit-bitmapeditor {
border: 6px solid #ffffff;
cursor: crosshair;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
margin-top: 6px;
margin-bottom: 6px;
}.tc-edit-bitmapeditor-width {
display: block;
}.tc-edit-bitmapeditor-height {
display: block;
}.tc-tiddler-body {
clear: both;
}.tc-tiddler-frame .tc-tiddler-body {
font-size: 15px;
line-height: 22px;
}.tc-titlebar, .tc-tiddler-edit-title {
overflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */
}html body.tc-body.tc-single-tiddler-window {
margin: 1em;
background: #ffffff;
}.tc-single-tiddler-window img,
.tc-single-tiddler-window svg,
.tc-single-tiddler-window canvas,
.tc-single-tiddler-window embed,
.tc-single-tiddler-window iframe {
max-width: 100%;
}/*
** Editor
*/.tc-editor-toolbar {
margin-top: 8px;
}.tc-editor-toolbar button {
vertical-align: middle;
background-color: #cccccc;
fill: #444444;
border-radius: 4px;
padding: 3px;
margin: 2px 0 2px 4px;
}.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {
margin-left: 1px;
width: 1em;
border-radius: 8px;
}.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {
margin-left: 11px;
}.tc-editor-toolbar button.tc-selected {
background-color: #5778d8;
}.tc-editor-toolbar button svg {
width: 1.6em;
height: 1.2em;
}.tc-editor-toolbar button:hover {
background-color: #444444;
fill: #ffffff;
}.tc-editor-toolbar .tc-text-editor-toolbar-more {
white-space: normal;
}.tc-editor-toolbar .tc-text-editor-toolbar-more button {
display: inline-block;
padding: 3px;
width: auto;
}.tc-editor-toolbar .tc-search-results {
padding: 0;
}/*
** Adjustments for fluid-fixed mode
*/@media (min-width: 960px) {}/*
** Toolbar buttons
*/.tc-page-controls svg.tc-image-new-button {
fill: ;
}.tc-page-controls svg.tc-image-options-button {
fill: ;
}.tc-page-controls svg.tc-image-save-button {
fill: ;
}.tc-tiddler-controls button svg.tc-image-info-button {
fill: ;
}.tc-tiddler-controls button svg.tc-image-edit-button {
fill: ;
}.tc-tiddler-controls button svg.tc-image-close-button {
fill: ;
}.tc-tiddler-controls button svg.tc-image-delete-button {
fill: ;
}.tc-tiddler-controls button svg.tc-image-cancel-button {
fill: ;
}.tc-tiddler-controls button svg.tc-image-done-button {
fill: ;
}/*
** Tiddler edit mode
*/.tc-tiddler-edit-frame em.tc-edit {
color: #bbb;
font-style: normal;
}.tc-edit-type-dropdown a.tc-tiddlylink-missing {
font-style: normal;
}.tc-edit-tags {
border: 1px solid #cccccc;
padding: 4px 8px 4px 8px;
}.tc-edit-add-tag {
display: inline-block;
}.tc-edit-add-tag .tc-add-tag-name input {
width: 50%;
}.tc-edit-add-tag .tc-keyboard {
display:inline;
}.tc-edit-tags .tc-tag-label {
display: inline-block;
}.tc-edit-tags-list {
margin: 14px 0 14px 0;
}.tc-remove-tag-button {
padding-left: 4px;
}.tc-tiddler-preview {
overflow: auto;
}.tc-tiddler-preview-preview {
float: right;
width: 49%;
border: 1px solid #cccccc;
margin: 4px 0 3px 3px;
padding: 3px 3px 3px 3px;
}.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {
width: 49%;
}.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {
max-width: 49%;
}.tc-edit-fields {
width: 100%;
}.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {
border: none;
padding: 4px;
}.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {
background-color: #f0f4f0;
}.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {
background-color: #e0e8e0;
}.tc-edit-field-name {
text-align: right;
}.tc-edit-field-value input {
width: 100%;
}.tc-edit-field-remove {
}.tc-edit-field-remove svg {
height: 1em;
width: 1em;
fill: #bbb;
vertical-align: middle;
}.tc-edit-field-add-name {
display: inline-block;
width: 15%;
}.tc-edit-field-add-value {
display: inline-block;
width: 40%;
}.tc-edit-field-add-button {
display: inline-block;
width: 10%;
}/*
** Storyview Classes
*/.tc-storyview-zoomin-tiddler {
position: absolute;
display: block;
width: 100%;
}@media (min-width: 960px) {.tc-storyview-zoomin-tiddler {
width: calc(100% - 84px);
}}/*
** Dropdowns
*/.tc-btn-dropdown {
text-align: left;
}.tc-btn-dropdown svg, .tc-btn-dropdown img {
height: 1em;
width: 1em;
fill: #bbb;
}.tc-drop-down-wrapper {
position: relative;
}.tc-drop-down {
min-width: 380px;
border: 1px solid #bbb;
background-color: #ffffff;
padding: 7px 0 7px 0;
margin: 4px 0 0 0;
white-space: nowrap;
text-shadow: none;
line-height: 1.4;
}.tc-drop-down .tc-drop-down {
margin-left: 14px;
}.tc-drop-down button svg, .tc-drop-down a svg {
fill: #333333;
}.tc-drop-down button.tc-btn-invisible:hover svg {
fill: #333333;
}.tc-drop-down p {
padding: 0 14px 0 14px;
}.tc-drop-down svg {
width: 1em;
height: 1em;
}.tc-drop-down img {
width: 1em;
}.tc-drop-down-language-chooser img {
width: 2em;
vertical-align: baseline;
}.tc-drop-down a, .tc-drop-down button {
display: block;
padding: 0 14px 0 14px;
width: 100%;
text-align: left;
color: #333333;
line-height: 1.4;
}.tc-drop-down .tc-tab-set .tc-tab-buttons button {
display: inline-block;
width: auto;
margin-bottom: 0px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}.tc-drop-down .tc-prompt {
padding: 0 14px;
}.tc-drop-down .tc-chooser {
border: none;
}.tc-drop-down .tc-chooser .tc-swatches-horiz {
font-size: 0.4em;
padding-left: 1.2em;
}.tc-drop-down .tc-file-input-wrapper {
width: 100%;
}.tc-drop-down .tc-file-input-wrapper button {
color: #333333;
}.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {
color: #ffffff;
background-color: #5778d8;
text-decoration: none;
}.tc-drop-down .tc-tab-buttons button {
background-color: #ececec;
}.tc-drop-down .tc-tab-buttons button.tc-tab-selected {
background-color: #fff;
border-bottom: 1px solid #fff;
}.tc-drop-down-bullet {
display: inline-block;
width: 0.5em;
}.tc-drop-down .tc-tab-contents a {
padding: 0 0.5em 0 0.5em;
}.tc-block-dropdown-wrapper {
position: relative;
}.tc-block-dropdown {
position: absolute;
min-width: 220px;
border: 1px solid #bbb;
background-color: #ffffff;
padding: 7px 0;
margin: 4px 0 0 0;
white-space: nowrap;
z-index: 1000;
text-shadow: none;
}.tc-block-dropdown.tc-search-drop-down {
margin-left: -12px;
}.tc-block-dropdown a {
display: block;
padding: 4px 14px 4px 14px;
}.tc-block-dropdown.tc-search-drop-down a {
display: block;
padding: 0px 10px 0px 10px;
}.tc-drop-down .tc-dropdown-item-plain,
.tc-block-dropdown .tc-dropdown-item-plain {
padding: 4px 14px 4px 7px;
}.tc-drop-down .tc-dropdown-item,
.tc-block-dropdown .tc-dropdown-item {
padding: 4px 14px 4px 7px;
color: #bbb;
}.tc-block-dropdown a:hover {
color: #ffffff;
background-color: #5778d8;
text-decoration: none;
}.tc-search-results {
padding: 0 7px 0 7px;
}.tc-image-chooser, .tc-colour-chooser {
white-space: normal;
}.tc-image-chooser a,
.tc-colour-chooser a {
display: inline-block;
vertical-align: top;
text-align: center;
position: relative;
}.tc-image-chooser a {
border: 1px solid #bbb;
padding: 2px;
margin: 2px;
width: 4em;
height: 4em;
}.tc-colour-chooser a {
padding: 3px;
width: 2em;
height: 2em;
vertical-align: middle;
}.tc-image-chooser a:hover,
.tc-colour-chooser a:hover {
background: #5778d8;
padding: 0px;
border: 3px solid #5778d8;
}.tc-image-chooser a svg,
.tc-image-chooser a img {
display: inline-block;
width: auto;
height: auto;
max-width: 3.5em;
max-height: 3.5em;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}/*
** Modals
*/.tc-modal-wrapper {
position: fixed;
overflow: auto;
overflow-y: scroll;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 900;
}.tc-modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1000;
background-color: #333333;
}.tc-modal {
z-index: 1100;
background-color: #ffffff;
border: 1px solid #999999;
}@media (max-width: 55em) {
.tc-modal {
position: fixed;
top: 1em;
left: 1em;
right: 1em;
}.tc-modal-body {
overflow-y: auto;
max-height: 400px;
max-height: 60vh;
}
}@media (min-width: 55em) {
.tc-modal {
position: fixed;
top: 2em;
left: 25%;
width: 50%;
}.tc-modal-body {
overflow-y: auto;
max-height: 400px;
max-height: 60vh;
}
}.tc-modal-header {
padding: 9px 15px;
border-bottom: 1px solid #eeeeee;
}.tc-modal-header h3 {
margin: 0;
line-height: 30px;
}.tc-modal-header img, .tc-modal-header svg {
width: 1em;
height: 1em;
}.tc-modal-body {
padding: 15px;
}.tc-modal-footer {
padding: 14px 15px 15px;
margin-bottom: 0;
text-align: right;
background-color: #f5f5f5;
border-top: 1px solid #dddddd;
}/*
** Notifications
*/.tc-notification {
position: fixed;
top: 14px;
right: 42px;
z-index: 1300;
max-width: 280px;
padding: 0 14px 0 14px;
background-color: #ffffdd;
border: 1px solid #999999;
}/*
** Tabs
*/.tc-tab-set.tc-vertical {
display: -webkit-flex;
display: flex;
}.tc-tab-buttons {
font-size: 0.85em;
padding-top: 1em;
margin-bottom: -2px;
}.tc-tab-buttons.tc-vertical {
z-index: 100;
display: block;
padding-top: 14px;
vertical-align: top;
text-align: right;
margin-bottom: inherit;
margin-right: -1px;
max-width: 33%;
-webkit-flex: 0 0 auto;
flex: 0 0 auto;
}.tc-tab-buttons button.tc-tab-selected {
color: #666666;
background-color: #ffffff;
border-left: 1px solid #d8d8d8;
border-top: 1px solid #d8d8d8;
border-right: 1px solid #d8d8d8;
}.tc-tab-buttons button {
color: #666666;
padding: 3px 5px 3px 5px;
margin-right: 0.3em;
font-weight: 300;
border: none;
background: inherit;
background-color: #d8d8d8;
border-left: 1px solid #cccccc;
border-top: 1px solid #cccccc;
border-right: 1px solid #cccccc;
border-top-left-radius: 2px;
border-top-right-radius: 2px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}.tc-tab-buttons.tc-vertical button {
display: block;
width: 100%;
margin-top: 3px;
margin-right: 0;
text-align: right;
background-color: #d8d8d8;
border-left: 1px solid #cccccc;
border-bottom: 1px solid #cccccc;
border-right: none;
border-top-left-radius: 2px;
border-bottom-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}.tc-tab-buttons.tc-vertical button.tc-tab-selected {
background-color: #ffffff;
border-right: 1px solid #ffffff;
}.tc-tab-divider {
border-top: 1px solid #d8d8d8;
}.tc-tab-divider.tc-vertical {
display: none;
}.tc-tab-content {
margin-top: 14px;
}.tc-tab-content.tc-vertical {
display: inline-block;
vertical-align: top;
padding-top: 0;
padding-left: 14px;
border-left: 1px solid #cccccc;
-webkit-flex: 1 0 70%;
flex: 1 0 70%;
}.tc-sidebar-lists .tc-tab-buttons {
margin-bottom: -1px;
}.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {
background-color: #ececec;
color: ;
border-left: 1px solid #d8d8d8;
border-top: 1px solid #d8d8d8;
border-right: 1px solid #d8d8d8;
}.tc-sidebar-lists .tc-tab-buttons button {
background-color: #d8d8d8;
color: #666666;
border-left: 1px solid #cccccc;
border-top: 1px solid #cccccc;
border-right: 1px solid #cccccc;
}.tc-sidebar-lists .tc-tab-divider {
border-top: 1px solid #e4e4e4;
}.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {
display: block;
width: 100%;
background-color: #d8d8d8;
border-top: none;
border-left: none;
border-bottom: none;
border-right: 1px solid #ccc;
margin-bottom: inherit;
}.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {
background-color: #ececec;
border: none;
}/*
** Manager
*/.tc-manager-wrapper {
}.tc-manager-controls {
}.tc-manager-control {
margin: 0.5em 0;
}.tc-manager-list {
width: 100%;
border-top: 1px solid #bbb;
border-left: 1px solid #bbb;
border-right: 1px solid #bbb;
}.tc-manager-list-item {}.tc-manager-list-item-heading {
display: block;
width: 100%;
text-align: left;
border-bottom: 1px solid #bbb;
padding: 3px;
}.tc-manager-list-item-heading-selected {
font-weight: bold;
color: #ffffff;
fill: #ffffff;
background-color: #333333;
}.tc-manager-list-item-heading:hover {
background: #5778d8;
color: #ffffff;
}.tc-manager-list-item-content {
display: flex;
}.tc-manager-list-item-content-sidebar {
flex: 1 0;
background: #f8f8f8;
border-right: 0.5em solid #bbb;
border-bottom: 0.5em solid #bbb;
white-space: nowrap;
}.tc-manager-list-item-content-item-heading {
display: block;
width: 100%;
text-align: left;
background: #bbb;
text-transform: uppercase;
font-size: 0.6em;
font-weight: bold;
padding: 0.5em 0 0.5em 0;
}.tc-manager-list-item-content-item-body {
padding: 0 0.5em 0 0.5em;
}.tc-manager-list-item-content-item-body > pre {
margin: 0.5em 0 0.5em 0;
border: none;
background: inherit;
}.tc-manager-list-item-content-tiddler {
flex: 3 1;
border-left: 0.5em solid #bbb;
border-right: 0.5em solid #bbb;
border-bottom: 0.5em solid #bbb;
}.tc-manager-list-item-content-item-body > table {
border: none;
padding: 0;
margin: 0;
}.tc-manager-list-item-content-item-body > table td {
border: none;
}.tc-manager-icon-editor > button {
width: 100%;
}.tc-manager-icon-editor > button > svg,
.tc-manager-icon-editor > button > button {
width: 100%;
height: auto;
}/*
** Alerts
*/.tc-alerts {
position: fixed;
top: 0;
left: 0;
max-width: 500px;
z-index: 20000;
}.tc-alert {
position: relative;
margin: 28px;
padding: 14px 14px 14px 14px;
border: 2px solid #b99e2f;
background-color: #ffe476;
}.tc-alert-toolbar {
position: absolute;
top: 14px;
right: 14px;
}.tc-alert-toolbar svg {
fill: #b99e2f;
}.tc-alert-subtitle {
color: #b99e2f;
font-weight: bold;
}.tc-alert-highlight {
color: #881122;
}@media (min-width: 960px) {.tc-static-alert {
position: relative;
}.tc-static-alert-inner {
position: absolute;
z-index: 100;
}}.tc-static-alert-inner {
padding: 0 2px 2px 42px;
color: #aaaaaa;
}/*
** Control panel
*/.tc-control-panel td {
padding: 4px;
}.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {
width: 100%;
}.tc-plugin-info {
display: block;
border: 1px solid #bbb;
background-colour: #ffffff;
margin: 0.5em 0 0.5em 0;
padding: 4px;
}.tc-plugin-info-disabled {
background: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);
background: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);
}.tc-plugin-info-disabled:hover {
background: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);
background: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);
}a.tc-tiddlylink.tc-plugin-info:hover {
text-decoration: none;
background-color: #5778d8;
color: #ffffff;
fill: #333333;
}a.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > svg {
fill: #333333;
}.tc-plugin-info-chunk {
display: inline-block;
vertical-align: middle;
}.tc-plugin-info-chunk h1 {
font-size: 1em;
margin: 2px 0 2px 0;
}.tc-plugin-info-chunk h2 {
font-size: 0.8em;
margin: 2px 0 2px 0;
}.tc-plugin-info-chunk div {
font-size: 0.7em;
margin: 2px 0 2px 0;
}.tc-plugin-info:hover > .tc-plugin-info-chunk > img, .tc-plugin-info:hover > .tc-plugin-info-chunk > svg {
width: 2em;
height: 2em;
fill: #333333;
}.tc-plugin-info > .tc-plugin-info-chunk > img, .tc-plugin-info > .tc-plugin-info-chunk > svg {
width: 2em;
height: 2em;
fill: #bbb;
}.tc-plugin-info.tc-small-icon > .tc-plugin-info-chunk > img, .tc-plugin-info.tc-small-icon > .tc-plugin-info-chunk > svg {
width: 1em;
height: 1em;
}.tc-plugin-info-dropdown {
border: 1px solid #bbb;
margin-top: -8px;
}.tc-plugin-info-dropdown-message {
background: #ecf2ff;
padding: 0.5em 1em 0.5em 1em;
font-weight: bold;
font-size: 0.8em;
}.tc-plugin-info-dropdown-body {
padding: 1em 1em 1em 1em;
}/*
** Message boxes
*/.tc-message-box {
border: 1px solid #cfd6e6;
background: #ecf2ff;
padding: 0px 21px 0px 21px;
font-size: 12px;
line-height: 18px;
color: #547599;
}.tc-message-box svg {
width: 1em;
height: 1em;
vertical-align: text-bottom;
}/*
** Pictures
*/.tc-bordered-image {
border: 1px solid #bbb;
padding: 5px;
margin: 5px;
}/*
** Floats
*/.tc-float-right {
float: right;
}/*
** Chooser
*/.tc-chooser {
border: 1px solid #dddddd;
}.tc-chooser-item {
border: 8px;
padding: 2px 4px;
}.tc-chooser-item a.tc-tiddlylink {
display: block;
text-decoration: none;
color: #5778d8;
background-color: #ffffff;
}.tc-chooser-item a.tc-tiddlylink:hover {
text-decoration: none;
color: #ffffff;
background-color: #5778d8;
}/*
** Palette swatches
*/.tc-swatches-horiz {
}.tc-swatches-horiz .tc-swatch {
display: inline-block;
}.tc-swatch {
width: 2em;
height: 2em;
margin: 0.4em;
border: 1px solid #888;
}/*
** Table of contents
*/.tc-sidebar-lists .tc-table-of-contents {
white-space: nowrap;
}.tc-table-of-contents button {
color: #acacac;
}.tc-table-of-contents svg {
width: 0.7em;
height: 0.7em;
vertical-align: middle;
fill: #acacac;
}.tc-table-of-contents ol {
list-style-type: none;
padding-left: 0;
}.tc-table-of-contents ol ol {
padding-left: 1em;
}.tc-table-of-contents li {
font-size: 1.0em;
font-weight: bold;
}.tc-table-of-contents li a {
font-weight: bold;
}.tc-table-of-contents li li {
font-size: 0.95em;
font-weight: normal;
line-height: 1.4;
}.tc-table-of-contents li li a {
font-weight: normal;
}.tc-table-of-contents li li li {
font-size: 0.95em;
font-weight: 200;
line-height: 1.5;
}.tc-table-of-contents li li li a {
font-weight: bold;
}.tc-table-of-contents li li li li {
font-size: 0.95em;
font-weight: 200;
}.tc-tabbed-table-of-contents {
display: -webkit-flex;
display: flex;
}.tc-tabbed-table-of-contents .tc-table-of-contents {
z-index: 100;
display: inline-block;
padding-left: 1em;
max-width: 50%;
-webkit-flex: 0 0 auto;
flex: 0 0 auto;
background: #d8d8d8;
border-left: 1px solid #cccccc;
border-top: 1px solid #cccccc;
border-bottom: 1px solid #cccccc;
}.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,
.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {
display: block;
padding: 0.12em 1em 0.12em 0.25em;
}.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {
border-top: 1px solid #d8d8d8;
border-left: 1px solid #d8d8d8;
border-bottom: 1px solid #d8d8d8;
}.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {
text-decoration: none;
border-top: 1px solid #cccccc;
border-left: 1px solid #cccccc;
border-bottom: 1px solid #cccccc;
background: #cccccc;
}.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {
border-top: 1px solid #cccccc;
border-left: 1px solid #cccccc;
border-bottom: 1px solid #cccccc;
background: #ffffff;
margin-right: -1px;
}.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {
text-decoration: none;
}.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {
display: inline-block;
vertical-align: top;
padding-left: 1.5em;
padding-right: 1.5em;
border: 1px solid #cccccc;
-webkit-flex: 1 0 50%;
flex: 1 0 50%;
}/*
** Dirty indicator
*/body.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {
fill: #ff0000;
color: #ff0000;
}/*
** File inputs
*/.tc-file-input-wrapper {
position: relative;
overflow: hidden;
display: inline-block;
vertical-align: middle;
}.tc-file-input-wrapper input[type=file] {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
font-size: 999px;
max-width: 100%;
max-height: 100%;
filter: alpha(opacity=0);
opacity: 0;
outline: none;
background: white;
cursor: pointer;
display: inline-block;
}/*
** Thumbnail macros
*/.tc-thumbnail-wrapper {
position: relative;
display: inline-block;
margin: 6px;
vertical-align: top;
}.tc-thumbnail-right-wrapper {
float:right;
margin: 0.5em 0 0.5em 0.5em;
}.tc-thumbnail-image {
text-align: center;
overflow: hidden;
border-radius: 3px;
}.tc-thumbnail-image svg,
.tc-thumbnail-image img {
filter: alpha(opacity=1);
opacity: 1;
min-width: 100%;
min-height: 100%;
max-width: 100%;
}.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,
.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {
filter: alpha(opacity=0.8);
opacity: 0.8;
}.tc-thumbnail-background {
position: absolute;
border-radius: 3px;
}.tc-thumbnail-icon svg,
.tc-thumbnail-icon img {
width: 3em;
height: 3em;
-webkit-filter: drop-shadow(2px 2px 4px rgba(0,0,0,0.3));
-moz-filter: drop-shadow(2px 2px 4px rgba(0,0,0,0.3));
filter: drop-shadow(2px 2px 4px rgba(0,0,0,0.3));
}.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,
.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {
fill: #fff;
-webkit-filter: drop-shadow(3px 3px 4px rgba(0,0,0,0.6));
-moz-filter: drop-shadow(3px 3px 4px rgba(0,0,0,0.6));
filter: drop-shadow(3px 3px 4px rgba(0,0,0,0.6));
}.tc-thumbnail-icon {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: -webkit-flex;
-webkit-align-items: center;
-webkit-justify-content: center;
display: flex;
align-items: center;
justify-content: center;
}.tc-thumbnail-caption {
position: absolute;
background-color: #777;
color: #fff;
text-align: center;
bottom: 0;
width: 100%;
filter: alpha(opacity=0.9);
opacity: 0.9;
line-height: 1.4;
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
}.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {
filter: alpha(opacity=1);
opacity: 1;
}/*
** Errors
*/.tc-error {
background: #f00;
color: #fff;
}/*
** Tree macro
*/.tc-tree div {
padding-left: 14px;
}.tc-tree ol {
list-style-type: none;
padding-left: 0;
margin-top: 0;
}.tc-tree ol ol {
padding-left: 1em;
}.tc-tree button {
color: #acacac;
}.tc-tree svg {
fill: #acacac;
}.tc-tree span svg {
width: 1em;
height: 1em;
vertical-align: baseline;
}.tc-tree li span {
color: lightgray;
}
.tc-tiddler-body {
clear: both;
}
.float-right {
float:right;
}
/* LINKS */
a{
-webkit-transition: 200ms;
-moz-transition: 200ms;
-o-transition: 200ms;
transition: 200ms;
}
a.tc-tiddlylink-shadow {
color:#567;
font-weight:normal;
}
a.tc-tiddlylink-resolves.tc-tiddlylink-shadow {
font-weight:bold;
}
.redirected {
color:#dd1144;
}
.tb-links dd span:not(:last-child):after{
content:", ";
}
.tb-links > span:not(:last-child):after{
content:", ";
}
.tb-links > a:not(:last-child):after{
content:", ";
}
/* TITLE */
.tc-tiddler-title-icon > svg{
fill:#bbb;
}
.title-popup > p {
margin:7px 3px;
}
.title-popup a {
margin:3px 0;
display:block;
}
.tc-tiddler-title .title-popup a {
font-size:0.5em;
}
.btn-title-popup {
color:#ccc;
border-bottom:0 !important;
margin: 0 -.4em;
padding: 0 .4em;
}
/* TAGLIST */
.tb-taglist-columns{
column-count: 4;
-moz-column-count: 4;
-webkit-column-count: 4;
}
.tb-taglist .tb-taglist-item{
width:145px;
}
.tb-taglist-columns .tb-taglist-item{
width:auto;
display:block;
}
.tb-taglist .tc-menu-list-count,
.tb-taglist-columns .tc-menu-list-count{
margin-left:-10px;
display:inline-block;
width:25px;
text-align:right;
}
.tb-taglist-item{
display:inline-block;
padding-top:5px;
}
.list-tags {
float:right;
font-weight:normal;
color:#ccc;
}
/* TIMELINE */
.tb-timeline-item{
margin:2px -5px 5px -5px;
padding:2px 5px 5px 5px;
}
.tb-timeline-item:hover{
background: #f3f3f3;
}
.tb-timeline-date{
float:right;
color:#ccf;
font-size:0.8em;
}
.tb-timeline-tags {
color:#ccc;
}
.tb-timeline-tags button {
font-size:0.8em;
}
.tb-timeline-tags .tc-tag-list-item {
margin-right: 3px;
}
/* TABLES */
tr, td, th {
vertical-align:top;
}
.no-border,
.no-border th,
.no-border tr,
.no-border td {
border:0;
}
/* DEFINITIONS */
dl:not(.tb5-markup){
margin:0;
}
dd{
margin-left:14px;
}
dd:before{
content: "» ";
}
.no-before:before{
content:none;
}
/* SLIDERS */
div.slider-contents{
padding: 5px;
border: 1px solid #eee;
background: #fcfcfc;
border-radius:3px;
}
/* LISTS */
ol ol {
list-style-type: lower-alpha;
}
ol ol ol{
list-style-type: decimal;
}
.tc-tiddler-body .tc-tag-list-item,
.tc-tiddler-body .tc-tag-label{
margin:0;
}
.tc-search-results {
padding-top: 0;
}
/* CONTACT */
form.contact {
width:100%;
}
form.contact input,
form.contact button,
form.contact textarea {
color:#333 !important;
display:block;
width:100%;
margin:5px 0;
padding:3px;
border:1px solid #ddd;
-webkit-box-shadow: 1px 1px 5px 0 rgba(204,204,204,1);
-moz-box-shadow: 1px 1px 5px 0 rgba(204,204,204,1);
box-shadow: 1px 1px 5px 0 rgba(204,204,204,1);
}
form.contact textarea {
height:150px;
}
form.contact .gotcha {
display:none;
}
.contact-response {
width: 100%;
overflow: hidden;
height: 120px;
display:none;
}
.contact-response iframe {
overflow: hidden;
margin: -155px 0px 0 0px;
border: 0;
width: 600px;
height: 1000px;
}
/* BACK TO TOP */
.back-top{
float:right;
clear:both;
margin: 0 0 -25px 0;
}
.back-top a{
color:#ddd;
}
.back-top a:hover{
color:#999;
}
/* INFO BOXES */
.note {
padding: 10px;
background: #fcfcfc;
border-radius: 15px;
border: 1px solid #ccc;
}
.warn,
.warn a {
color: #dd1144;
}
.summary {
font-style:italic;
color:grey;
}
.tb-thumbs{
width: 160px;
margin: 0 10px 10px 0;
}
.grey-svg svg{
fill:lightgrey;
height:12px !important;
}
.grey-svg:hover svg{
fill:grey;
}
.pinkish .tc-sparkl-bar b {
border-bottom-color:deeppink;
}
.pinkish .tc-sparkl-bar:hover b{
border-bottom-color:#c06;
}
.pop-tiddler {
padding:0 10px;
background:white;
}
.pop-img {
line-height:0;
}
.pretty.pop-popup {
-webkit-box-shadow: 2px 2px 15px 1px rgba(119, 119, 119, 0.5);
-moz-box-shadow: 2px 2px 15px 1px rgba(119, 119, 119, 0.5);
box-shadow: 2px 2px 15px 1px rgba(119, 119, 119, 0.5);
}
.pop-btn {
border-bottom:1px dotted #66f;
}
.tc-rating.alert .tc-rate:hover,
.tc-rating.alert .tc-rate:hover ~ .tc-rate {
color:red;
}.tc-rating.alert .tc-selected,
.tc-rating.alert .tc-selected ~ button[class^="tc-rating-"],
.tc-rating.alert .tc-selected ~ button[class*=" tc-rating-"] {
color:red;
}
.ol,
.ol ol {
counter-reset: item;
}
.ol li {
display: block;
position: relative;
}
.ol li:before {
content: counters(item, ".")".";
counter-increment: item;
position: absolute;
margin-right: 100%;
right: 10px; /* space between number and text */
}
.todo ul,
.todo li{
margin:0;
list-style-type:none;
}.todo li:before{
content: "✗";
color: #933;
display:inline-block;
width:20px;
margin-left: -20px;
}.todo .ok:before {
content: "✓";
color: #393;
}.todo .ok {
color:#060;
}
.pretty-pop,
.pretty img,
.pretty svg,
img.pretty,
.static{
box-shadow: 2px 2px 15px 1px rgba(119, 119, 119, 0.5);
-moz-box-shadow: 2px 2px 15px 1px rgba(119, 119, 119, 0.5);
-webkit-box-shadow: 2px 2px 15px 1px rgba(119, 119, 119, 0.5);
}
.linksvg.pretty.thumbs svg {
width:66px;
height:66px;
padding:6px; margin: 0 12px 12px 0;
border-radius: 7px 7px 7px 7px;
-moz-border-radius: 7px 7px 7px 7px;
-webkit-border-radius: 7px 7px 7px 7px;
<<transition "fill 150ms ease-in-out">>
}
.linksvg.pretty.thumbs-120 svg {
width:120px;
height:120px;
}
</style>
</head>
<body class="tc-body">
<section class="tc-story-river">
<p>
<a name="$:/plugins/tobibeer/setvars">
<div class="tc-tiddler-frame tc-tiddler-view-frame tc-tiddler-exists tc-tiddler-system "><div class="tc-tiddler-title">
<div class="tc-titlebar">
<span class="tc-tiddler-controls">
<span class=" tc-reveal"><button aria-label="more" class="tc-btn-invisible" title="More actions"></button><div class=" tc-reveal" hidden="true"></div></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal"><button aria-label="edit" class="tc-btn-invisible" title="Edit this tiddler"></button></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal"><button aria-label="close" class="tc-btn-invisible" title="Close this tiddler"></button></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal" hidden="true"></span><span class=" tc-reveal" hidden="true"></span>
</span>
<span class="tc-tiddler-title-icon" style="fill:;">
</span>
<h2 class="tc-title" title="This is a system tiddler">
<span class="tc-system-title-prefix">$:/</span>plugins/tobibeer/setvars
</h2>
</div>
<div class="tc-tiddler-info tc-popup-handle tc-reveal" hidden="true"></div>
</div><div class=" tc-reveal" hidden="true"></div>
<div class=" tc-reveal">
<div class="tc-subtitle">
<a class="tc-tiddlylink tc-tiddlylink-missing" href="#">
</a>
</div>
</div>
<div class=" tc-reveal">
<div class="tc-tags-wrapper"></div>
</div>
<div class="tc-tiddler-body tc-reveal"></div>
<span class=" tc-reveal">
<a class="tc-plugin-info tc-tiddlylink tc-tiddlylink-resolves tc-popup-handle tc-popup-absolute" href="#%24%3A%2Fplugins%2Ftobibeer%2Fsetvars">
<div class="tc-plugin-info-chunk tc-small-icon">
<span class=" tc-reveal" hidden="true"></span>
<span class=" tc-reveal">
<button class="tc-btn-invisible tc-btn-dropdown">
<svg class="tc-image-down-arrow tc-image-button" height="22pt" viewBox="0 0 128 128" width="22pt">
<path d="M109.35638,81.3533152 C107.923899,82.7869182 105.94502,83.6751442 103.759224,83.6751442 L24.5910645,83.6751442 C20.225873,83.6751442 16.6751442,80.1307318 16.6751442,75.7584775 C16.6751442,71.3951199 20.2192225,67.8418109 24.5910645,67.8418109 L95.8418109,67.8418109 L95.8418109,-3.40893546 C95.8418109,-7.77412698 99.3862233,-11.3248558 103.758478,-11.3248558 C108.121835,-11.3248558 111.675144,-7.78077754 111.675144,-3.40893546 L111.675144,75.7592239 C111.675144,77.9416955 110.789142,79.9205745 109.356651,81.3538862 Z" transform="translate(64.175144, 36.175144) rotate(45.000000) translate(-64.175144, -36.175144) "></path>
</svg>
</button>
</span>
</div>
<div class="tc-plugin-info-chunk">
<svg height="22pt" viewBox="0 0 128 128" width="22pt">
<g fill-rule="evenodd">
<path d="M40.3972881,76.4456988 L40.3972881,95.3404069 L54.5170166,95.3404069 L54.5170166,95.3404069 C54.5165526,95.3385183 54.516089,95.3366295 54.515626,95.3347404 C54.6093153,95.3385061 54.7034848,95.3404069 54.7980982,95.3404069 C58.6157051,95.3404069 61.710487,92.245625 61.710487,88.4280181 C61.710487,86.6197822 61.01617,84.9737128 59.8795929,83.7418666 L59.8795929,83.7418666 C59.8949905,83.7341665 59.9104102,83.7265043 59.925852,83.7188798 C58.8840576,82.5086663 58.2542926,80.9336277 58.2542926,79.2114996 C58.2542926,75.3938927 61.3490745,72.2991108 65.1666814,72.2991108 C68.9842884,72.2991108 72.0790703,75.3938927 72.0790703,79.2114996 C72.0790703,81.1954221 71.2432806,82.9841354 69.9045961,84.2447446 L69.9045961,84.2447446 C69.9333407,84.2629251 69.9619885,84.281245 69.9905383,84.2997032 L69.9905383,84.2997032 C69.1314315,85.4516923 68.6228758,86.8804654 68.6228758,88.4280181 C68.6228758,91.8584969 71.1218232,94.7053153 74.3986526,95.2474079 C74.3913315,95.2784624 74.3838688,95.3094624 74.3762652,95.3404069 L95.6963988,95.3404069 L95.6963988,75.5678578 L95.6963988,75.5678578 C95.6466539,75.5808558 95.5967614,75.5934886 95.5467242,75.6057531 C95.5504899,75.5120637 95.5523907,75.4178943 95.5523907,75.3232809 C95.5523907,71.505674 92.4576088,68.4108921 88.6400019,68.4108921 C86.831766,68.4108921 85.1856966,69.105209 83.9538504,70.2417862 L83.9538504,70.2417862 C83.9461503,70.2263886 83.938488,70.2109688 83.9308636,70.1955271 C82.7206501,71.2373215 81.1456115,71.8670865 79.4234834,71.8670865 C75.6058765,71.8670865 72.5110946,68.7723046 72.5110946,64.9546976 C72.5110946,61.1370907 75.6058765,58.0423088 79.4234834,58.0423088 C81.4074059,58.0423088 83.1961192,58.8780985 84.4567284,60.2167829 L84.4567284,60.2167829 C84.4749089,60.1880383 84.4932288,60.1593906 84.511687,60.1308407 L84.511687,60.1308407 C85.6636761,60.9899475 87.0924492,61.4985032 88.6400019,61.4985032 C92.0704807,61.4985032 94.9172991,58.9995558 95.4593917,55.7227265 C95.538755,55.7414363 95.6177614,55.761071 95.6963988,55.7816184 L95.6963988,40.0412962 L74.3762652,40.0412962 L74.3762652,40.0412962 C74.3838688,40.0103516 74.3913315,39.9793517 74.3986526,39.9482971 L74.3986526,39.9482971 C71.1218232,39.4062046 68.6228758,36.5593862 68.6228758,33.1289073 C68.6228758,31.5813547 69.1314315,30.1525815 69.9905383,29.0005925 C69.9619885,28.9821342 69.9333407,28.9638143 69.9045961,28.9456339 C71.2432806,27.6850247 72.0790703,25.8963113 72.0790703,23.9123888 C72.0790703,20.0947819 68.9842884,17 65.1666814,17 C61.3490745,17 58.2542926,20.0947819 58.2542926,23.9123888 C58.2542926,25.6345169 58.8840576,27.2095556 59.925852,28.419769 L59.925852,28.419769 C59.9104102,28.4273935 59.8949905,28.4350558 59.8795929,28.4427558 C61.01617,29.674602 61.710487,31.3206715 61.710487,33.1289073 C61.710487,36.9465143 58.6157051,40.0412962 54.7980982,40.0412962 C54.7034848,40.0412962 54.6093153,40.0393953 54.515626,40.0356296 L54.515626,40.0356296 C54.516089,40.0375187 54.5165526,40.0394075 54.5170166,40.0412962 L40.3972881,40.0412962 L40.3972881,52.887664 L40.3972881,52.887664 C40.4916889,53.3430132 40.5412962,53.8147625 40.5412962,54.2980982 C40.5412962,58.1157051 37.4465143,61.210487 33.6289073,61.210487 C32.0813547,61.210487 30.6525815,60.7019313 29.5005925,59.8428245 C29.4821342,59.8713744 29.4638143,59.9000221 29.4456339,59.9287667 C28.1850247,58.5900823 26.3963113,57.7542926 24.4123888,57.7542926 C20.5947819,57.7542926 17.5,60.8490745 17.5,64.6666814 C17.5,68.4842884 20.5947819,71.5790703 24.4123888,71.5790703 C26.134517,71.5790703 27.7095556,70.9493053 28.919769,69.9075109 L28.919769,69.9075109 C28.9273935,69.9229526 28.9350558,69.9383724 28.9427558,69.95377 C30.174602,68.8171928 31.8206715,68.1228758 33.6289073,68.1228758 C37.4465143,68.1228758 40.5412962,71.2176578 40.5412962,75.0352647 C40.5412962,75.5186004 40.4916889,75.9903496 40.3972881,76.4456988 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z"></path>
</g>
</svg>
</div>
<div class="tc-plugin-info-chunk">
<h1>
<strong>Set multiple, complex variables based on attributes, filters, or conditionals</strong>
</h1>
<h2>
$:/plugins/tobibeer/setvars
</h2>
<h2>
<div><em>0.6.0</em></div>
</h2>
</div>
</a>
</span>
<span class=" tc-reveal" hidden="true"></span>
<span class=" tc-reveal">
<div class="tc-plugin-info-dropdown">
<div class="tc-plugin-info-dropdown-body">
<div style="float:right;">
<span class=" tc-reveal">
<button aria-label="disable" class="" title="Disable this plugin when reloading page">
disable
</button>
</span>
<span class=" tc-reveal" hidden="true"></span>
</div>
<div class="tc-tab-set ">
<div class="tc-tab-buttons ">
<button class=" tc-tab-selected">
readme
</button><button class="">
contents
</button>
</div>
<div class="tc-tab-divider "></div>
<div class="tc-tab-content ">
<p><span class=" tc-reveal">
<p>
<p>Provides the widget <code><$setvars></code>...</p><h2 class="">Usage</h2><pre><code><$setvars
_attr1=<<currentTiddler>>
_attr2={{!!title}}
_attr3="1 2 3"
_attr4="[all[current]tagging[]]"
var1="attr1 \ = literal = \ attr2"
var2="attr3[n] \ \ [attr4[1,2][when-empty]] \ \ [attr3[][][ - ]]"
var3="if(attr1 ? [attr4]) || attr3 attr2"
var4="if(attr1 == attr2 ? attr3[1]) || [attr3[2]]">
* <<var1>>
* <<var2>>
* <<var3>>
* <<var4>>
</$setvars></code></pre><dl><dt>documentation / examples / demos...</dt><dd><a class="tc-tiddlylink-external" href="http://tobibeer.github.io/tw5-plugins#setvars" rel="noopener noreferrer" target="_blank">http://tobibeer.github.io/tw5-plugins#setvars</a></dd></dl>
</p>
</span></p><p><span class=" tc-reveal" hidden="true"></span></p>
</div>
</div>
</div>
</div>
</span>
<div class="back-top">
<a class="tc-tiddlylink tc-tiddlylink-resolves tc-popup-handle tc-popup-absolute" href="#%24%3A%2Fplugins%2Ftobibeer%2Fsetvars">$:/plugins/tobibeer/setvars ^</a>
</div>
</div>
</a>
</p>
</section>
</body>
</html>
Built from branch 'tiddlywiki-com' at commit 1f829dd5a8eacefb007eeab91dd51649ee4d1f3a of https://github.com/Jermolene/TiddlyWiki5.git at 2019-01-14 09:59:26 UTC
<div class="tc-control-panel">
<<tabs "[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]" "$:/core/ui/ControlPanel/Info">>
</div>
{
"tiddlers": {
"$:/Acknowledgements": {
"title": "$:/Acknowledgements",
"text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
},
"$:/core/copyright.txt": {
"title": "$:/core/copyright.txt",
"type": "text/plain",
"text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2018, UnaMesa Association\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
},
"$:/core/icon": {
"title": "$:/core/icon",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>"
},
"$:/core/images/add-comment": {
"title": "$:/core/images/add-comment",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-add-comment tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M56 56H36a8 8 0 1 0 0 16h20v20a8 8 0 1 0 16 0V72h20a8 8 0 1 0 0-16H72V36a8 8 0 1 0-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\" fill-rule=\"evenodd\"/></svg>"
},
"$:/core/images/advanced-search-button": {
"title": "$:/core/images/advanced-search-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-advanced-search-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M74.5651535,87.9848361 C66.9581537,93.0488876 57.8237115,96 48,96 C21.490332,96 0,74.509668 0,48 C0,21.490332 21.490332,0 48,0 C74.509668,0 96,21.490332 96,48 C96,57.8541369 93.0305793,67.0147285 87.9377231,74.6357895 L122.284919,108.982985 C125.978897,112.676963 125.973757,118.65366 122.284271,122.343146 C118.593975,126.033442 112.613238,126.032921 108.92411,122.343793 L74.5651535,87.9848361 Z M48,80 C65.673112,80 80,65.673112 80,48 C80,30.326888 65.673112,16 48,16 C30.326888,16 16,30.326888 16,48 C16,65.673112 30.326888,80 48,80 Z\"></path>\n <circle cx=\"48\" cy=\"48\" r=\"8\"></circle>\n <circle cx=\"28\" cy=\"48\" r=\"8\"></circle>\n <circle cx=\"68\" cy=\"48\" r=\"8\"></circle>\n </g>\n</svg>"
},
"$:/core/images/auto-height": {
"title": "$:/core/images/auto-height",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-auto-height tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <path d=\"M67.9867828,114.356363 L67.9579626,99.8785426 C67.9550688,98.4248183 67.1636987,97.087107 65.8909901,96.3845863 L49.9251455,87.5716209 L47.992126,95.0735397 L79.8995411,95.0735397 C84.1215894,95.0735397 85.4638131,89.3810359 81.686497,87.4948823 L49.7971476,71.5713518 L48.0101917,79.1500092 L79.992126,79.1500092 C84.2093753,79.1500092 85.5558421,73.4676733 81.7869993,71.5753162 L49.805065,55.517008 L48.0101916,63.0917009 L79.9921259,63.0917015 C84.2035118,63.0917016 85.5551434,57.4217887 81.7966702,55.5218807 L65.7625147,47.4166161 L67.9579705,50.9864368 L67.9579705,35.6148245 L77.1715737,44.8284272 C78.7336709,46.3905243 81.2663308,46.3905243 82.8284279,44.8284271 C84.390525,43.2663299 84.390525,40.7336699 82.8284278,39.1715728 L66.8284271,23.1715728 C65.2663299,21.6094757 62.73367,21.6094757 61.1715729,23.1715729 L45.1715729,39.1715729 C43.6094757,40.73367 43.6094757,43.26633 45.1715729,44.8284271 C46.73367,46.3905243 49.26633,46.3905243 50.8284271,44.8284271 L59.9579705,35.6988837 L59.9579705,50.9864368 C59.9579705,52.495201 60.806922,53.8755997 62.1534263,54.5562576 L78.1875818,62.6615223 L79.9921261,55.0917015 L48.0101917,55.0917009 C43.7929424,55.0917008 42.4464755,60.7740368 46.2153183,62.6663939 L78.1972526,78.7247021 L79.992126,71.1500092 L48.0101917,71.1500092 C43.7881433,71.1500092 42.4459197,76.842513 46.2232358,78.7286665 L78.1125852,94.6521971 L79.8995411,87.0735397 L47.992126,87.0735397 C43.8588276,87.0735397 42.4404876,92.5780219 46.0591064,94.5754586 L62.024951,103.388424 L59.9579785,99.8944677 L59.9867142,114.32986 L50.8284271,105.171573 C49.26633,103.609476 46.73367,103.609476 45.1715729,105.171573 C43.6094757,106.73367 43.6094757,109.26633 45.1715729,110.828427 L61.1715729,126.828427 C62.73367,128.390524 65.2663299,128.390524 66.8284271,126.828427 L82.8284278,110.828427 C84.390525,109.26633 84.390525,106.73367 82.8284279,105.171573 C81.2663308,103.609476 78.7336709,103.609476 77.1715737,105.171573 L67.9867828,114.356363 L67.9867828,114.356363 Z M16,20 L112,20 C114.209139,20 116,18.209139 116,16 C116,13.790861 114.209139,12 112,12 L16,12 C13.790861,12 12,13.790861 12,16 C12,18.209139 13.790861,20 16,20 L16,20 Z\"></path>\n</svg>"
},
"$:/core/images/blank": {
"title": "$:/core/images/blank",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\"></svg>"
},
"$:/core/images/bold": {
"title": "$:/core/images/bold",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-bold tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M41.1456583,51.8095238 L41.1456583,21.8711485 L67.4985994,21.8711485 C70.0084159,21.8711485 72.4285598,22.0802967 74.7591036,22.4985994 C77.0896475,22.9169022 79.1512515,23.6638602 80.9439776,24.7394958 C82.7367036,25.8151314 84.170863,27.3090474 85.2464986,29.2212885 C86.3221342,31.1335296 86.859944,33.5835518 86.859944,36.5714286 C86.859944,41.9496067 85.2465147,45.8337882 82.0196078,48.2240896 C78.792701,50.614391 74.6694929,51.8095238 69.6498599,51.8095238 L41.1456583,51.8095238 Z M13,0 L13,128 L75.0280112,128 C80.7647346,128 86.3519803,127.28292 91.789916,125.848739 C97.2278517,124.414559 102.068139,122.203563 106.310924,119.215686 C110.553709,116.22781 113.929959,112.373506 116.439776,107.652661 C118.949592,102.931816 120.204482,97.3445701 120.204482,90.8907563 C120.204482,82.8832466 118.262391,76.0411115 114.378151,70.3641457 C110.493911,64.6871798 104.607883,60.7133634 96.719888,58.442577 C102.456611,55.6937304 106.788968,52.1680887 109.717087,47.8655462 C112.645206,43.5630037 114.109244,38.1849062 114.109244,31.7310924 C114.109244,25.7553389 113.123259,20.7357813 111.151261,16.6722689 C109.179262,12.6087565 106.400578,9.35201972 102.815126,6.90196078 C99.2296739,4.45190185 94.927196,2.68908101 89.907563,1.61344538 C84.8879301,0.537809748 79.3305627,0 73.2352941,0 L13,0 Z M41.1456583,106.128852 L41.1456583,70.9915966 L71.8011204,70.9915966 C77.896389,70.9915966 82.7964334,72.3958776 86.5014006,75.2044818 C90.2063677,78.0130859 92.0588235,82.7039821 92.0588235,89.2773109 C92.0588235,92.6237329 91.4911355,95.3725383 90.3557423,97.5238095 C89.2203491,99.6750808 87.6965548,101.378145 85.7843137,102.633053 C83.8720726,103.887961 81.661077,104.784311 79.1512605,105.322129 C76.641444,105.859947 74.0121519,106.128852 71.2633053,106.128852 L41.1456583,106.128852 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/cancel-button": {
"title": "$:/core/images/cancel-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n\t<g fill-rule=\"evenodd\">\n\t <path d=\"M64,76.3137085 L47.0294734,93.2842351 C43.9038742,96.4098343 38.8399231,96.4084656 35.7157288,93.2842712 C32.5978915,90.166434 32.5915506,85.0947409 35.7157649,81.9705266 L52.6862915,65 L35.7157649,48.0294734 C32.5901657,44.9038742 32.5915344,39.8399231 35.7157288,36.7157288 C38.833566,33.5978915 43.9052591,33.5915506 47.0294734,36.7157649 L64,53.6862915 L80.9705266,36.7157649 C84.0961258,33.5901657 89.1600769,33.5915344 92.2842712,36.7157288 C95.4021085,39.833566 95.4084494,44.9052591 92.2842351,48.0294734 L75.3137085,65 L92.2842351,81.9705266 C95.4098343,85.0961258 95.4084656,90.1600769 92.2842712,93.2842712 C89.166434,96.4021085 84.0947409,96.4084494 80.9705266,93.2842351 L64,76.3137085 Z M64,129 C99.346224,129 128,100.346224 128,65 C128,29.653776 99.346224,1 64,1 C28.653776,1 1.13686838e-13,29.653776 1.13686838e-13,65 C1.13686838e-13,100.346224 28.653776,129 64,129 Z M64,113 C90.509668,113 112,91.509668 112,65 C112,38.490332 90.509668,17 64,17 C37.490332,17 16,38.490332 16,65 C16,91.509668 37.490332,113 64,113 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-down": {
"title": "$:/core/images/chevron-down",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-down tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n\t<g fill-rule=\"evenodd\" transform=\"translate(64.000000, 40.500000) rotate(-270.000000) translate(-64.000000, -40.500000) translate(-22.500000, -26.500000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n\t</g>\n</svg>"
},
"$:/core/images/chevron-left": {
"title": "$:/core/images/chevron-left",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-left tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\" version=\"1.1\">\n <g fill-rule=\"evenodd\" transform=\"translate(92.500000, 64.000000) rotate(-180.000000) translate(-92.500000, -64.000000) translate(6.000000, -3.000000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-right": {
"title": "$:/core/images/chevron-right",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-right tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\" transform=\"translate(-48.000000, -3.000000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n </g>\n</svg>"
},
"$:/core/images/chevron-up": {
"title": "$:/core/images/chevron-up",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-chevron-up tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n\t<g fill-rule=\"evenodd\" transform=\"translate(64.000000, 89.500000) rotate(-90.000000) translate(-64.000000, -89.500000) translate(-22.500000, 22.500000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n\t</g>\n</svg>"
},
"$:/core/images/clone-button": {
"title": "$:/core/images/clone-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-clone-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M32.2650915,96 L32.2650915,120.002359 C32.2650915,124.419334 35.8432884,128 40.2627323,128 L120.002359,128 C124.419334,128 128,124.421803 128,120.002359 L128,40.2627323 C128,35.8457573 124.421803,32.2650915 120.002359,32.2650915 L96,32.2650915 L96,48 L108.858899,48 C110.519357,48 111.853018,49.3405131 111.853018,50.9941198 L111.853018,108.858899 C111.853018,110.519357 110.512505,111.853018 108.858899,111.853018 L50.9941198,111.853018 C49.333661,111.853018 48,110.512505 48,108.858899 L48,96 L32.2650915,96 Z\"></path>\n <path d=\"M40,56 L32.0070969,56 C27.5881712,56 24,52.418278 24,48 C24,43.5907123 27.5848994,40 32.0070969,40 L40,40 L40,32.0070969 C40,27.5881712 43.581722,24 48,24 C52.4092877,24 56,27.5848994 56,32.0070969 L56,40 L63.9929031,40 C68.4118288,40 72,43.581722 72,48 C72,52.4092877 68.4151006,56 63.9929031,56 L56,56 L56,63.9929031 C56,68.4118288 52.418278,72 48,72 C43.5907123,72 40,68.4151006 40,63.9929031 L40,56 Z M7.9992458,0 C3.58138434,0 0,3.5881049 0,7.9992458 L0,88.0007542 C0,92.4186157 3.5881049,96 7.9992458,96 L88.0007542,96 C92.4186157,96 96,92.4118951 96,88.0007542 L96,7.9992458 C96,3.58138434 92.4118951,0 88.0007542,0 L7.9992458,0 Z M19.0010118,16 C17.3435988,16 16,17.336731 16,19.0010118 L16,76.9989882 C16,78.6564012 17.336731,80 19.0010118,80 L76.9989882,80 C78.6564012,80 80,78.663269 80,76.9989882 L80,19.0010118 C80,17.3435988 78.663269,16 76.9989882,16 L19.0010118,16 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/close-all-button": {
"title": "$:/core/images/close-all-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-close-all-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\" transform=\"translate(-23.000000, -23.000000)\">\n <path d=\"M43,131 L22.9976794,131 C18.5827987,131 15,127.418278 15,123 C15,118.590712 18.5806831,115 22.9976794,115 L43,115 L43,94.9976794 C43,90.5827987 46.581722,87 51,87 C55.4092877,87 59,90.5806831 59,94.9976794 L59,115 L79.0023206,115 C83.4172013,115 87,118.581722 87,123 C87,127.409288 83.4193169,131 79.0023206,131 L59,131 L59,151.002321 C59,155.417201 55.418278,159 51,159 C46.5907123,159 43,155.419317 43,151.002321 L43,131 Z\" transform=\"translate(51.000000, 123.000000) rotate(-45.000000) translate(-51.000000, -123.000000) \"></path>\n <path d=\"M43,59 L22.9976794,59 C18.5827987,59 15,55.418278 15,51 C15,46.5907123 18.5806831,43 22.9976794,43 L43,43 L43,22.9976794 C43,18.5827987 46.581722,15 51,15 C55.4092877,15 59,18.5806831 59,22.9976794 L59,43 L79.0023206,43 C83.4172013,43 87,46.581722 87,51 C87,55.4092877 83.4193169,59 79.0023206,59 L59,59 L59,79.0023206 C59,83.4172013 55.418278,87 51,87 C46.5907123,87 43,83.4193169 43,79.0023206 L43,59 Z\" transform=\"translate(51.000000, 51.000000) rotate(-45.000000) translate(-51.000000, -51.000000) \"></path>\n <path d=\"M115,59 L94.9976794,59 C90.5827987,59 87,55.418278 87,51 C87,46.5907123 90.5806831,43 94.9976794,43 L115,43 L115,22.9976794 C115,18.5827987 118.581722,15 123,15 C127.409288,15 131,18.5806831 131,22.9976794 L131,43 L151.002321,43 C155.417201,43 159,46.581722 159,51 C159,55.4092877 155.419317,59 151.002321,59 L131,59 L131,79.0023206 C131,83.4172013 127.418278,87 123,87 C118.590712,87 115,83.4193169 115,79.0023206 L115,59 Z\" transform=\"translate(123.000000, 51.000000) rotate(-45.000000) translate(-123.000000, -51.000000) \"></path>\n <path d=\"M115,131 L94.9976794,131 C90.5827987,131 87,127.418278 87,123 C87,118.590712 90.5806831,115 94.9976794,115 L115,115 L115,94.9976794 C115,90.5827987 118.581722,87 123,87 C127.409288,87 131,90.5806831 131,94.9976794 L131,115 L151.002321,115 C155.417201,115 159,118.581722 159,123 C159,127.409288 155.419317,131 151.002321,131 L131,131 L131,151.002321 C131,155.417201 127.418278,159 123,159 C118.590712,159 115,155.419317 115,151.002321 L115,131 Z\" transform=\"translate(123.000000, 123.000000) rotate(-45.000000) translate(-123.000000, -123.000000) \"></path>\n </g>\n</svg>"
},
"$:/core/images/close-button": {
"title": "$:/core/images/close-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M65.0864256,75.4091629 L14.9727349,125.522854 C11.8515951,128.643993 6.78104858,128.64922 3.65685425,125.525026 C0.539017023,122.407189 0.5336324,117.334539 3.65902635,114.209145 L53.7727171,64.0954544 L3.65902635,13.9817637 C0.537886594,10.8606239 0.532659916,5.79007744 3.65685425,2.6658831 C6.77469148,-0.451954124 11.8473409,-0.457338747 14.9727349,2.66805521 L65.0864256,52.7817459 L115.200116,2.66805521 C118.321256,-0.453084553 123.391803,-0.458311231 126.515997,2.6658831 C129.633834,5.78372033 129.639219,10.8563698 126.513825,13.9817637 L76.4001341,64.0954544 L126.513825,114.209145 C129.634965,117.330285 129.640191,122.400831 126.515997,125.525026 C123.39816,128.642863 118.32551,128.648248 115.200116,125.522854 L65.0864256,75.4091629 L65.0864256,75.4091629 Z\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/close-others-button": {
"title": "$:/core/images/close-others-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-close-others-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z M64,96 C81.673112,96 96,81.673112 96,64 C96,46.326888 81.673112,32 64,32 C46.326888,32 32,46.326888 32,64 C32,81.673112 46.326888,96 64,96 Z M64,80 C72.836556,80 80,72.836556 80,64 C80,55.163444 72.836556,48 64,48 C55.163444,48 48,55.163444 48,64 C48,72.836556 55.163444,80 64,80 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/copy-clipboard": {
"title": "$:/core/images/copy-clipboard",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-copy-clipboard tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n\t<g fill-rule=\"evenodd\">\n\t\t<rect x=\"40\" y=\"40\" width=\"33\" height=\"8\" rx=\"4\"></rect>\n\t\t<rect x=\"40\" y=\"82\" width=\"17\" height=\"8\" rx=\"4\"></rect>\n\t\t<rect x=\"40\" y=\"54\" width=\"17\" height=\"8\" rx=\"4\"></rect>\n\t\t<rect x=\"40\" y=\"96\" width=\"33\" height=\"8\" rx=\"4\"></rect>\n\t\t<rect x=\"40\" y=\"68\" width=\"12\" height=\"8\" rx=\"4\"></rect>\n\t\t<path d=\"M40,16 L23.9992458,16 C19.5813843,16 16,19.5907123 16,24 C16,24.0016363 16.0000005,24.0032725 16.0000015,24.0049086 C16.0000005,24.0065441 16,24.0081803 16,24.0098166 L16,119.990183 C16,119.99182 16.0000005,119.993456 16.0000015,119.995092 C16.0000005,119.996727 16,119.998364 16,120 C16,124.409288 19.5813843,128 23.9992458,128 L104.000754,128 C106.205061,128 108.203844,127.105595 109.652065,125.659342 C111.102424,124.21251 112,122.214511 112,120.007595 L112,103.992405 C112,99.5776607 108.418278,96 104,96 C99.5907123,96 96,99.5783218 96,103.992405 L96,112 L32,112 L32,32 L96,32 L96,40.0075946 C96,44.4223393 99.581722,48 104,48 C108.409288,48 112,44.4216782 112,40.0075946 L112,23.9924054 C112,21.7851587 111.104671,19.7871591 109.657101,18.3409203 C108.203844,16.8944047 106.205061,16 104.000754,16 L88,16 C88,11.5907123 84.4151006,8 79.9929031,8 L48.0070969,8 C43.5881712,8 40,11.581722 40,16 Z M44,14.9958262 C44,12.7889923 45.7964248,11 48.0000255,11 L79.9999745,11 C82.2091276,11 84,12.7965212 84,14.9958262 L84,19.0041738 C84,21.2110077 82.2035752,23 79.9999745,23 L48.0000255,23 C45.7908724,23 44,21.2034788 44,19.0041738 L44,14.9958262 Z\"></path>\n\t\t<rect x=\"62\" y=\"64\" width=\"66\" height=\"16\" rx=\"8\"></rect>\n\t\t<path d=\"M60.6568542,85.6568542 L76.6568542,69.6568543 L65.3431458,69.6568542 L81.3431458,85.6568542 C84.4673401,88.7810486 89.5326599,88.7810486 92.6568542,85.6568542 C95.7810486,82.5326599 95.7810486,77.4673401 92.6568542,74.3431458 L76.6568542,58.3431458 C73.5326599,55.2189514 68.4673401,55.2189514 65.3431458,58.3431457 L49.3431458,74.3431457 C46.2189514,77.4673401 46.2189514,82.5326599 49.3431457,85.6568542 C52.4673401,88.7810486 57.5326599,88.7810486 60.6568542,85.6568542 L60.6568542,85.6568542 Z\" transform=\"translate(71.000000, 72.000000) rotate(-90.000000) translate(-71.000000, -72.000000) \"></path>\n\t</g>\n</svg>"
},
"$:/core/images/delete-button": {
"title": "$:/core/images/delete-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\" transform=\"translate(12.000000, 0.000000)\">\n <rect x=\"0\" y=\"11\" width=\"105\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"28\" y=\"0\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"8\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"8\" y=\"112\" width=\"88\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"80\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"56\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"32\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n </g>\n</svg>"
},
"$:/core/images/done-button": {
"title": "$:/core/images/done-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M3.52445141,76.8322939 C2.07397484,75.3828178 1.17514421,73.3795385 1.17514421,71.1666288 L1.17514421,23.1836596 C1.17514421,18.7531992 4.75686621,15.1751442 9.17514421,15.1751442 C13.5844319,15.1751442 17.1751442,18.7606787 17.1751442,23.1836596 L17.1751442,63.1751442 L119.173716,63.1751442 C123.590457,63.1751442 127.175144,66.7568662 127.175144,71.1751442 C127.175144,75.5844319 123.592783,79.1751442 119.173716,79.1751442 L9.17657227,79.1751442 C6.96796403,79.1751442 4.9674142,78.279521 3.51911285,76.8315312 Z\" id=\"Rectangle-285\" transform=\"translate(64.175144, 47.175144) rotate(-45.000000) translate(-64.175144, -47.175144) \"></path>\n </g>\n</svg>"
},
"$:/core/images/down-arrow": {
"title": "$:/core/images/down-arrow",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <path d=\"M109.35638,81.3533152 C107.923899,82.7869182 105.94502,83.6751442 103.759224,83.6751442 L24.5910645,83.6751442 C20.225873,83.6751442 16.6751442,80.1307318 16.6751442,75.7584775 C16.6751442,71.3951199 20.2192225,67.8418109 24.5910645,67.8418109 L95.8418109,67.8418109 L95.8418109,-3.40893546 C95.8418109,-7.77412698 99.3862233,-11.3248558 103.758478,-11.3248558 C108.121835,-11.3248558 111.675144,-7.78077754 111.675144,-3.40893546 L111.675144,75.7592239 C111.675144,77.9416955 110.789142,79.9205745 109.356651,81.3538862 Z\" transform=\"translate(64.175144, 36.175144) rotate(45.000000) translate(-64.175144, -36.175144) \"></path>\n</svg>"
},
"$:/core/images/download-button": {
"title": "$:/core/images/download-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-download-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path class=\"tc-image-download-button-ring\" d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z\"/><path d=\"M34.3496823,66.4308767 L61.2415823,93.634668 C63.0411536,95.4551107 65.9588502,95.4551107 67.7584215,93.634668 L94.6503215,66.4308767 C96.4498928,64.610434 96.4498928,61.6588981 94.6503215,59.8384554 C93.7861334,58.9642445 92.6140473,58.4731195 91.3919019,58.4731195 L82.9324098,58.4731195 C80.3874318,58.4731195 78.3243078,56.3860674 78.3243078,53.8115729 L78.3243078,38.6615466 C78.3243078,36.0870521 76.2611837,34 73.7162058,34 L55.283798,34 C52.7388201,34 50.675696,36.0870521 50.675696,38.6615466 L50.675696,38.6615466 L50.675696,53.8115729 C50.675696,56.3860674 48.612572,58.4731195 46.0675941,58.4731195 L37.608102,58.4731195 C35.063124,58.4731195 33,60.5601716 33,63.134666 C33,64.3709859 33.4854943,65.5566658 34.3496823,66.4308767 L34.3496823,66.4308767 Z\"/></g></svg>"
},
"$:/core/images/edit-button": {
"title": "$:/core/images/edit-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M116.870058,45.3431458 L108.870058,45.3431458 L108.870058,45.3431458 L108.870058,61.3431458 L116.870058,61.3431458 L116.870058,45.3431458 Z M124.870058,45.3431458 L127.649881,45.3431458 C132.066101,45.3431458 135.656854,48.9248678 135.656854,53.3431458 C135.656854,57.7524334 132.07201,61.3431458 127.649881,61.3431458 L124.870058,61.3431458 L124.870058,45.3431458 Z M100.870058,45.3431458 L15.6638275,45.3431458 C15.5064377,45.3431458 15.3501085,45.3476943 15.1949638,45.3566664 L15.1949638,45.3566664 C15.0628002,45.3477039 14.928279,45.3431458 14.7913977,45.3431458 C6.68160973,45.3431458 -8.34314575,53.3431458 -8.34314575,53.3431458 C-8.34314575,53.3431458 6.85614548,61.3431458 14.7913977,61.3431458 C14.9266533,61.3431458 15.0596543,61.3384973 15.190398,61.3293588 C15.3470529,61.3385075 15.5049057,61.3431458 15.6638275,61.3431458 L100.870058,61.3431458 L100.870058,45.3431458 L100.870058,45.3431458 Z\" transform=\"translate(63.656854, 53.343146) rotate(-45.000000) translate(-63.656854, -53.343146) \"></path>\n <path d=\"M35.1714596,124.189544 C41.9594858,123.613403 49.068777,121.917633 58.85987,118.842282 C60.6854386,118.268877 62.4306907,117.705515 65.1957709,116.802278 C81.1962861,111.575575 87.0734839,109.994907 93.9414474,109.655721 C102.29855,109.242993 107.795169,111.785371 111.520478,118.355045 C112.610163,120.276732 115.051363,120.951203 116.97305,119.861518 C118.894737,118.771832 119.569207,116.330633 118.479522,114.408946 C113.146151,105.003414 104.734907,101.112919 93.5468356,101.66546 C85.6716631,102.054388 79.4899908,103.716944 62.7116783,109.197722 C59.9734132,110.092199 58.2519873,110.64787 56.4625698,111.20992 C37.002649,117.322218 25.6914684,118.282267 16.8654804,112.957098 C14.9739614,111.815848 12.5154166,112.424061 11.3741667,114.31558 C10.2329168,116.207099 10.84113,118.665644 12.7326489,119.806894 C19.0655164,123.627836 26.4866335,124.926678 35.1714596,124.189544 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/erase": {
"title": "$:/core/images/erase",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-erase tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M60.0870401,127.996166 L123.102318,64.980888 C129.636723,58.4464827 129.629513,47.8655877 123.098967,41.3350425 L99.4657866,17.7018617 C92.927448,11.1635231 82.3486358,11.1698163 75.8199411,17.698511 L4.89768189,88.6207702 C-1.63672343,95.1551755 -1.6295126,105.736071 4.90103262,112.266616 L20.6305829,127.996166 L60.0870401,127.996166 Z M25.1375576,120.682546 L10.812569,106.357558 C7.5455063,103.090495 7.54523836,97.793808 10.8048093,94.5342371 L46.2691086,59.0699377 L81.7308914,94.5317205 L55.5800654,120.682546 L25.1375576,120.682546 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/excise": {
"title": "$:/core/images/excise",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-excise tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M56,107.313709 L53.6568542,109.656854 C50.5326599,112.781049 45.4673401,112.781049 42.3431457,109.656854 C39.2189514,106.53266 39.2189514,101.46734 42.3431458,98.3431457 L58.3431458,82.3431457 C61.4673401,79.2189514 66.5326599,79.2189514 69.6568542,82.3431458 L85.6568542,98.3431458 C88.7810486,101.46734 88.7810486,106.53266 85.6568542,109.656854 C82.5326599,112.781049 77.4673401,112.781049 74.3431458,109.656854 L72,107.313708 L72,121.597798 C72,125.133636 68.418278,128 64,128 C59.581722,128 56,125.133636 56,121.597798 L56,107.313709 Z M0,40.0070969 C0,35.5848994 3.59071231,32 8,32 C12.418278,32 16,35.5881712 16,40.0070969 L16,71.9929031 C16,76.4151006 12.4092877,80 8,80 C3.581722,80 0,76.4118288 0,71.9929031 L0,40.0070969 Z M32,40.0070969 C32,35.5848994 35.5907123,32 40,32 C44.418278,32 48,35.5881712 48,40.0070969 L48,71.9929031 C48,76.4151006 44.4092877,80 40,80 C35.581722,80 32,76.4118288 32,71.9929031 L32,40.0070969 Z M80,40.0070969 C80,35.5848994 83.5907123,32 88,32 C92.418278,32 96,35.5881712 96,40.0070969 L96,71.9929031 C96,76.4151006 92.4092877,80 88,80 C83.581722,80 80,76.4118288 80,71.9929031 L80,40.0070969 Z M56,8.00709688 C56,3.58489938 59.5907123,0 64,0 C68.418278,0 72,3.58817117 72,8.00709688 L72,39.9929031 C72,44.4151006 68.4092877,48 64,48 C59.581722,48 56,44.4118288 56,39.9929031 L56,8.00709688 Z M112,40.0070969 C112,35.5848994 115.590712,32 120,32 C124.418278,32 128,35.5881712 128,40.0070969 L128,71.9929031 C128,76.4151006 124.409288,80 120,80 C115.581722,80 112,76.4118288 112,71.9929031 L112,40.0070969 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/export-button": {
"title": "$:/core/images/export-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-export-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00348646,127.999999 C8.00464867,128 8.00581094,128 8.00697327,128 L119.993027,128 C122.205254,128 124.207939,127.101378 125.657096,125.651198 L125.656838,125.65759 C127.104563,124.210109 128,122.21009 128,119.999949 L128,56.0000511 C128,51.5817449 124.409288,48 120,48 C115.581722,48 112,51.5797863 112,56.0000511 L112,112 L16,112 L16,56.0000511 C16,51.5817449 12.4092877,48 8,48 C3.581722,48 7.10542736e-15,51.5797863 7.10542736e-15,56.0000511 L7.10542736e-15,119.999949 C7.10542736e-15,124.418255 3.59071231,128 8,128 C8.00116233,128 8.0023246,128 8.00348681,127.999999 Z M56.6235633,27.3113724 L47.6580188,36.2769169 C44.5333664,39.4015692 39.4634864,39.4061295 36.339292,36.2819351 C33.2214548,33.1640979 33.2173444,28.0901742 36.3443103,24.9632084 L58.9616908,2.34582788 C60.5248533,0.782665335 62.5748436,0.000361191261 64.624516,2.38225238e-14 L64.6193616,0.00151809229 C66.6695374,0.000796251595 68.7211167,0.781508799 70.2854358,2.34582788 L92.9028163,24.9632084 C96.0274686,28.0878607 96.0320289,33.1577408 92.9078345,36.2819351 C89.7899973,39.3997724 84.7160736,39.4038827 81.5891078,36.2769169 L72.6235633,27.3113724 L72.6235633,88.5669606 C72.6235633,92.9781015 69.0418413,96.5662064 64.6235633,96.5662064 C60.2142756,96.5662064 56.6235633,92.984822 56.6235633,88.5669606 L56.6235633,27.3113724 L56.6235633,27.3113724 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/file": {
"title": "$:/core/images/file",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-file tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"nonzero\">\n <path d=\"M111.96811,30.5 L112,30.5 L112,119.999079 C112,124.417866 108.419113,128 104.000754,128 L23.9992458,128 C19.5813843,128 16,124.417687 16,119.999079 L16,8.00092105 C16,3.58213437 19.5808867,0 23.9992458,0 L81,0 L81,0.0201838424 C83.1589869,-0.071534047 85.3482153,0.707077645 86.9982489,2.35711116 L109.625176,24.9840387 C111.151676,26.510538 111.932942,28.4998414 111.96811,30.5 L111.96811,30.5 Z M81,8 L24,8 L24,120 L104,120 L104,30.5 L89.0003461,30.5 C84.5818769,30.5 81,26.9216269 81,22.4996539 L81,8 Z\"></path>\n <rect x=\"32\" y=\"36\" width=\"64\" height=\"8\" rx=\"4\"></rect>\n <rect x=\"32\" y=\"52\" width=\"64\" height=\"8\" rx=\"4\"></rect>\n <rect x=\"32\" y=\"68\" width=\"64\" height=\"8\" rx=\"4\"></rect>\n <rect x=\"32\" y=\"84\" width=\"64\" height=\"8\" rx=\"4\"></rect>\n <rect x=\"32\" y=\"100\" width=\"64\" height=\"8\" rx=\"4\"></rect>\n <rect x=\"32\" y=\"20\" width=\"40\" height=\"8\" rx=\"4\"></rect>\n </g>\n</svg>"
},
"$:/core/images/fixed-height": {
"title": "$:/core/images/fixed-height",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-fixed-height tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M60,35.6568542 L50.8284271,44.8284271 C49.26633,46.3905243 46.73367,46.3905243 45.1715729,44.8284271 C43.6094757,43.26633 43.6094757,40.73367 45.1715729,39.1715729 L61.1715729,23.1715729 C62.73367,21.6094757 65.2663299,21.6094757 66.8284271,23.1715728 L82.8284278,39.1715728 C84.390525,40.7336699 84.390525,43.2663299 82.8284279,44.8284271 C81.2663308,46.3905243 78.7336709,46.3905243 77.1715737,44.8284272 L68,35.6568539 L68,93.3431461 L77.1715737,84.1715728 C78.7336709,82.6094757 81.2663308,82.6094757 82.8284279,84.1715729 C84.390525,85.7336701 84.390525,88.2663301 82.8284278,89.8284272 L66.8284271,105.828427 C65.2663299,107.390524 62.73367,107.390524 61.1715729,105.828427 L45.1715729,89.8284271 C43.6094757,88.26633 43.6094757,85.73367 45.1715729,84.1715729 C46.73367,82.6094757 49.26633,82.6094757 50.8284271,84.1715729 L60,93.3431458 L60,35.6568542 L60,35.6568542 Z M16,116 L112,116 C114.209139,116 116,114.209139 116,112 C116,109.790861 114.209139,108 112,108 L16,108 C13.790861,108 12,109.790861 12,112 C12,114.209139 13.790861,116 16,116 L16,116 Z M16,20 L112,20 C114.209139,20 116,18.209139 116,16 C116,13.790861 114.209139,12 112,12 L16,12 C13.790861,12 12,13.790861 12,16 C12,18.209139 13.790861,20 16,20 L16,20 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/fold-all-button": {
"title": "$:/core/images/fold-all-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-fold-all tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <rect x=\"0\" y=\"0\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"64\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <path d=\"M64.0292774,58.6235628 C61.9791013,58.6242848 59.9275217,57.8435723 58.3632024,56.279253 L35.7458219,33.6618725 C32.6211696,30.5372202 32.6166093,25.4673401 35.7408036,22.3431458 C38.8586409,19.2253085 43.9325646,19.2211982 47.0595304,22.348164 L64.0250749,39.3137085 L80.9906194,22.348164 C84.1152717,19.2235117 89.1851518,19.2189514 92.3093461,22.3431458 C95.4271834,25.460983 95.4312937,30.5349067 92.3043279,33.6618725 L69.6869474,56.279253 C68.1237851,57.8424153 66.0737951,58.6247195 64.0241231,58.6250809 Z\" transform=\"translate(64.024316, 39.313708) scale(1, -1) translate(-64.024316, -39.313708) \"></path>\n <path d=\"M64.0292774,123.621227 C61.9791013,123.621949 59.9275217,122.841236 58.3632024,121.276917 L35.7458219,98.6595365 C32.6211696,95.5348842 32.6166093,90.4650041 35.7408036,87.3408098 C38.8586409,84.2229725 43.9325646,84.2188622 47.0595304,87.345828 L64.0250749,104.311373 L80.9906194,87.345828 C84.1152717,84.2211757 89.1851518,84.2166154 92.3093461,87.3408098 C95.4271834,90.458647 95.4312937,95.5325707 92.3043279,98.6595365 L69.6869474,121.276917 C68.1237851,122.840079 66.0737951,123.622383 64.0241231,123.622745 Z\" transform=\"translate(64.024316, 104.311372) scale(1, -1) translate(-64.024316, -104.311372) \"></path>\n </g>\n</svg>"
},
"$:/core/images/fold-button": {
"title": "$:/core/images/fold-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-fold tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <rect x=\"0\" y=\"0\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <path d=\"M64.0292774,63.6235628 C61.9791013,63.6242848 59.9275217,62.8435723 58.3632024,61.279253 L35.7458219,38.6618725 C32.6211696,35.5372202 32.6166093,30.4673401 35.7408036,27.3431458 C38.8586409,24.2253085 43.9325646,24.2211982 47.0595304,27.348164 L64.0250749,44.3137085 L80.9906194,27.348164 C84.1152717,24.2235117 89.1851518,24.2189514 92.3093461,27.3431458 C95.4271834,30.460983 95.4312937,35.5349067 92.3043279,38.6618725 L69.6869474,61.279253 C68.1237851,62.8424153 66.0737951,63.6247195 64.0241231,63.6250809 Z\" transform=\"translate(64.024316, 44.313708) scale(1, -1) translate(-64.024316, -44.313708) \"></path>\n <path d=\"M64.0049614,105.998482 C61.9547853,105.999204 59.9032057,105.218491 58.3388864,103.654172 L35.7215059,81.0367916 C32.5968535,77.9121393 32.5922933,72.8422592 35.7164876,69.7180649 C38.8343248,66.6002276 43.9082485,66.5961173 47.0352144,69.7230831 L64.0007589,86.6886276 L80.9663034,69.7230831 C84.0909557,66.5984308 89.1608358,66.5938705 92.2850301,69.7180649 C95.4028673,72.8359021 95.4069777,77.9098258 92.2800119,81.0367916 L69.6626314,103.654172 C68.099469,105.217334 66.0494791,105.999639 63.999807,106 Z\" transform=\"translate(64.000000, 86.688628) scale(1, -1) translate(-64.000000, -86.688628) \"></path>\n </g>\n</svg>"
},
"$:/core/images/fold-others-button": {
"title": "$:/core/images/fold-others-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-fold-others tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <rect x=\"0\" y=\"56.0314331\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <path d=\"M101.657101,104.948818 C100.207918,103.498614 98.2051847,102.599976 95.9929031,102.599976 L72,102.599976 L72,78.6070725 C72,76.3964271 71.1036108,74.3936927 69.6545293,72.9441002 L69.6571005,72.9488183 C68.2079177,71.4986143 66.2051847,70.5999756 63.9929031,70.5999756 L32.0070969,70.5999756 C27.5881712,70.5999756 24,74.1816976 24,78.5999756 C24,83.0092633 27.5848994,86.5999756 32.0070969,86.5999756 L56,86.5999756 L56,110.592879 C56,112.803524 56.8963895,114.806259 58.3454713,116.255852 L58.3429,116.251133 C59.7920828,117.701337 61.7948156,118.599976 64.0070969,118.599976 L88,118.599976 L88,142.592879 C88,147.011804 91.581722,150.599976 96,150.599976 C100.409288,150.599976 104,147.015076 104,142.592879 L104,110.607072 C104,108.396427 103.103611,106.393693 101.654529,104.9441 Z\" transform=\"translate(64.000000, 110.599976) rotate(-45.000000) translate(-64.000000, -110.599976) \"></path>\n <path d=\"M101.725643,11.7488671 C100.27646,10.2986632 98.2737272,9.40002441 96.0614456,9.40002441 L72.0685425,9.40002441 L72.0685425,-14.5928787 C72.0685425,-16.8035241 71.1721533,-18.8062584 69.7230718,-20.255851 L69.725643,-20.2511329 C68.2764602,-21.7013368 66.2737272,-22.5999756 64.0614456,-22.5999756 L32.0756394,-22.5999756 C27.6567137,-22.5999756 24.0685425,-19.0182536 24.0685425,-14.5999756 C24.0685425,-10.1906879 27.6534419,-6.59997559 32.0756394,-6.59997559 L56.0685425,-6.59997559 L56.0685425,17.3929275 C56.0685425,19.6035732 56.964932,21.6063078 58.4140138,23.0559004 L58.4114425,23.0511823 C59.8606253,24.5013859 61.8633581,25.4000244 64.0756394,25.4000244 L88.0685425,25.4000244 L88.0685425,49.3929275 C88.0685425,53.8118532 91.6502645,57.4000244 96.0685425,57.4000244 C100.47783,57.4000244 104.068542,53.815125 104.068542,49.3929275 L104.068542,17.4071213 C104.068542,15.1964759 103.172153,13.1937416 101.723072,11.744149 Z\" transform=\"translate(64.068542, 17.400024) scale(1, -1) rotate(-45.000000) translate(-64.068542, -17.400024) \"></path>\n </g>\n</svg>"
},
"$:/core/images/folder": {
"title": "$:/core/images/folder",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-folder tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M55.6943257,128.000004 L7.99859666,128.000004 C3.5810937,128.000004 0,124.413822 0,119.996384 L0,48.0036243 C0,43.5833471 3.58387508,40.0000044 7.99859666,40.0000044 L16,40.0000044 L16,31.9999914 C16,27.5817181 19.5783731,24 24.0003461,24 L55.9996539,24 C60.4181231,24 64,27.5800761 64,31.9999914 L64,40.0000044 L104.001403,40.0000044 C108.418906,40.0000044 112,43.5861868 112,48.0036243 L112,59.8298353 L104,59.7475921 L104,51.9994189 C104,49.7887607 102.207895,48.0000044 99.9972215,48.0000044 L56,48.0000044 L56,36.0000255 C56,33.7898932 54.2072328,32 51.9957423,32 L28.0042577,32 C25.7890275,32 24,33.7908724 24,36.0000255 L24,48.0000044 L12.0027785,48.0000044 C9.78987688,48.0000044 8,49.7906032 8,51.9994189 L8,116.00059 C8,118.211248 9.79210499,120.000004 12.0027785,120.000004 L58.7630167,120.000004 L55.6943257,128.000004 L55.6943257,128.000004 Z\"></path>\n <path d=\"M23.8728955,55.5 L119.875702,55.5 C124.293205,55.5 126.87957,59.5532655 125.650111,64.5630007 L112.305967,118.936999 C111.077582,123.942356 106.497904,128 102.083183,128 L6.08037597,128 C1.66287302,128 -0.923492342,123.946735 0.305967145,118.936999 L13.650111,64.5630007 C14.878496,59.5576436 19.4581739,55.5 23.8728955,55.5 L23.8728955,55.5 L23.8728955,55.5 Z M25.6530124,64 L113.647455,64 C115.858129,64 117.151473,66.0930612 116.538306,68.6662267 L105.417772,115.333773 C104.803671,117.910859 102.515967,120 100.303066,120 L12.3086228,120 C10.0979492,120 8.8046054,117.906939 9.41777189,115.333773 L20.5383062,68.6662267 C21.1524069,66.0891409 23.4401107,64 25.6530124,64 L25.6530124,64 L25.6530124,64 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/full-screen-button": {
"title": "$:/core/images/full-screen-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-full-screen-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g>\n <g>\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(104.000000, 104.000000) rotate(-180.000000) translate(-104.000000, -104.000000) translate(80.000000, 80.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(24.000000, 104.000000) rotate(-90.000000) translate(-24.000000, -104.000000) translate(0.000000, 80.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(104.000000, 24.000000) rotate(90.000000) translate(-104.000000, -24.000000) translate(80.000000, 0.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n </g>\n</svg>"
},
"$:/core/images/github": {
"title": "$:/core/images/github",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-github tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M63.9383506,1.60695328 C28.6017227,1.60695328 -0.055756057,30.2970814 -0.055756057,65.6906208 C-0.055756057,94.003092 18.2804728,118.019715 43.7123154,126.493393 C46.9143781,127.083482 48.0812647,125.104717 48.0812647,123.405261 C48.0812647,121.886765 48.02626,117.85449 47.9948287,112.508284 C30.1929317,116.379268 26.4368926,103.916587 26.4368926,103.916587 C23.5255693,96.5129372 19.3294921,94.5420399 19.3294921,94.5420399 C13.5186324,90.5687739 19.7695302,90.6474524 19.7695302,90.6474524 C26.1933001,91.099854 29.5721638,97.2525155 29.5721638,97.2525155 C35.2808718,107.044059 44.5531024,104.215566 48.1991321,102.575118 C48.7806109,98.4366275 50.4346826,95.612068 52.2616263,94.0109598 C38.0507543,92.3941159 23.1091047,86.8944862 23.1091047,62.3389152 C23.1091047,55.3443933 25.6039634,49.6205298 29.6978889,45.1437211 C29.0378318,43.5229433 26.8415704,37.0044266 30.3265147,28.1845627 C30.3265147,28.1845627 35.6973364,26.4615028 47.9241083,34.7542205 C53.027764,33.330139 58.5046663,32.6220321 63.9462084,32.5944947 C69.3838216,32.6220321 74.856795,33.330139 79.9683085,34.7542205 C92.1872225,26.4615028 97.5501864,28.1845627 97.5501864,28.1845627 C101.042989,37.0044266 98.8467271,43.5229433 98.190599,45.1437211 C102.292382,49.6205298 104.767596,55.3443933 104.767596,62.3389152 C104.767596,86.9574291 89.8023734,92.3744463 75.5482834,93.9598188 C77.8427675,95.9385839 79.8897303,99.8489072 79.8897303,105.828476 C79.8897303,114.392635 79.8111521,121.304544 79.8111521,123.405261 C79.8111521,125.120453 80.966252,127.114954 84.2115327,126.489459 C109.623731,117.996111 127.944244,93.9952241 127.944244,65.6906208 C127.944244,30.2970814 99.2867652,1.60695328 63.9383506,1.60695328\"></path>\n </g>\n </svg>\n"
},
"$:/core/images/gitter": {
"title": "$:/core/images/gitter",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-gitter tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 18 25\">\n <rect x=\"15\" y=\"5\" width=\"2\" height=\"10\"></rect>\n <rect x=\"10\" y=\"5\" width=\"2\" height=\"20\"></rect>\n <rect x=\"5\" y=\"5\" width=\"2\" height=\"20\"></rect>\n <rect width=\"2\" height=\"15\"></rect>\n</svg>\n"
},
"$:/core/images/globe": {
"title": "$:/core/images/globe",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-globe tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M72.8111354,37.1275855 C72.8111354,37.9789875 72.8111354,38.8303894 72.8111354,39.6817913 C72.8111354,41.8784743 73.7885604,46.5631866 72.8111354,48.5143758 C71.3445471,51.4420595 68.1617327,52.0543531 66.4170946,54.3812641 C65.2352215,55.9575873 61.7987417,64.9821523 62.7262858,67.3005778 C66.6959269,77.2228204 74.26087,70.4881886 80.6887657,76.594328 C81.5527211,77.415037 83.5758191,78.8666631 83.985137,79.8899578 C87.2742852,88.1128283 76.4086873,94.8989524 87.7419325,106.189751 C88.9872885,107.430443 91.555495,102.372895 91.8205061,101.575869 C92.6726866,99.0129203 98.5458765,96.1267309 100.908882,94.5234439 C102.928056,93.1534443 105.782168,91.8557166 107.236936,89.7775886 C109.507391,86.5342557 108.717505,82.2640435 110.334606,79.0328716 C112.473794,74.7585014 114.163418,69.3979002 116.332726,65.0674086 C120.230862,57.2857361 121.054075,67.1596684 121.400359,67.5059523 C121.757734,67.8633269 122.411167,67.5059523 122.916571,67.5059523 C123.011132,67.5059523 124.364019,67.6048489 124.432783,67.5059523 C125.0832,66.5705216 123.390209,49.5852316 123.114531,48.2089091 C121.710578,41.1996597 116.17083,32.4278331 111.249523,27.7092761 C104.975994,21.6942076 104.160516,11.5121686 92.9912146,12.7547535 C92.7872931,12.7774397 87.906794,22.9027026 85.2136766,26.2672064 C81.486311,30.9237934 82.7434931,22.1144904 78.6876623,22.1144904 C78.6065806,22.1144904 77.5045497,22.0107615 77.4353971,22.1144904 C76.8488637,22.9942905 75.9952305,26.0101404 75.1288269,26.5311533 C74.8635477,26.6906793 73.4071369,26.2924966 73.2826811,26.5311533 C71.0401728,30.8313939 81.5394677,28.7427264 79.075427,34.482926 C76.7225098,39.9642538 72.747373,32.4860199 72.747373,43.0434079\"></path>\n <path d=\"M44.4668556,7.01044608 C54.151517,13.1403033 45.1489715,19.2084878 47.1611905,23.2253896 C48.8157833,26.5283781 51.4021933,28.6198851 48.8753629,33.038878 C46.8123257,36.6467763 42.0052989,37.0050492 39.251679,39.7621111 C36.2115749,42.8060154 33.7884281,48.7028116 32.4624592,52.6732691 C30.8452419,57.5158356 47.0088721,59.5388126 44.5246867,63.6811917 C43.1386839,65.9923513 37.7785192,65.1466282 36.0880227,63.8791519 C34.9234453,63.0059918 32.4946425,63.3331166 31.6713597,62.0997342 C29.0575851,58.1839669 29.4107339,54.0758543 28.0457962,49.9707786 C27.1076833,47.1493864 21.732611,47.8501656 20.2022714,49.3776393 C19.6790362,49.8998948 19.8723378,51.1703278 19.8723378,51.8829111 C19.8723378,57.1682405 26.9914913,55.1986414 26.9914913,58.3421973 C26.9914913,72.9792302 30.9191897,64.8771867 38.1313873,69.6793121 C48.1678018,76.3618966 45.9763926,76.981595 53.0777543,84.0829567 C56.7511941,87.7563965 60.8192437,87.7689005 62.503478,93.3767069 C64.1046972,98.7081071 53.1759798,98.7157031 50.786754,100.825053 C49.663965,101.816317 47.9736094,104.970571 46.5680513,105.439676 C44.7757187,106.037867 43.334221,105.93607 41.6242359,107.219093 C39.1967302,109.040481 37.7241465,112.151588 37.6034934,112.030935 C35.4555278,109.88297 34.0848666,96.5511248 33.7147244,93.7726273 C33.1258872,89.3524817 28.1241923,88.2337027 26.7275443,84.7420826 C25.1572737,80.8164061 28.2518481,75.223612 25.599097,70.9819941 C19.0797019,60.557804 13.7775712,56.4811506 10.2493953,44.6896152 C9.3074899,41.5416683 13.5912267,38.1609942 15.1264825,35.8570308 C17.0029359,33.0410312 17.7876232,30.0028946 19.8723378,27.2224065 C22.146793,24.1888519 40.8551166,9.46076832 43.8574051,8.63490613 L44.4668556,7.01044608 Z\"></path>\n <path d=\"M64,126 C98.2416545,126 126,98.2416545 126,64 C126,29.7583455 98.2416545,2 64,2 C29.7583455,2 2,29.7583455 2,64 C2,98.2416545 29.7583455,126 64,126 Z M64,120 C94.927946,120 120,94.927946 120,64 C120,33.072054 94.927946,8 64,8 C33.072054,8 8,33.072054 8,64 C8,94.927946 33.072054,120 64,120 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/heading-1": {
"title": "$:/core/images/heading-1",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-heading-1 tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M14,30 L27.25,30 L27.25,60.104 L61.7,60.104 L61.7,30 L74.95,30 L74.95,105.684 L61.7,105.684 L61.7,71.552 L27.25,71.552 L27.25,105.684 L14,105.684 L14,30 Z M84.3350766,43.78 C86.8790893,43.78 89.3523979,43.5680021 91.7550766,43.144 C94.1577553,42.7199979 96.3307336,42.0133383 98.2740766,41.024 C100.21742,40.0346617 101.87807,38.7626744 103.256077,37.208 C104.634084,35.6533256 105.535075,33.7453446 105.959077,31.484 L115.817077,31.484 L115.817077,105.684 L102.567077,105.684 L102.567077,53.32 L84.3350766,53.32 L84.3350766,43.78 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/heading-2": {
"title": "$:/core/images/heading-2",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-heading-2 tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M6,30 L19.25,30 L19.25,60.104 L53.7,60.104 L53.7,30 L66.95,30 L66.95,105.684 L53.7,105.684 L53.7,71.552 L19.25,71.552 L19.25,105.684 L6,105.684 L6,30 Z M125.519077,105.684 L74.8510766,105.684 C74.9217436,99.5359693 76.4057288,94.1653563 79.3030766,89.572 C82.2004244,84.9786437 86.1577182,80.986017 91.1750766,77.594 C93.5777553,75.8273245 96.0863969,74.113675 98.7010766,72.453 C101.315756,70.792325 103.718399,69.0080095 105.909077,67.1 C108.099754,65.1919905 109.901736,63.1250111 111.315077,60.899 C112.728417,58.6729889 113.47041,56.1113478 113.541077,53.214 C113.541077,51.8713266 113.382078,50.4403409 113.064077,48.921 C112.746075,47.4016591 112.127748,45.9883399 111.209077,44.681 C110.290405,43.3736601 109.018418,42.2783377 107.393077,41.395 C105.767735,40.5116622 103.647756,40.07 101.033077,40.07 C98.6303979,40.07 96.6340846,40.5469952 95.0440766,41.501 C93.4540687,42.4550048 92.1820814,43.762325 91.2280766,45.423 C90.2740719,47.083675 89.5674123,49.0446554 89.1080766,51.306 C88.648741,53.5673446 88.3837436,56.0053203 88.3130766,58.62 L76.2290766,58.62 C76.2290766,54.5213128 76.7767378,50.7230175 77.8720766,47.225 C78.9674154,43.7269825 80.610399,40.7060127 82.8010766,38.162 C84.9917542,35.6179873 87.6593942,33.6216739 90.8040766,32.173 C93.948759,30.7243261 97.6057224,30 101.775077,30 C106.297766,30 110.078395,30.7419926 113.117077,32.226 C116.155758,33.7100074 118.611401,35.5826554 120.484077,37.844 C122.356753,40.1053446 123.681739,42.5609868 124.459077,45.211 C125.236414,47.8610133 125.625077,50.3873213 125.625077,52.79 C125.625077,55.7580148 125.165748,58.4433213 124.247077,60.846 C123.328405,63.2486787 122.091751,65.4569899 120.537077,67.471 C118.982402,69.4850101 117.215753,71.3399915 115.237077,73.036 C113.2584,74.7320085 111.209087,76.3219926 109.089077,77.806 C106.969066,79.2900074 104.849087,80.7033266 102.729077,82.046 C100.609066,83.3886734 98.6480856,84.7313266 96.8460766,86.074 C95.0440676,87.4166734 93.47175,88.8123261 92.1290766,90.261 C90.7864032,91.7096739 89.8677458,93.2466585 89.3730766,94.872 L125.519077,94.872 L125.519077,105.684 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/heading-3": {
"title": "$:/core/images/heading-3",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-heading-3 tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M6,30 L19.25,30 L19.25,60.104 L53.7,60.104 L53.7,30 L66.95,30 L66.95,105.684 L53.7,105.684 L53.7,71.552 L19.25,71.552 L19.25,105.684 L6,105.684 L6,30 Z M94.8850766,62.224 C96.8637532,62.294667 98.8424001,62.1533351 100.821077,61.8 C102.799753,61.4466649 104.566402,60.8283378 106.121077,59.945 C107.675751,59.0616623 108.930072,57.8426744 109.884077,56.288 C110.838081,54.7333256 111.315077,52.8253446 111.315077,50.564 C111.315077,47.3839841 110.237421,44.8400095 108.082077,42.932 C105.926733,41.0239905 103.153094,40.07 99.7610766,40.07 C97.641066,40.07 95.8037511,40.4939958 94.2490766,41.342 C92.6944022,42.1900042 91.4047484,43.3383261 90.3800766,44.787 C89.3554048,46.2356739 88.5957458,47.860991 88.1010766,49.663 C87.6064075,51.465009 87.3944096,53.3199905 87.4650766,55.228 L75.3810766,55.228 C75.5224107,51.623982 76.1937373,48.2850154 77.3950766,45.211 C78.596416,42.1369846 80.2393995,39.4693446 82.3240766,37.208 C84.4087537,34.9466554 86.9350618,33.1800064 89.9030766,31.908 C92.8710915,30.6359936 96.2277246,30 99.9730766,30 C102.870424,30 105.714729,30.4239958 108.506077,31.272 C111.297424,32.1200042 113.806065,33.3566585 116.032077,34.982 C118.258088,36.6073415 120.042403,38.6743208 121.385077,41.183 C122.72775,43.6916792 123.399077,46.5713171 123.399077,49.822 C123.399077,53.5673521 122.551085,56.8356527 120.855077,59.627 C119.159068,62.4183473 116.509095,64.4499936 112.905077,65.722 L112.905077,65.934 C117.145098,66.7820042 120.448731,68.8843166 122.816077,72.241 C125.183422,75.5976835 126.367077,79.6786426 126.367077,84.484 C126.367077,88.017351 125.660417,91.1796527 124.247077,93.971 C122.833736,96.7623473 120.925755,99.129657 118.523077,101.073 C116.120398,103.016343 113.329093,104.517995 110.149077,105.578 C106.969061,106.638005 103.612428,107.168 100.079077,107.168 C95.7683884,107.168 92.005426,106.549673 88.7900766,105.313 C85.5747272,104.076327 82.8894207,102.327345 80.7340766,100.066 C78.5787325,97.8046554 76.9357489,95.0840159 75.8050766,91.904 C74.6744043,88.7239841 74.0737436,85.1906861 74.0030766,81.304 L86.0870766,81.304 C85.9457426,85.8266893 87.0587315,89.5896517 89.4260766,92.593 C91.7934218,95.5963483 95.3443863,97.098 100.079077,97.098 C104.107097,97.098 107.481396,95.9496782 110.202077,93.653 C112.922757,91.3563219 114.283077,88.0880212 114.283077,83.848 C114.283077,80.9506522 113.717749,78.6540085 112.587077,76.958 C111.456404,75.2619915 109.972419,73.9723378 108.135077,73.089 C106.297734,72.2056623 104.230755,71.6580011 101.934077,71.446 C99.6373985,71.2339989 97.2877553,71.163333 94.8850766,71.234 L94.8850766,62.224 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/heading-4": {
"title": "$:/core/images/heading-4",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-heading-4 tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8,30 L21.25,30 L21.25,60.104 L55.7,60.104 L55.7,30 L68.95,30 L68.95,105.684 L55.7,105.684 L55.7,71.552 L21.25,71.552 L21.25,105.684 L8,105.684 L8,30 Z M84.5890766,78.548 L107.061077,78.548 L107.061077,45.9 L106.849077,45.9 L84.5890766,78.548 Z M128.049077,88.088 L118.509077,88.088 L118.509077,105.684 L107.061077,105.684 L107.061077,88.088 L75.2610766,88.088 L75.2610766,76.11 L107.061077,31.484 L118.509077,31.484 L118.509077,78.548 L128.049077,78.548 L128.049077,88.088 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/heading-5": {
"title": "$:/core/images/heading-5",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-heading-5 tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M6,30 L19.25,30 L19.25,60.104 L53.7,60.104 L53.7,30 L66.95,30 L66.95,105.684 L53.7,105.684 L53.7,71.552 L19.25,71.552 L19.25,105.684 L6,105.684 L6,30 Z M83.7550766,31.484 L122.127077,31.484 L122.127077,42.296 L92.7650766,42.296 L88.9490766,61.164 L89.1610766,61.376 C90.7864181,59.5386575 92.8533974,58.1430048 95.3620766,57.189 C97.8707558,56.2349952 100.361731,55.758 102.835077,55.758 C106.509762,55.758 109.795729,56.3763272 112.693077,57.613 C115.590424,58.8496729 118.0284,60.5809889 120.007077,62.807 C121.985753,65.0330111 123.487405,67.6653181 124.512077,70.704 C125.536748,73.7426819 126.049077,77.028649 126.049077,80.562 C126.049077,83.5300148 125.572081,86.5863176 124.618077,89.731 C123.664072,92.8756824 122.144754,95.7376538 120.060077,98.317 C117.9754,100.896346 115.30776,103.016325 112.057077,104.677 C108.806394,106.337675 104.919766,107.168 100.397077,107.168 C96.7930586,107.168 93.454092,106.691005 90.3800766,105.737 C87.3060613,104.782995 84.6030883,103.35201 82.2710766,101.444 C79.939065,99.5359905 78.0840835,97.1863473 76.7060766,94.395 C75.3280697,91.6036527 74.5684107,88.3353521 74.4270766,84.59 L86.5110766,84.59 C86.8644117,88.6180201 88.2423979,91.7096559 90.6450766,93.865 C93.0477553,96.0203441 96.2277235,97.098 100.185077,97.098 C102.729089,97.098 104.884401,96.6740042 106.651077,95.826 C108.417752,94.9779958 109.848738,93.8120074 110.944077,92.328 C112.039415,90.8439926 112.816741,89.1126766 113.276077,87.134 C113.735412,85.1553234 113.965077,83.0353446 113.965077,80.774 C113.965077,78.7246564 113.682413,76.763676 113.117077,74.891 C112.55174,73.018324 111.703749,71.3753404 110.573077,69.962 C109.442404,68.5486596 107.976086,67.4180042 106.174077,66.57 C104.372068,65.7219958 102.269755,65.298 99.8670766,65.298 C97.3230639,65.298 94.9380878,65.7749952 92.7120766,66.729 C90.4860655,67.6830048 88.8784149,69.4673203 87.8890766,72.082 L75.8050766,72.082 L83.7550766,31.484 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/heading-6": {
"title": "$:/core/images/heading-6",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-heading-6 tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M6,30 L19.25,30 L19.25,60.104 L53.7,60.104 L53.7,30 L66.95,30 L66.95,105.684 L53.7,105.684 L53.7,71.552 L19.25,71.552 L19.25,105.684 L6,105.684 L6,30 Z M112.587077,50.246 C112.304409,47.2073181 111.226753,44.751676 109.354077,42.879 C107.481401,41.006324 104.955093,40.07 101.775077,40.07 C99.584399,40.07 97.6940846,40.4763293 96.1040766,41.289 C94.5140687,42.1016707 93.1714154,43.1793266 92.0760766,44.522 C90.9807378,45.8646734 90.0974133,47.401658 89.4260766,49.133 C88.7547399,50.864342 88.2070787,52.6839905 87.7830766,54.592 C87.3590745,56.5000095 87.0587442,58.390324 86.8820766,60.263 C86.7054091,62.135676 86.5464107,63.8846585 86.4050766,65.51 L86.6170766,65.722 C88.2424181,62.7539852 90.4860623,60.5456739 93.3480766,59.097 C96.2100909,57.6483261 99.3017267,56.924 102.623077,56.924 C106.297762,56.924 109.583729,57.5599936 112.481077,58.832 C115.378424,60.1040064 117.834067,61.8529889 119.848077,64.079 C121.862087,66.3050111 123.399071,68.9373181 124.459077,71.976 C125.519082,75.0146819 126.049077,78.300649 126.049077,81.834 C126.049077,85.438018 125.466082,88.7769846 124.300077,91.851 C123.134071,94.9250154 121.455754,97.6103219 119.265077,99.907 C117.074399,102.203678 114.459758,103.987994 111.421077,105.26 C108.382395,106.532006 105.025762,107.168 101.351077,107.168 C95.9097161,107.168 91.4400941,106.16101 87.9420766,104.147 C84.4440591,102.13299 81.6880867,99.3770175 79.6740766,95.879 C77.6600666,92.3809825 76.2644138,88.2823568 75.4870766,83.583 C74.7097394,78.8836432 74.3210766,73.8133605 74.3210766,68.372 C74.3210766,63.9199777 74.7980719,59.4326893 75.7520766,54.91 C76.7060814,50.3873107 78.278399,46.2710186 80.4690766,42.561 C82.6597542,38.8509815 85.5393921,35.8300117 89.1080766,33.498 C92.6767611,31.1659883 97.0757171,30 102.305077,30 C105.273091,30 108.064397,30.4946617 110.679077,31.484 C113.293756,32.4733383 115.608067,33.8513245 117.622077,35.618 C119.636087,37.3846755 121.27907,39.5046543 122.551077,41.978 C123.823083,44.4513457 124.529743,47.2073181 124.671077,50.246 L112.587077,50.246 Z M100.927077,97.098 C103.117754,97.098 105.025735,96.6563378 106.651077,95.773 C108.276418,94.8896623 109.636738,93.7413404 110.732077,92.328 C111.827415,90.9146596 112.640074,89.271676 113.170077,87.399 C113.700079,85.526324 113.965077,83.6006766 113.965077,81.622 C113.965077,79.6433234 113.700079,77.7353425 113.170077,75.898 C112.640074,74.0606575 111.827415,72.4530069 110.732077,71.075 C109.636738,69.6969931 108.276418,68.5840042 106.651077,67.736 C105.025735,66.8879958 103.117754,66.464 100.927077,66.464 C98.736399,66.464 96.8107516,66.8703293 95.1500766,67.683 C93.4894017,68.4956707 92.0937489,69.5909931 90.9630766,70.969 C89.8324043,72.3470069 88.9844128,73.9546575 88.4190766,75.792 C87.8537405,77.6293425 87.5710766,79.5726564 87.5710766,81.622 C87.5710766,83.6713436 87.8537405,85.6146575 88.4190766,87.452 C88.9844128,89.2893425 89.8324043,90.9323261 90.9630766,92.381 C92.0937489,93.8296739 93.4894017,94.9779958 95.1500766,95.826 C96.8107516,96.6740042 98.736399,97.098 100.927077,97.098 L100.927077,97.098 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/help": {
"title": "$:/core/images/help",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-help tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M36.0548906,111.44117 C30.8157418,115.837088 20.8865444,118.803477 9.5,118.803477 C7.86465619,118.803477 6.25937294,118.742289 4.69372699,118.624467 C12.612543,115.984876 18.7559465,110.02454 21.0611049,102.609942 C8.74739781,92.845129 1.04940554,78.9359851 1.04940554,63.5 C1.04940554,33.9527659 29.2554663,10 64.0494055,10 C98.8433448,10 127.049406,33.9527659 127.049406,63.5 C127.049406,93.0472341 98.8433448,117 64.0494055,117 C53.9936953,117 44.48824,114.999337 36.0548906,111.44117 L36.0548906,111.44117 Z M71.4042554,77.5980086 C71.406883,77.2865764 71.4095079,76.9382011 71.4119569,76.5610548 C71.4199751,75.3262169 71.4242825,74.0811293 71.422912,72.9158546 C71.4215244,71.736154 71.4143321,70.709635 71.4001396,69.8743525 C71.4078362,68.5173028 71.9951951,67.7870427 75.1273009,65.6385471 C75.2388969,65.5619968 76.2124091,64.8981068 76.5126553,64.6910879 C79.6062455,62.5580654 81.5345849,60.9050204 83.2750652,58.5038955 C85.6146327,55.2762841 86.8327108,51.426982 86.8327108,46.8554323 C86.8327108,33.5625756 76.972994,24.9029551 65.3778484,24.9029551 C54.2752771,24.9029551 42.8794554,34.5115163 41.3121702,47.1975534 C40.9043016,50.4989536 43.2499725,53.50591 46.5513726,53.9137786 C49.8527728,54.3216471 52.8597292,51.9759763 53.2675978,48.6745761 C54.0739246,42.1479456 60.2395837,36.9492759 65.3778484,36.9492759 C70.6427674,36.9492759 74.78639,40.5885487 74.78639,46.8554323 C74.78639,50.4892974 73.6853224,52.008304 69.6746221,54.7736715 C69.4052605,54.9593956 68.448509,55.6118556 68.3131127,55.7047319 C65.6309785,57.5445655 64.0858213,58.803255 62.6123358,60.6352315 C60.5044618,63.2559399 59.3714208,66.3518252 59.3547527,69.9487679 C59.3684999,70.8407274 59.3752803,71.8084521 59.3765995,72.9300232 C59.3779294,74.0607297 59.3737237,75.2764258 59.36589,76.482835 C59.3634936,76.8518793 59.3609272,77.1924914 59.3583633,77.4963784 C59.3568319,77.6778944 59.3556368,77.8074256 59.3549845,77.8730928 C59.3219814,81.1994287 61.9917551,83.9227111 65.318091,83.9557142 C68.644427,83.9887173 71.3677093,81.3189435 71.4007124,77.9926076 C71.4014444,77.9187458 71.402672,77.7856841 71.4042554,77.5980086 Z M65.3778489,102.097045 C69.5359735,102.097045 72.9067994,98.7262189 72.9067994,94.5680944 C72.9067994,90.4099698 69.5359735,87.0391439 65.3778489,87.0391439 C61.2197243,87.0391439 57.8488984,90.4099698 57.8488984,94.5680944 C57.8488984,98.7262189 61.2197243,102.097045 65.3778489,102.097045 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/home-button": {
"title": "$:/core/images/home-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M112.9847,119.501583 C112.99485,119.336814 113,119.170705 113,119.003406 L113,67.56802 C116.137461,70.5156358 121.076014,70.4518569 124.133985,67.3938855 C127.25818,64.2696912 127.260618,59.2068102 124.131541,56.0777326 L70.3963143,2.34250601 C68.8331348,0.779326498 66.7828947,-0.000743167069 64.7337457,1.61675364e-05 C62.691312,-0.00409949529 60.6426632,0.777559815 59.077717,2.34250601 L33,28.420223 L33,28.420223 L33,8.00697327 C33,3.58484404 29.4092877,0 25,0 C20.581722,0 17,3.59075293 17,8.00697327 L17,44.420223 L5.3424904,56.0777326 C2.21694607,59.2032769 2.22220878,64.2760483 5.34004601,67.3938855 C8.46424034,70.5180798 13.5271213,70.5205187 16.6561989,67.3914411 L17,67.04764 L17,119.993027 C17,119.994189 17.0000002,119.995351 17.0000007,119.996514 C17.0000002,119.997675 17,119.998838 17,120 C17,124.418278 20.5881049,128 24.9992458,128 L105.000754,128 C109.418616,128 113,124.409288 113,120 C113,119.832611 112.99485,119.666422 112.9847,119.501583 Z M97,112 L97,51.5736087 L97,51.5736087 L64.7370156,19.3106244 L33,51.04764 L33,112 L97,112 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/import-button": {
"title": "$:/core/images/import-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-import-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M105.449437,94.2138951 C105.449437,94.2138951 110.049457,94.1897106 110.049457,99.4026111 C110.049457,104.615512 105.163246,104.615511 105.163246,104.615511 L45.0075072,105.157833 C45.0075072,105.157833 0.367531803,106.289842 0.367532368,66.6449212 C0.367532934,27.0000003 45.0428249,27.0000003 45.0428249,27.0000003 L105.532495,27.0000003 C105.532495,27.0000003 138.996741,25.6734987 138.996741,55.1771866 C138.996741,84.6808745 105.727102,82.8457535 105.727102,82.8457535 L56.1735087,82.8457535 C56.1735087,82.8457535 22.6899229,85.1500223 22.6899229,66.0913753 C22.6899229,47.0327282 56.1735087,49.3383013 56.1735087,49.3383013 L105.727102,49.3383013 C105.727102,49.3383013 111.245209,49.3383024 111.245209,54.8231115 C111.245209,60.3079206 105.727102,60.5074524 105.727102,60.5074524 L56.1735087,60.5074524 C56.1735087,60.5074524 37.48913,60.5074528 37.48913,66.6449195 C37.48913,72.7823862 56.1735087,71.6766023 56.1735087,71.6766023 L105.727102,71.6766029 C105.727102,71.6766029 127.835546,73.1411469 127.835546,55.1771866 C127.835546,35.5304025 105.727102,38.3035317 105.727102,38.3035317 L45.0428249,38.3035317 C45.0428249,38.3035317 11.5287276,38.3035313 11.5287276,66.6449208 C11.5287276,94.9863103 45.0428244,93.9579678 45.0428244,93.9579678 L105.449437,94.2138951 Z\" transform=\"translate(69.367532, 66.000000) rotate(-45.000000) translate(-69.367532, -66.000000) \"></path>\n </g>\n</svg>"
},
"$:/core/images/info-button": {
"title": "$:/core/images/info-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <g transform=\"translate(0.049406, 0.000000)\">\n <path d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z\"></path>\n <circle cx=\"64\" cy=\"32\" r=\"8\"></circle>\n <rect x=\"56\" y=\"48\" width=\"16\" height=\"56\" rx=\"8\"></rect>\n </g>\n </g>\n</svg>"
},
"$:/core/images/italic": {
"title": "$:/core/images/italic",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-italic tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <polygon points=\"66.7114846 0 89.1204482 0 62.4089636 128 40 128\"></polygon>\n </g>\n</svg>"
},
"$:/core/images/left-arrow": {
"title": "$:/core/images/left-arrow",
"created": "20150315234410875",
"modified": "20150315235324760",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-left-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <path transform=\"rotate(135, 63.8945, 64.1752)\" d=\"m109.07576,109.35336c-1.43248,1.43361 -3.41136,2.32182 -5.59717,2.32182l-79.16816,0c-4.36519,0 -7.91592,-3.5444 -7.91592,-7.91666c0,-4.36337 3.54408,-7.91667 7.91592,-7.91667l71.25075,0l0,-71.25075c0,-4.3652 3.54442,-7.91592 7.91667,-7.91592c4.36336,0 7.91667,3.54408 7.91667,7.91592l0,79.16815c0,2.1825 -0.88602,4.16136 -2.3185,5.59467l-0.00027,-0.00056z\"/>\n</svg>\n"
},
"$:/core/images/line-width": {
"title": "$:/core/images/line-width",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-line-width tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M128,-97 L112.992786,-97 C112.452362,-97 112,-96.5522847 112,-96 C112,-95.4438648 112.444486,-95 112.992786,-95 L128,-95 L128,-97 Z M128,-78.6794919 L111.216185,-88.3696322 C110.748163,-88.6398444 110.132549,-88.4782926 109.856406,-88 C109.578339,-87.5183728 109.741342,-86.9117318 110.216185,-86.6375814 L128,-76.3700908 L128,-78.6794919 Z M78.6794919,-128 L88.3696322,-111.216185 C88.6437826,-110.741342 88.4816272,-110.134474 88,-109.856406 C87.5217074,-109.580264 86.9077936,-109.748163 86.6375814,-110.216185 L76.3700908,-128 L78.6794919,-128 Z M97,-128 L97,-112.992786 C97,-112.444486 96.5561352,-112 96,-112 C95.4477153,-112 95,-112.452362 95,-112.992786 L95,-128 L97,-128 Z M115.629909,-128 L105.362419,-110.216185 C105.088268,-109.741342 104.481627,-109.578339 104,-109.856406 C103.521707,-110.132549 103.360156,-110.748163 103.630368,-111.216185 L113.320508,-128 L115.629909,-128 Z M128,-113.320508 L111.216185,-103.630368 C110.741342,-103.356217 110.134474,-103.518373 109.856406,-104 C109.580264,-104.478293 109.748163,-105.092206 110.216185,-105.362419 L128,-115.629909 L128,-113.320508 Z M48,-96 C48,-96.5522847 48.4523621,-97 48.9927864,-97 L79.0072136,-97 C79.5555144,-97 80,-96.5561352 80,-96 C80,-95.4477153 79.5476379,-95 79.0072136,-95 L48.9927864,-95 C48.4444856,-95 48,-95.4438648 48,-96 Z M54.4307806,-120 C54.706923,-120.478293 55.3225377,-120.639844 55.7905589,-120.369632 L81.7838153,-105.362419 C82.2586577,-105.088268 82.4216611,-104.481627 82.1435935,-104 C81.8674512,-103.521707 81.2518365,-103.360156 80.7838153,-103.630368 L54.7905589,-118.637581 C54.3157165,-118.911732 54.152713,-119.518373 54.4307806,-120 Z M104,-82.1435935 C104.478293,-82.4197359 105.092206,-82.2518365 105.362419,-81.7838153 L120.369632,-55.7905589 C120.643783,-55.3157165 120.481627,-54.7088482 120,-54.4307806 C119.521707,-54.1546382 118.907794,-54.3225377 118.637581,-54.7905589 L103.630368,-80.7838153 C103.356217,-81.2586577 103.518373,-81.865526 104,-82.1435935 Z M96,-80 C96.5522847,-80 97,-79.5476379 97,-79.0072136 L97,-48.9927864 C97,-48.4444856 96.5561352,-48 96,-48 C95.4477153,-48 95,-48.4523621 95,-48.9927864 L95,-79.0072136 C95,-79.5555144 95.4438648,-80 96,-80 Z M88,-82.1435935 C88.4782926,-81.8674512 88.6398444,-81.2518365 88.3696322,-80.7838153 L73.3624186,-54.7905589 C73.0882682,-54.3157165 72.4816272,-54.152713 72,-54.4307806 C71.5217074,-54.706923 71.3601556,-55.3225377 71.6303678,-55.7905589 L86.6375814,-81.7838153 C86.9117318,-82.2586577 87.5183728,-82.4216611 88,-82.1435935 Z M82.1435935,-88 C82.4197359,-87.5217074 82.2518365,-86.9077936 81.7838153,-86.6375814 L55.7905589,-71.6303678 C55.3157165,-71.3562174 54.7088482,-71.5183728 54.4307806,-72 C54.1546382,-72.4782926 54.3225377,-73.0922064 54.7905589,-73.3624186 L80.7838153,-88.3696322 C81.2586577,-88.6437826 81.865526,-88.4816272 82.1435935,-88 Z M1.30626177e-08,-41.9868843 L15.0170091,-57.9923909 L20.7983821,-52.9749272 L44.7207091,-81.2095939 L73.4260467,-42.1002685 L85.984793,-56.6159488 L104.48741,-34.0310661 L127.969109,-47.4978019 L127.969109,7.99473128e-07 L1.30626177e-08,7.99473128e-07 L1.30626177e-08,-41.9868843 Z M96,-84 C102.627417,-84 108,-89.372583 108,-96 C108,-102.627417 102.627417,-108 96,-108 C89.372583,-108 84,-102.627417 84,-96 C84,-89.372583 89.372583,-84 96,-84 Z\"></path>\n <path d=\"M16,18 L112,18 C113.104569,18 114,17.1045695 114,16 C114,14.8954305 113.104569,14 112,14 L16,14 C14.8954305,14 14,14.8954305 14,16 C14,17.1045695 14.8954305,18 16,18 L16,18 Z M16,35 L112,35 C114.209139,35 116,33.209139 116,31 C116,28.790861 114.209139,27 112,27 L16,27 C13.790861,27 12,28.790861 12,31 C12,33.209139 13.790861,35 16,35 L16,35 Z M16,56 L112,56 C115.313708,56 118,53.3137085 118,50 C118,46.6862915 115.313708,44 112,44 L16,44 C12.6862915,44 10,46.6862915 10,50 C10,53.3137085 12.6862915,56 16,56 L16,56 Z M16,85 L112,85 C117.522847,85 122,80.5228475 122,75 C122,69.4771525 117.522847,65 112,65 L16,65 C10.4771525,65 6,69.4771525 6,75 C6,80.5228475 10.4771525,85 16,85 L16,85 Z M16,128 L112,128 C120.836556,128 128,120.836556 128,112 C128,103.163444 120.836556,96 112,96 L16,96 C7.163444,96 0,103.163444 0,112 C0,120.836556 7.163444,128 16,128 L16,128 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/link": {
"title": "$:/core/images/link",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-link tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M128.719999,57.568543 C130.219553,53.8628171 131.045202,49.8121445 131.045202,45.5685425 C131.045202,27.8915447 116.718329,13.5685425 99.0452364,13.5685425 L67.0451674,13.5685425 C49.3655063,13.5685425 35.0452019,27.8954305 35.0452019,45.5685425 C35.0452019,63.2455403 49.3720745,77.5685425 67.0451674,77.5685425 L99.0452364,77.5685425 C100.406772,77.5685425 101.748384,77.4835732 103.065066,77.3186499 C96.4792444,73.7895096 91.1190212,68.272192 87.7873041,61.5685425 L67.0506214,61.5685425 C58.2110723,61.5685425 51.0452019,54.4070414 51.0452019,45.5685425 C51.0452019,36.7319865 58.2005234,29.5685425 67.0506214,29.5685425 L99.0397824,29.5685425 C107.879331,29.5685425 115.045202,36.7300436 115.045202,45.5685425 C115.045202,48.9465282 113.99957,52.0800164 112.21335,54.6623005 C114.314383,56.4735917 117.050039,57.5685425 120.041423,57.5685425 L128.720003,57.5685425 Z\" transform=\"translate(83.045202, 45.568542) rotate(-225.000000) translate(-83.045202, -45.568542)\"></path>\n <path d=\"M-0.106255113,71.0452019 C-1.60580855,74.7509276 -2.43145751,78.8016001 -2.43145751,83.0452019 C-2.43145751,100.7222 11.8954151,115.045202 29.568508,115.045202 L61.568577,115.045202 C79.2482381,115.045202 93.5685425,100.718314 93.5685425,83.0452019 C93.5685425,65.3682041 79.2416699,51.0452019 61.568577,51.0452019 L29.568508,51.0452019 C28.206973,51.0452019 26.8653616,51.1301711 25.5486799,51.2950943 C32.1345,54.8242347 37.4947231,60.3415524 40.8264403,67.0452019 L61.563123,67.0452019 C70.4026721,67.0452019 77.5685425,74.206703 77.5685425,83.0452019 C77.5685425,91.8817579 70.413221,99.0452019 61.563123,99.0452019 L29.573962,99.0452019 C20.7344129,99.0452019 13.5685425,91.8837008 13.5685425,83.0452019 C13.5685425,79.6672162 14.6141741,76.533728 16.4003949,73.9514439 C14.2993609,72.1401527 11.5637054,71.0452019 8.5723215,71.0452019 L-0.106255113,71.0452019 Z\" transform=\"translate(45.568542, 83.045202) rotate(-225.000000) translate(-45.568542, -83.045202)\"></path>\n </g>\n</svg>"
},
"$:/core/images/linkify": {
"title": "$:/core/images/linkify",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\"><path d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\" fill-rule=\"evenodd\"/></svg>"
},
"$:/core/images/list-bullet": {
"title": "$:/core/images/list-bullet",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-list-bullet tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M11.6363636,40.2727273 C18.0629498,40.2727273 23.2727273,35.0629498 23.2727273,28.6363636 C23.2727273,22.2097775 18.0629498,17 11.6363636,17 C5.20977746,17 0,22.2097775 0,28.6363636 C0,35.0629498 5.20977746,40.2727273 11.6363636,40.2727273 Z M11.6363636,75.1818182 C18.0629498,75.1818182 23.2727273,69.9720407 23.2727273,63.5454545 C23.2727273,57.1188684 18.0629498,51.9090909 11.6363636,51.9090909 C5.20977746,51.9090909 0,57.1188684 0,63.5454545 C0,69.9720407 5.20977746,75.1818182 11.6363636,75.1818182 Z M11.6363636,110.090909 C18.0629498,110.090909 23.2727273,104.881132 23.2727273,98.4545455 C23.2727273,92.0279593 18.0629498,86.8181818 11.6363636,86.8181818 C5.20977746,86.8181818 0,92.0279593 0,98.4545455 C0,104.881132 5.20977746,110.090909 11.6363636,110.090909 Z M34.9090909,22.8181818 L128,22.8181818 L128,34.4545455 L34.9090909,34.4545455 L34.9090909,22.8181818 Z M34.9090909,57.7272727 L128,57.7272727 L128,69.3636364 L34.9090909,69.3636364 L34.9090909,57.7272727 Z M34.9090909,92.6363636 L128,92.6363636 L128,104.272727 L34.9090909,104.272727 L34.9090909,92.6363636 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/list-number": {
"title": "$:/core/images/list-number",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-list-number tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M33.8390805,22.3563218 L128,22.3563218 L128,34.1264368 L33.8390805,34.1264368 L33.8390805,22.3563218 Z M33.8390805,57.6666667 L128,57.6666667 L128,69.4367816 L33.8390805,69.4367816 L33.8390805,57.6666667 Z M33.8390805,92.9770115 L128,92.9770115 L128,104.747126 L33.8390805,104.747126 L33.8390805,92.9770115 Z M0.379509711,42.6307008 L0.379509711,40.4082314 L1.37821948,40.4082314 C2.20382368,40.4082314 2.82301754,40.268077 3.23581964,39.9877642 C3.64862174,39.7074513 3.85501969,39.0400498 3.85501969,37.9855395 L3.85501969,22.7686318 C3.85501969,21.3270228 3.66193774,20.4327047 3.27576803,20.0856507 C2.88959832,19.7385967 1.79768657,19.5650723 0,19.5650723 L0,17.4226919 C3.50215975,17.2758613 6.25191314,16.4683055 8.24934266,15 L10.3666074,15 L10.3666074,37.865406 C10.3666074,38.786434 10.5164123,39.4404875 10.8160268,39.8275862 C11.1156412,40.2146849 11.764796,40.4082314 12.7635108,40.4082314 L13.7622206,40.4082314 L13.7622206,42.6307008 L0.379509711,42.6307008 Z M0.0798967812,77.9873934 L0.0798967812,76.0852799 C7.27064304,69.5312983 10.8659622,63.5046623 10.8659622,58.005191 C10.8659622,56.4434479 10.5397203,55.195407 9.88722667,54.2610308 C9.23473303,53.3266546 8.36253522,52.8594735 7.27060709,52.8594735 C6.3784219,52.8594735 5.61608107,53.1764892 4.98356173,53.8105302 C4.35104238,54.4445712 4.03478745,55.1753759 4.03478745,56.0029663 C4.03478745,56.9773871 4.28113339,57.8316611 4.77383268,58.5658139 C4.88036225,58.7259926 4.93362624,58.8461249 4.93362624,58.9262143 C4.93362624,59.0730449 4.77383427,59.2065252 4.45424555,59.3266593 C4.2411864,59.4067486 3.70188852,59.6336652 2.83633573,60.0074156 C1.99741533,60.3811661 1.47809145,60.5680386 1.2783485,60.5680386 C1.03865696,60.5680386 0.765679018,60.1976307 0.459406492,59.4568039 C0.153133966,58.715977 0,57.9184322 0,57.0641453 C0,55.1153036 0.848894811,53.5202138 2.5467099,52.2788283 C4.24452499,51.0374428 6.34512352,50.4167594 8.84856852,50.4167594 C11.3120649,50.4167594 13.3793735,51.0874979 15.0505562,52.4289952 C16.7217389,53.7704924 17.5573177,55.5224215 17.5573177,57.684835 C17.5573177,58.9662652 17.2743527,60.2076321 16.7084144,61.4089729 C16.142476,62.6103138 14.7875733,64.4623531 12.6436656,66.9651465 C10.4997579,69.4679398 8.40914641,71.7804862 6.3717683,73.902855 L17.8169822,73.902855 L16.7982982,79.6292176 L14.6810335,79.6292176 C14.7609307,79.3489048 14.8008787,79.0952922 14.8008787,78.8683723 C14.8008787,78.4812736 14.7010087,78.237672 14.5012658,78.1375603 C14.3015228,78.0374485 13.9020429,77.9873934 13.3028141,77.9873934 L0.0798967812,77.9873934 Z M12.2042333,97.1935484 C13.9486551,97.2335931 15.4400468,97.8309175 16.6784531,98.9855395 C17.9168594,100.140162 18.5360532,101.75861 18.5360532,103.840934 C18.5360532,106.830938 17.4041935,109.233584 15.14044,111.048943 C12.8766866,112.864303 10.1402492,113.771969 6.93104577,113.771969 C4.92030005,113.771969 3.26245842,113.388213 1.95747114,112.62069 C0.652483855,111.853166 0,110.848727 0,109.607341 C0,108.833144 0.26964894,108.209124 0.808954909,107.735261 C1.34826088,107.261399 1.93749375,107.024472 2.57667119,107.024472 C3.21584864,107.024472 3.73850152,107.224692 4.14464552,107.625139 C4.55078953,108.025586 4.92696644,108.67964 5.27318756,109.587319 C5.73925445,110.855401 6.51158227,111.489433 7.59019421,111.489433 C8.85523291,111.489433 9.87723568,111.012241 10.6562332,110.057842 C11.4352307,109.103444 11.8247236,107.371536 11.8247236,104.862069 C11.8247236,103.153495 11.7048796,101.838714 11.4651881,100.917686 C11.2254966,99.9966584 10.6728827,99.5361513 9.80732989,99.5361513 C9.22141723,99.5361513 8.62219737,99.843156 8.00965231,100.457175 C7.51695303,100.951059 7.07752513,101.197998 6.69135542,101.197998 C6.3584505,101.197998 6.08880156,101.051169 5.88240051,100.757508 C5.67599946,100.463847 5.57280049,100.183539 5.57280049,99.916574 C5.57280049,99.5962164 5.67599946,99.3225818 5.88240051,99.0956618 C6.08880156,98.8687419 6.57150646,98.5016711 7.33052967,97.9944383 C10.2068282,96.0722929 11.6449559,93.9766521 11.6449559,91.7074527 C11.6449559,90.5194601 11.3386879,89.615131 10.7261429,88.9944383 C10.1135978,88.3737455 9.37455999,88.0634038 8.5090072,88.0634038 C7.71003539,88.0634038 6.98431355,88.3270274 6.33181991,88.8542825 C5.67932627,89.3815377 5.35308434,90.0122321 5.35308434,90.7463849 C5.35308434,91.3871 5.60608828,91.9810874 6.11210376,92.5283648 C6.28521432,92.7285883 6.3717683,92.8954387 6.3717683,93.028921 C6.3717683,93.1490551 5.80250943,93.4560598 4.6639746,93.9499444 C3.52543978,94.4438289 2.80970494,94.6907675 2.51674861,94.6907675 C2.10394651,94.6907675 1.76771758,94.3570667 1.50805174,93.6896552 C1.24838591,93.0222436 1.11855494,92.4082342 1.11855494,91.8476085 C1.11855494,90.0989901 2.04734573,88.6240327 3.90495518,87.4226919 C5.76256463,86.2213511 7.86982116,85.6206897 10.226788,85.6206897 C12.2907985,85.6206897 14.0784711,86.0678487 15.5898594,86.9621802 C17.1012478,87.8565117 17.8569306,89.0778566 17.8569306,90.6262514 C17.8569306,91.987771 17.2876717,93.2491599 16.1491369,94.4104561 C15.0106021,95.5717522 13.6956474,96.4994404 12.2042333,97.1935484 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/list": {
"title": "$:/core/images/list",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-list tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M0.719999312,185.568543 C2.21955287,181.862817 3.0452019,177.812144 3.0452019,173.568542 C3.0452019,155.891545 -11.2816707,141.568542 -28.9547636,141.568542 L-60.9548326,141.568542 C-78.6344937,141.568542 -92.9547981,155.895431 -92.9547981,173.568542 C-92.9547981,191.24554 -78.6279255,205.568542 -60.9548326,205.568542 L-28.9547636,205.568542 C-27.593228,205.568542 -26.2516158,205.483573 -24.9349335,205.31865 C-31.5207556,201.78951 -36.8809788,196.272192 -40.2126959,189.568542 L-60.9493786,189.568542 C-69.7889277,189.568542 -76.9547981,182.407041 -76.9547981,173.568542 C-76.9547981,164.731986 -69.7994766,157.568542 -60.9493786,157.568542 L-28.9602176,157.568542 C-20.1206685,157.568542 -12.9547981,164.730044 -12.9547981,173.568542 C-12.9547981,176.946528 -14.0004297,180.080016 -15.7866505,182.6623 C-13.6856165,184.473592 -10.949961,185.568542 -7.9585771,185.568542 L0.720002586,185.568542 Z\" transform=\"translate(-44.954798, 173.568542) rotate(-225.000000) translate(44.954798, -173.568542) \"></path>\n <path d=\"M87.7480315,128 L23.9992458,128 C19.5813843,128 16,124.409247 16,119.993027 L16,8.00697327 C16,3.58484404 19.5881049,0 23.9992458,0 L104.000754,0 C108.418616,0 112,3.59075293 112,8.00697327 L112,104 L91.2492027,104 C90.2848199,104 89.410573,104.391703 88.7768998,105.025201 C88.1373658,105.661376 87.7480315,106.53563 87.7480315,107.501171 L87.7480315,128 Z M95.7480315,127.879386 L111.627417,112 L95.7480315,112 L95.7480315,127.879386 Z M40,15.5089165 C40,13.5709954 41.5636015,12 43.4998101,12 L98.5001899,12 C100.433082,12 102,13.5614718 102,15.5089165 L102,16.4910835 C102,18.4290046 100.436399,20 98.5001899,20 L43.4998101,20 C41.5669183,20 40,18.4385282 40,16.4910835 L40,15.5089165 Z M32,22 C35.3137085,22 38,19.3137085 38,16 C38,12.6862915 35.3137085,10 32,10 C28.6862915,10 26,12.6862915 26,16 C26,19.3137085 28.6862915,22 32,22 Z M40,31.5089165 C40,29.5709954 41.5636015,28 43.4998101,28 L98.5001899,28 C100.433082,28 102,29.5614718 102,31.5089165 L102,32.4910835 C102,34.4290046 100.436399,36 98.5001899,36 L43.4998101,36 C41.5669183,36 40,34.4385282 40,32.4910835 L40,31.5089165 Z M40,47.5089165 C40,45.5709954 41.5636015,44 43.4998101,44 L98.5001899,44 C100.433082,44 102,45.5614718 102,47.5089165 L102,48.4910835 C102,50.4290046 100.436399,52 98.5001899,52 L43.4998101,52 C41.5669183,52 40,50.4385282 40,48.4910835 L40,47.5089165 Z M40,63.5089165 C40,61.5709954 41.5636015,60 43.4998101,60 L98.5001899,60 C100.433082,60 102,61.5614718 102,63.5089165 L102,64.4910835 C102,66.4290046 100.436399,68 98.5001899,68 L43.4998101,68 C41.5669183,68 40,66.4385282 40,64.4910835 L40,63.5089165 Z M40,79.5089165 C40,77.5709954 41.5636015,76 43.4998101,76 L98.5001899,76 C100.433082,76 102,77.5614718 102,79.5089165 L102,80.4910835 C102,82.4290046 100.436399,84 98.5001899,84 L43.4998101,84 C41.5669183,84 40,82.4385282 40,80.4910835 L40,79.5089165 Z M40,95.5089165 C40,93.5709954 41.5636015,92 43.4998101,92 L98.5001899,92 C100.433082,92 102,93.5614718 102,95.5089165 L102,96.4910835 C102,98.4290046 100.436399,100 98.5001899,100 L43.4998101,100 C41.5669183,100 40,98.4385282 40,96.4910835 L40,95.5089165 Z M40,111.508916 C40,109.570995 41.5680474,108 43.4972017,108 L76.5027983,108 C78.4342495,108 80,109.561472 80,111.508916 L80,112.491084 C80,114.429005 78.4319526,116 76.5027983,116 L43.4972017,116 C41.5657505,116 40,114.438528 40,112.491084 L40,111.508916 Z M32,38 C35.3137085,38 38,35.3137085 38,32 C38,28.6862915 35.3137085,26 32,26 C28.6862915,26 26,28.6862915 26,32 C26,35.3137085 28.6862915,38 32,38 Z M32,54 C35.3137085,54 38,51.3137085 38,48 C38,44.6862915 35.3137085,42 32,42 C28.6862915,42 26,44.6862915 26,48 C26,51.3137085 28.6862915,54 32,54 Z M32,70 C35.3137085,70 38,67.3137085 38,64 C38,60.6862915 35.3137085,58 32,58 C28.6862915,58 26,60.6862915 26,64 C26,67.3137085 28.6862915,70 32,70 Z M32,86 C35.3137085,86 38,83.3137085 38,80 C38,76.6862915 35.3137085,74 32,74 C28.6862915,74 26,76.6862915 26,80 C26,83.3137085 28.6862915,86 32,86 Z M32,102 C35.3137085,102 38,99.3137085 38,96 C38,92.6862915 35.3137085,90 32,90 C28.6862915,90 26,92.6862915 26,96 C26,99.3137085 28.6862915,102 32,102 Z M32,118 C35.3137085,118 38,115.313708 38,112 C38,108.686292 35.3137085,106 32,106 C28.6862915,106 26,108.686292 26,112 C26,115.313708 28.6862915,118 32,118 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/locked-padlock": {
"title": "$:/core/images/locked-padlock",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-locked-padlock tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M96.4723753,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L32.0000269,64 C32.0028554,48.2766389 32.3030338,16.2688026 64.1594984,16.2688041 C95.9543927,16.2688056 96.4648869,48.325931 96.4723753,64 Z M80.5749059,64 L48.4413579,64 C48.4426205,47.71306 48.5829272,31.9999996 64.1595001,31.9999996 C79.8437473,31.9999996 81.1369461,48.1359182 80.5749059,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/mail": {
"title": "$:/core/images/mail",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-mail tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M122.826782,104.894066 C121.945525,105.22777 120.990324,105.41043 119.993027,105.41043 L8.00697327,105.41043 C7.19458381,105.41043 6.41045219,105.289614 5.67161357,105.064967 L5.67161357,105.064967 L39.8346483,70.9019325 L60.6765759,91.7438601 C61.6118278,92.679112 62.8865166,93.0560851 64.0946097,92.8783815 C65.2975108,93.0473238 66.5641085,92.6696979 67.4899463,91.7438601 L88.5941459,70.6396605 C88.6693095,70.7292352 88.7490098,70.8162939 88.8332479,70.9005321 L122.826782,104.894066 Z M127.903244,98.6568194 C127.966933,98.2506602 128,97.8343714 128,97.4103789 L128,33.410481 C128,32.7414504 127.917877,32.0916738 127.763157,31.4706493 L94.2292399,65.0045665 C94.3188145,65.0797417 94.4058701,65.1594458 94.4901021,65.2436778 L127.903244,98.6568194 Z M0.205060636,99.2178117 C0.0709009529,98.6370366 0,98.0320192 0,97.4103789 L0,33.410481 C0,32.694007 0.0944223363,31.9995312 0.27147538,31.3387595 L0.27147538,31.3387595 L34.1777941,65.2450783 L0.205060636,99.2178117 L0.205060636,99.2178117 Z M5.92934613,25.6829218 C6.59211333,25.5051988 7.28862283,25.4104299 8.00697327,25.4104299 L119.993027,25.4104299 C120.759109,25.4104299 121.500064,25.5178649 122.201605,25.7184927 L122.201605,25.7184927 L64.0832611,83.8368368 L5.92934613,25.6829218 L5.92934613,25.6829218 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/menu-button": {
"title": "$:/core/images/menu-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <rect x=\"0\" y=\"16\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"56\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"96\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n</svg>"
},
"$:/core/images/mono-block": {
"title": "$:/core/images/mono-block",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-mono-block tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M23.9653488,32.9670593 L24.3217888,32.9670593 C25.0766067,32.9670593 25.6497006,33.1592554 26.0410876,33.5436534 C26.4324747,33.9280514 26.6281653,34.4906619 26.6281653,35.2315017 C26.6281653,36.0562101 26.4219913,36.6502709 26.009637,37.0137017 C25.5972828,37.3771326 24.9158602,37.5588453 23.9653488,37.5588453 L17.6542639,37.5588453 C16.6897744,37.5588453 16.0048573,37.380627 15.5994921,37.0241852 C15.1941269,36.6677435 14.9914474,36.0701882 14.9914474,35.2315017 C14.9914474,34.4207713 15.1941269,33.8406885 15.5994921,33.4912358 C16.0048573,33.141783 16.6897744,32.9670593 17.6542639,32.9670593 L18.388111,32.9670593 L17.5284616,30.5139133 L8.47069195,30.5139133 L7.5691084,32.9670593 L8.30295547,32.9670593 C9.25346691,32.9670593 9.93488953,33.1452775 10.3472438,33.5017193 C10.759598,33.8581611 10.965772,34.4347494 10.965772,35.2315017 C10.965772,36.0562101 10.759598,36.6502709 10.3472438,37.0137017 C9.93488953,37.3771326 9.25346691,37.5588453 8.30295547,37.5588453 L2.89345418,37.5588453 C1.92896463,37.5588453 1.24404754,37.3771326 0.838682371,37.0137017 C0.433317198,36.6502709 0.230637652,36.0562101 0.230637652,35.2315017 C0.230637652,34.4906619 0.426328248,33.9280514 0.817715312,33.5436534 C1.20910238,33.1592554 1.78219626,32.9670593 2.53701417,32.9670593 L2.89345418,32.9670593 L8.51262607,17.3256331 L6.83526132,17.3256331 C5.88474988,17.3256331 5.20332727,17.1439204 4.79097304,16.7804895 C4.37861882,16.4170587 4.1724448,15.8299869 4.1724448,15.0192565 C4.1724448,14.1945481 4.37861882,13.6004873 4.79097304,13.2370565 C5.20332727,12.8736257 5.88474988,12.691913 6.83526132,12.691913 L14.6979086,12.691913 C15.9419603,12.691913 16.815579,13.3628521 17.318791,14.7047506 L17.318791,14.7676518 L23.9653488,32.9670593 Z M12.9786097,17.3256331 L9.9383861,26.1737321 L16.0188333,26.1737321 L12.9786097,17.3256331 Z M35.3809383,26.6979086 L35.3809383,33.0928616 L38.5259972,33.0928616 C40.7485166,33.0928616 42.3140414,32.8482484 43.2226185,32.3590146 C44.1311956,31.8697807 44.5854773,31.0520736 44.5854773,29.9058686 C44.5854773,28.7456855 44.1521624,27.9209895 43.2855197,27.4317556 C42.4188769,26.9425218 40.9022748,26.6979086 38.7356678,26.6979086 L35.3809383,26.6979086 Z M46.0741385,24.370565 C47.5977525,24.9296893 48.7159844,25.6949794 49.428868,26.666458 C50.1417516,27.6379366 50.498188,28.8784752 50.498188,30.388111 C50.498188,31.6601189 50.1906743,32.8202846 49.5756374,33.8686428 C48.9606006,34.917001 48.0799929,35.7766419 46.933788,36.4475911 C46.2628387,36.8389782 45.5115266,37.1220307 44.6798291,37.296757 C43.8481316,37.4714834 42.6704935,37.5588453 41.1468796,37.5588453 L39.3856466,37.5588453 L30.2020747,37.5588453 C29.2795194,37.5588453 28.6190637,37.3771326 28.2206876,37.0137017 C27.8223114,36.6502709 27.6231264,36.0562101 27.6231264,35.2315017 C27.6231264,34.4906619 27.811828,33.9280514 28.189237,33.5436534 C28.5666459,33.1592554 29.118773,32.9670593 29.8456347,32.9670593 L30.2020747,32.9670593 L30.2020747,17.3256331 L29.8456347,17.3256331 C29.118773,17.3256331 28.5666459,17.1299425 28.189237,16.7385554 C27.811828,16.3471683 27.6231264,15.7740744 27.6231264,15.0192565 C27.6231264,14.2085262 27.8258059,13.6179599 28.2311711,13.24754 C28.6365363,12.8771201 29.2934976,12.691913 30.2020747,12.691913 L39.8469219,12.691913 C42.796303,12.691913 45.0362615,13.2650068 46.5668644,14.4112118 C48.0974674,15.5574168 48.8627574,17.2347648 48.8627574,19.443306 C48.8627574,20.5335986 48.6286276,21.4945792 48.1603609,22.3262767 C47.6920943,23.1579742 46.9966938,23.8393968 46.0741385,24.370565 L46.0741385,24.370565 Z M35.3809383,17.1998307 L35.3809383,22.4835296 L38.2114913,22.4835296 C39.9307988,22.4835296 41.1433816,22.2808501 41.8492761,21.8754849 C42.5551706,21.4701197 42.9081126,20.7852027 42.9081126,19.8207131 C42.9081126,18.912136 42.5901154,18.2481858 41.9541114,17.8288425 C41.3181074,17.4094992 40.2872373,17.1998307 38.8614701,17.1998307 L35.3809383,17.1998307 Z M71.244119,13.3838259 C71.5236812,12.880614 71.8102281,12.5241775 72.1037684,12.3145059 C72.3973087,12.1048342 72.7677231,12 73.2150226,12 C73.8999499,12 74.3856819,12.1817127 74.6722332,12.5451435 C74.9587844,12.9085744 75.1020579,13.5305909 75.1020579,14.4112118 L75.143992,19.8626472 C75.143992,20.8271368 74.9867406,21.4771091 74.6722332,21.8125837 C74.3577257,22.1480584 73.7881263,22.3157932 72.9634178,22.3157932 C72.3763372,22.3157932 71.92555,22.1760142 71.6110425,21.896452 C71.2965351,21.6168898 71.0274605,21.0997075 70.8038107,20.3448896 C70.4403799,19.0169692 69.8602971,18.0629775 69.0635448,17.482886 C68.2667926,16.9027945 67.1625385,16.612753 65.7507494,16.612753 C63.5981206,16.612753 61.9487284,17.3396038 60.8025235,18.7933272 C59.6563185,20.2470506 59.0832246,22.3507245 59.0832246,25.104412 C59.0832246,27.8441215 59.6633074,29.9477954 60.8234905,31.4154969 C61.9836736,32.8831984 63.6400547,33.6170381 65.7926836,33.6170381 C67.2603851,33.6170381 68.878327,33.1278116 70.6465578,32.149344 C72.4147886,31.1708763 73.5295261,30.6816498 73.9908037,30.6816498 C74.53595,30.6816498 74.9937262,30.9122852 75.3641461,31.3735628 C75.734566,31.8348404 75.9197732,32.4079343 75.9197732,33.0928616 C75.9197732,34.3229353 74.836486,35.4831009 72.669879,36.5733935 C70.5032721,37.663686 68.0641285,38.2088241 65.3523753,38.2088241 C61.6901107,38.2088241 58.7267959,36.9997358 56.4623422,34.5815228 C54.1978885,32.1633099 53.0656786,29.0043046 53.0656786,25.104412 C53.0656786,21.3443006 54.2118664,18.22024 56.5042763,15.7321366 C58.7966863,13.2440331 61.7040894,12 65.226573,12 C66.2190187,12 67.1974717,12.1118232 68.1619613,12.3354729 C69.1264508,12.5591227 70.1538264,12.9085702 71.244119,13.3838259 L71.244119,13.3838259 Z M81.4645862,32.9670593 L81.4645862,17.3256331 L81.1081461,17.3256331 C80.3533282,17.3256331 79.7802344,17.1299425 79.3888473,16.7385554 C78.9974602,16.3471683 78.8017696,15.7740744 78.8017696,15.0192565 C78.8017696,14.2085262 79.0114381,13.6179599 79.4307814,13.24754 C79.8501247,12.8771201 80.5280528,12.691913 81.4645862,12.691913 L85.4063933,12.691913 L86.6434498,12.691913 C89.5648747,12.691913 91.7034933,12.8177141 93.0593699,13.06932 C94.4152465,13.320926 95.5684233,13.740263 96.5189347,14.3273436 C98.210286,15.3337675 99.5067362,16.7699967 100.408324,18.6360743 C101.309912,20.5021519 101.7607,22.6582429 101.7607,25.104412 C101.7607,27.6903623 101.247012,29.9512876 100.219621,31.8872557 C99.1922296,33.8232239 97.7350336,35.2874089 95.8479888,36.2798546 C94.9953241,36.7271541 93.9959043,37.0521403 92.8496993,37.2548229 C91.7034944,37.4575055 89.9981906,37.5588453 87.7337369,37.5588453 L85.4063933,37.5588453 L81.4645862,37.5588453 C80.5000966,37.5588453 79.8151795,37.380627 79.4098143,37.0241852 C79.0044492,36.6677435 78.8017696,36.0701882 78.8017696,35.2315017 C78.8017696,34.4906619 78.9974602,33.9280514 79.3888473,33.5436534 C79.7802344,33.1592554 80.3533282,32.9670593 81.1081461,32.9670593 L81.4645862,32.9670593 Z M86.8740874,17.2417648 L86.8740874,32.9670593 L88.0692098,32.9670593 C90.7110725,32.9670593 92.6609895,32.3205814 93.9190194,31.0276063 C95.1770492,29.7346312 95.8060547,27.7462749 95.8060547,25.0624779 C95.8060547,22.4206153 95.1665658,20.4497314 93.8875688,19.1497672 C92.6085718,17.849803 90.6831161,17.1998307 88.1111439,17.1998307 C87.7756693,17.1998307 87.5205727,17.2033252 87.3458463,17.2103142 C87.1711199,17.2173033 87.0138685,17.2277867 86.8740874,17.2417648 L86.8740874,17.2417648 Z M121.94052,17.1159625 L112.190837,17.1159625 L112.190837,22.4835296 L115.88104,22.4835296 L115.88104,22.2319249 C115.88104,21.4351727 116.055763,20.841112 116.405216,20.4497249 C116.754669,20.0583378 117.285829,19.8626472 117.998713,19.8626472 C118.627728,19.8626472 119.141415,20.0408655 119.539792,20.3973072 C119.938168,20.753749 120.137353,21.2045363 120.137353,21.7496826 C120.137353,21.7776388 120.144342,21.8684951 120.15832,22.0222543 C120.172298,22.1760135 120.179287,22.3297704 120.179287,22.4835296 L120.179287,26.8237109 C120.179287,27.7602442 120.011552,28.4311834 119.676077,28.8365486 C119.340603,29.2419138 118.795465,29.4445933 118.040647,29.4445933 C117.327763,29.4445933 116.789614,29.2558917 116.426183,28.8784827 C116.062752,28.5010738 115.88104,27.9419578 115.88104,27.201118 L115.88104,26.8237109 L112.190837,26.8237109 L112.190837,33.0928616 L121.94052,33.0928616 L121.94052,30.5977816 C121.94052,29.6612482 122.118738,28.9903091 122.47518,28.5849439 C122.831622,28.1795787 123.415199,27.9768992 124.225929,27.9768992 C125.022682,27.9768992 125.592281,28.1760842 125.934745,28.5744604 C126.277208,28.9728365 126.448438,29.6472701 126.448438,30.5977816 L126.448438,35.6718099 C126.448438,36.4266278 126.30167,36.9298322 126.008129,37.1814382 C125.714589,37.4330442 125.134506,37.5588453 124.267863,37.5588453 L107.095842,37.5588453 C106.173287,37.5588453 105.512831,37.3771326 105.114455,37.0137017 C104.716079,36.6502709 104.516894,36.0562101 104.516894,35.2315017 C104.516894,34.4906619 104.705595,33.9280514 105.083004,33.5436534 C105.460413,33.1592554 106.01254,32.9670593 106.739402,32.9670593 L107.095842,32.9670593 L107.095842,17.3256331 L106.739402,17.3256331 C106.026518,17.3256331 105.477886,17.126448 105.093488,16.7280719 C104.70909,16.3296957 104.516894,15.7600963 104.516894,15.0192565 C104.516894,14.2085262 104.719573,13.6179599 105.124938,13.24754 C105.530304,12.8771201 106.187265,12.691913 107.095842,12.691913 L124.267863,12.691913 C125.120528,12.691913 125.697116,12.8212085 125.997646,13.0798036 C126.298175,13.3383986 126.448438,13.8520864 126.448438,14.6208824 L126.448438,19.3175037 C126.448438,20.2680151 126.273714,20.9494377 125.924261,21.361792 C125.574808,21.7741462 125.008703,21.9803202 124.225929,21.9803202 C123.415199,21.9803202 122.831622,21.7706517 122.47518,21.3513084 C122.118738,20.9319652 121.94052,20.254037 121.94052,19.3175037 L121.94052,17.1159625 Z M19.7719369,47.6405477 C20.037521,47.1373358 20.3205734,46.7808993 20.6211028,46.5712277 C20.9216322,46.361556 21.295541,46.2567218 21.7428405,46.2567218 C22.4277678,46.2567218 22.9134998,46.4384345 23.2000511,46.8018653 C23.4866023,47.1652962 23.6298758,47.7873127 23.6298758,48.6679336 L23.6718099,54.119369 C23.6718099,55.0838586 23.5145586,55.7338309 23.2000511,56.0693055 C22.8855436,56.4047802 22.3089553,56.572515 21.4702687,56.572515 C20.8831881,56.572515 20.4254119,56.4292415 20.0969263,56.1426902 C19.7684407,55.856139 19.4993662,55.3424512 19.2896945,54.6016114 C18.9122856,53.2597129 18.3322027,52.3022267 17.5494286,51.7291243 C16.7666545,51.1560218 15.6693894,50.8694748 14.2576003,50.8694748 C12.1049715,50.8694748 10.4590738,51.5963256 9.31985785,53.050049 C8.18064193,54.5037724 7.61104252,56.6074463 7.61104252,59.3611338 C7.61104252,62.1148214 8.20859773,64.2429566 9.40372609,65.7456034 C10.5988544,67.2482501 12.2936748,67.9995623 14.488238,67.9995623 C14.9914499,67.9995623 15.5645438,67.9401562 16.2075368,67.8213423 C16.8505299,67.7025283 17.6053364,67.5173212 18.4719792,67.2657152 L18.4719792,63.9529198 L16.1027015,63.9529198 C15.1521901,63.9529198 14.4777564,63.7781961 14.0793803,63.4287433 C13.6810042,63.0792906 13.4818191,62.4992078 13.4818191,61.6884774 C13.4818191,60.8497908 13.6810042,60.2522356 14.0793803,59.8957938 C14.4777564,59.5393521 15.1521901,59.3611338 16.1027015,59.3611338 L23.6718099,59.3611338 C24.6502776,59.3611338 25.3386891,59.5358576 25.7370653,59.8853103 C26.1354414,60.2347631 26.3346265,60.8218348 26.3346265,61.6465433 C26.3346265,62.3873831 26.1354414,62.9569825 25.7370653,63.3553586 C25.3386891,63.7537347 24.7621008,63.9529198 24.0072829,63.9529198 L23.6718099,63.9529198 L23.6718099,68.9430799 L23.6718099,69.1946846 C23.6718099,69.6419841 23.6228873,69.9529924 23.5250405,70.1277188 C23.4271937,70.3024451 23.2315031,70.4806634 22.9379628,70.6623788 C22.1412106,71.1376345 20.8762107,71.5569715 19.1429251,71.9204023 C17.4096396,72.2838332 15.6554131,72.4655459 13.8801932,72.4655459 C10.2179286,72.4655459 7.25461383,71.2564576 4.99016011,68.8382446 C2.72570638,66.4200317 1.59349651,63.2610264 1.59349651,59.3611338 C1.59349651,55.6010224 2.73968428,52.4769618 5.03209423,49.9888583 C7.32450417,47.5007549 10.2319073,46.2567218 13.7543909,46.2567218 C14.7328585,46.2567218 15.7078171,46.368545 16.6792957,46.5921947 C17.6507743,46.8158445 18.6816444,47.165292 19.7719369,47.6405477 L19.7719369,47.6405477 Z M35.611576,51.5823548 L35.611576,56.4047785 L42.4678043,56.4047785 L42.4678043,51.5823548 L42.1323314,51.5823548 C41.3775135,51.5823548 40.8009251,51.3866642 40.402549,50.9952772 C40.0041729,50.6038901 39.8049878,50.0307962 39.8049878,49.2759783 C39.8049878,48.4512699 40.0111618,47.8572091 40.4235161,47.4937783 C40.8358703,47.1303474 41.5172929,46.9486347 42.4678043,46.9486347 L47.8773056,46.9486347 C48.8278171,46.9486347 49.5022507,47.1303474 49.9006269,47.4937783 C50.299003,47.8572091 50.498188,48.4512699 50.498188,49.2759783 C50.498188,50.0307962 50.3059919,50.6038901 49.9215939,50.9952772 C49.5371959,51.3866642 48.9745854,51.5823548 48.2337456,51.5823548 L47.8773056,51.5823548 L47.8773056,67.2237811 L48.2337456,67.2237811 C48.9885636,67.2237811 49.5616574,67.4159772 49.9530445,67.8003752 C50.3444316,68.1847732 50.5401222,68.7473837 50.5401222,69.4882235 C50.5401222,70.3129319 50.3374426,70.9069927 49.9320774,71.2704235 C49.5267123,71.6338543 48.8417952,71.815567 47.8773056,71.815567 L42.4678043,71.815567 C41.5033148,71.815567 40.8183977,71.6373488 40.4130325,71.280907 C40.0076674,70.9244652 39.8049878,70.32691 39.8049878,69.4882235 C39.8049878,68.7473837 40.0041729,68.1847732 40.402549,67.8003752 C40.8009251,67.4159772 41.3775135,67.2237811 42.1323314,67.2237811 L42.4678043,67.2237811 L42.4678043,61.0384986 L35.611576,61.0384986 L35.611576,67.2237811 L35.9470489,67.2237811 C36.7018668,67.2237811 37.2784552,67.4159772 37.6768313,67.8003752 C38.0752074,68.1847732 38.2743925,68.7473837 38.2743925,69.4882235 C38.2743925,70.3129319 38.0682185,70.9069927 37.6558642,71.2704235 C37.24351,71.6338543 36.5620874,71.815567 35.611576,71.815567 L30.2020747,71.815567 C29.2375851,71.815567 28.552668,71.6373488 28.1473029,71.280907 C27.7419377,70.9244652 27.5392581,70.32691 27.5392581,69.4882235 C27.5392581,68.7473837 27.7349487,68.1847732 28.1263358,67.8003752 C28.5177229,67.4159772 29.0908168,67.2237811 29.8456347,67.2237811 L30.2020747,67.2237811 L30.2020747,51.5823548 L29.8456347,51.5823548 C29.1047949,51.5823548 28.5421844,51.3866642 28.1577864,50.9952772 C27.7733884,50.6038901 27.5811923,50.0307962 27.5811923,49.2759783 C27.5811923,48.4512699 27.7803773,47.8572091 28.1787534,47.4937783 C28.5771296,47.1303474 29.2515632,46.9486347 30.2020747,46.9486347 L35.611576,46.9486347 C36.5481093,46.9486347 37.2260374,47.1303474 37.6453807,47.4937783 C38.064724,47.8572091 38.2743925,48.4512699 38.2743925,49.2759783 C38.2743925,50.0307962 38.0752074,50.6038901 37.6768313,50.9952772 C37.2784552,51.3866642 36.7018668,51.5823548 35.9470489,51.5823548 L35.611576,51.5823548 Z M67.365213,51.5823548 L67.365213,67.2237811 L70.887679,67.2237811 C71.8381904,67.2237811 72.519613,67.4019993 72.9319673,67.7584411 C73.3443215,68.1148829 73.5504955,68.6914712 73.5504955,69.4882235 C73.5504955,70.2989538 73.340827,70.8895201 72.9214837,71.25994 C72.5021404,71.6303599 71.8242123,71.815567 70.887679,71.815567 L58.4332458,71.815567 C57.4827343,71.815567 56.8013117,71.6338543 56.3889575,71.2704235 C55.9766033,70.9069927 55.7704292,70.3129319 55.7704292,69.4882235 C55.7704292,68.6774931 55.9731088,68.0974103 56.378474,67.7479575 C56.7838391,67.3985048 57.4687562,67.2237811 58.4332458,67.2237811 L61.9557117,67.2237811 L61.9557117,51.5823548 L58.4332458,51.5823548 C57.4827343,51.5823548 56.8013117,51.4006421 56.3889575,51.0372113 C55.9766033,50.6737805 55.7704292,50.0867087 55.7704292,49.2759783 C55.7704292,48.4512699 55.9731088,47.8641981 56.378474,47.5147453 C56.7838391,47.1652926 57.4687562,46.9905689 58.4332458,46.9905689 L70.887679,46.9905689 C71.8801247,46.9905689 72.5720308,47.1652926 72.9634178,47.5147453 C73.3548049,47.8641981 73.5504955,48.4512699 73.5504955,49.2759783 C73.5504955,50.0867087 73.347816,50.6737805 72.9424508,51.0372113 C72.5370856,51.4006421 71.8521685,51.5823548 70.887679,51.5823548 L67.365213,51.5823548 Z M97.8608265,51.5823548 L97.8608265,63.1771386 L97.8608265,63.5755127 C97.8608265,65.4485794 97.7385199,66.8044357 97.493903,67.6431222 C97.2492861,68.4818088 96.8404325,69.2296264 96.26733,69.8865976 C95.5264902,70.7392623 94.4991146,71.3822457 93.1851723,71.815567 C91.87123,72.2488884 90.2917273,72.4655459 88.4466169,72.4655459 C87.1466527,72.4655459 85.8921362,72.3397448 84.6830298,72.0881388 C83.4739233,71.8365328 82.3102631,71.4591296 81.1920144,70.9559176 C80.5769776,70.6763554 80.175113,70.31293 79.9864085,69.8656305 C79.797704,69.418331 79.7033532,68.6914802 79.7033532,67.6850564 L79.7033532,63.3658422 C79.7033532,62.1637247 79.8780769,61.3250508 80.2275297,60.849795 C80.5769824,60.3745393 81.185021,60.136915 82.0516638,60.136915 C83.2957156,60.136915 83.9806326,61.0524675 84.1064356,62.8835998 C84.1204137,63.2050963 84.1413806,63.4497096 84.1693368,63.6174469 C84.3370741,65.2389076 84.7144774,66.3466561 85.301558,66.9407258 C85.8886386,67.5347954 86.8251579,67.8318258 88.1111439,67.8318258 C89.7046484,67.8318258 90.8263749,67.4089943 91.476357,66.5633187 C92.126339,65.7176431 92.4513252,64.1765796 92.4513252,61.9400821 L92.4513252,51.5823548 L88.9288593,51.5823548 C87.9783478,51.5823548 87.2969252,51.4006421 86.884571,51.0372113 C86.4722168,50.6737805 86.2660427,50.0867087 86.2660427,49.2759783 C86.2660427,48.4512699 86.4652278,47.8641981 86.8636039,47.5147453 C87.26198,47.1652926 87.9503916,46.9905689 88.9288593,46.9905689 L99.6220595,46.9905689 C100.600527,46.9905689 101.288939,47.1652926 101.687315,47.5147453 C102.085691,47.8641981 102.284876,48.4512699 102.284876,49.2759783 C102.284876,50.0867087 102.078702,50.6737805 101.666348,51.0372113 C101.253994,51.4006421 100.572571,51.5823548 99.6220595,51.5823548 L97.8608265,51.5823548 Z M112.505343,51.5823548 L112.505343,57.9353738 L118.984165,51.4565525 C118.257303,51.3726838 117.747109,51.1665098 117.453569,50.8380242 C117.160029,50.5095387 117.013261,49.9888619 117.013261,49.2759783 C117.013261,48.4512699 117.212446,47.8572091 117.610822,47.4937783 C118.009198,47.1303474 118.683632,46.9486347 119.634143,46.9486347 L124.771073,46.9486347 C125.721584,46.9486347 126.396018,47.1303474 126.794394,47.4937783 C127.19277,47.8572091 127.391955,48.4512699 127.391955,49.2759783 C127.391955,50.0447743 127.19277,50.6213627 126.794394,51.0057607 C126.396018,51.3901587 125.812441,51.5823548 125.043645,51.5823548 L124.561402,51.5823548 L118.459988,57.641835 C119.592215,58.4805215 120.626579,59.5812811 121.563113,60.9441468 C122.499646,62.3070125 123.596911,64.400203 124.854941,67.2237811 L125.127513,67.2237811 L125.546854,67.2237811 C126.371563,67.2237811 126.98659,67.4124827 127.391955,67.7898917 C127.79732,68.1673006 128,68.7334056 128,69.4882235 C128,70.3129319 127.793826,70.9069927 127.381472,71.2704235 C126.969118,71.6338543 126.287695,71.815567 125.337183,71.815567 L122.758235,71.815567 C121.626008,71.815567 120.710456,71.0537715 120.01155,69.5301576 C119.885747,69.2505954 119.787902,69.026949 119.718012,68.8592117 C118.795456,66.9022764 117.949793,65.3926632 117.180997,64.3303269 C116.412201,63.2679906 115.510627,62.2965265 114.476247,61.4159056 L112.505343,63.302941 L112.505343,67.2237811 L112.840816,67.2237811 C113.595634,67.2237811 114.172222,67.4159772 114.570599,67.8003752 C114.968975,68.1847732 115.16816,68.7473837 115.16816,69.4882235 C115.16816,70.3129319 114.961986,70.9069927 114.549631,71.2704235 C114.137277,71.6338543 113.455855,71.815567 112.505343,71.815567 L107.095842,71.815567 C106.131352,71.815567 105.446435,71.6373488 105.04107,71.280907 C104.635705,70.9244652 104.433025,70.32691 104.433025,69.4882235 C104.433025,68.7473837 104.628716,68.1847732 105.020103,67.8003752 C105.41149,67.4159772 105.984584,67.2237811 106.739402,67.2237811 L107.095842,67.2237811 L107.095842,51.5823548 L106.739402,51.5823548 C105.998562,51.5823548 105.435952,51.3866642 105.051554,50.9952772 C104.667156,50.6038901 104.474959,50.0307962 104.474959,49.2759783 C104.474959,48.4512699 104.674145,47.8572091 105.072521,47.4937783 C105.470897,47.1303474 106.14533,46.9486347 107.095842,46.9486347 L112.505343,46.9486347 C113.441877,46.9486347 114.119805,47.1303474 114.539148,47.4937783 C114.958491,47.8572091 115.16816,48.4512699 115.16816,49.2759783 C115.16816,50.0307962 114.968975,50.6038901 114.570599,50.9952772 C114.172222,51.3866642 113.595634,51.5823548 112.840816,51.5823548 L112.505343,51.5823548 Z M13.439885,96.325622 L17.4445933,84.4372993 C17.6961993,83.6545252 18.0456468,83.0849258 18.4929463,82.728484 C18.9402458,82.3720422 19.5343065,82.193824 20.2751463,82.193824 L23.5460076,82.193824 C24.496519,82.193824 25.1779416,82.3755367 25.5902958,82.7389675 C26.0026501,83.1023984 26.2088241,83.6964591 26.2088241,84.5211676 C26.2088241,85.2759855 26.009639,85.8490794 25.6112629,86.2404664 C25.2128868,86.6318535 24.6362984,86.8275441 23.8814805,86.8275441 L23.5460076,86.8275441 L24.1330852,102.46897 L24.4895252,102.46897 C25.2443431,102.46897 25.8104481,102.661166 26.187857,103.045564 C26.565266,103.429962 26.7539676,103.992573 26.7539676,104.733413 C26.7539676,105.558121 26.5547826,106.152182 26.1564064,106.515613 C25.7580303,106.879044 25.0835967,107.060756 24.1330852,107.060756 L19.4154969,107.060756 C18.4649855,107.060756 17.7905518,106.882538 17.3921757,106.526096 C16.9937996,106.169654 16.7946145,105.572099 16.7946145,104.733413 C16.7946145,103.992573 16.9868106,103.429962 17.3712086,103.045564 C17.7556066,102.661166 18.325206,102.46897 19.0800239,102.46897 L19.4154969,102.46897 L19.1219581,89.6790642 L16.0607674,99.1981091 C15.8371177,99.9109927 15.5191204,100.42468 15.1067662,100.739188 C14.694412,101.053695 14.1248126,101.210947 13.3979509,101.210947 C12.6710892,101.210947 12.0945008,101.053695 11.6681685,100.739188 C11.2418362,100.42468 10.91685,99.9109927 10.6932002,99.1981091 L7.65297664,89.6790642 L7.35943781,102.46897 L7.69491075,102.46897 C8.44972866,102.46897 9.01932808,102.661166 9.40372609,103.045564 C9.78812409,103.429962 9.98032022,103.992573 9.98032022,104.733413 C9.98032022,105.558121 9.77764067,106.152182 9.3722755,106.515613 C8.96691032,106.879044 8.29597114,107.060756 7.35943781,107.060756 L2.62088241,107.060756 C1.68434908,107.060756 1.01340989,106.879044 0.608044719,106.515613 C0.202679546,106.152182 0,105.558121 0,104.733413 C0,103.992573 0.192196121,103.429962 0.57659413,103.045564 C0.960992139,102.661166 1.53059155,102.46897 2.28540946,102.46897 L2.62088241,102.46897 L3.22892713,86.8275441 L2.89345418,86.8275441 C2.13863627,86.8275441 1.56204791,86.6318535 1.16367179,86.2404664 C0.765295672,85.8490794 0.5661106,85.2759855 0.5661106,84.5211676 C0.5661106,83.6964591 0.772284622,83.1023984 1.18463885,82.7389675 C1.59699308,82.3755367 2.27841569,82.193824 3.22892713,82.193824 L6.49978838,82.193824 C7.22665007,82.193824 7.81022738,82.3685477 8.25053783,82.7180005 C8.69084827,83.0674532 9.05077919,83.6405471 9.33034138,84.4372993 L13.439885,96.325622 Z M43.8935644,98.3803938 L43.8935644,86.8275441 L42.7403761,86.8275441 C41.8178209,86.8275441 41.1573651,86.6458314 40.758989,86.2824006 C40.3606129,85.9189697 40.1614278,85.3318979 40.1614278,84.5211676 C40.1614278,83.7104372 40.3606129,83.119871 40.758989,82.7494511 C41.1573651,82.3790312 41.8178209,82.193824 42.7403761,82.193824 L48.6950209,82.193824 C49.6035981,82.193824 50.2605593,82.3790312 50.6659245,82.7494511 C51.0712897,83.119871 51.2739692,83.7104372 51.2739692,84.5211676 C51.2739692,85.2620074 51.0817731,85.8316068 50.6973751,86.2299829 C50.3129771,86.628359 49.7643445,86.8275441 49.051461,86.8275441 L48.6950209,86.8275441 L48.6950209,105.865634 C48.6950209,106.522605 48.6251315,106.934953 48.4853504,107.10269 C48.3455693,107.270428 48.0310665,107.354295 47.5418327,107.354295 L45.4451268,107.354295 C44.7741775,107.354295 44.3024234,107.284406 44.0298503,107.144625 C43.7572771,107.004843 43.5231473,106.76023 43.3274538,106.410777 L34.6051571,91.0838571 L34.6051571,102.46897 L35.8212466,102.46897 C36.7298237,102.46897 37.379796,102.643694 37.7711831,102.993147 C38.1625701,103.3426 38.3582607,103.922682 38.3582607,104.733413 C38.3582607,105.558121 38.1590757,106.152182 37.7606995,106.515613 C37.3623234,106.879044 36.7158456,107.060756 35.8212466,107.060756 L29.8037005,107.060756 C28.8951234,107.060756 28.2381621,106.879044 27.832797,106.515613 C27.4274318,106.152182 27.2247522,105.558121 27.2247522,104.733413 C27.2247522,103.992573 27.4134539,103.429962 27.7908629,103.045564 C28.1682718,102.661166 28.7273878,102.46897 29.4682276,102.46897 L29.8037005,102.46897 L29.8037005,86.8275441 L29.4682276,86.8275441 C28.755344,86.8275441 28.203217,86.628359 27.8118299,86.2299829 C27.4204428,85.8316068 27.2247522,85.2620074 27.2247522,84.5211676 C27.2247522,83.7104372 27.4309263,83.119871 27.8432805,82.7494511 C28.2556347,82.3790312 28.9091015,82.193824 29.8037005,82.193824 L33.2422983,82.193824 C34.0670067,82.193824 34.6261227,82.3021527 34.919663,82.5188134 C35.2132033,82.7354741 35.5416839,83.1722835 35.9051148,83.8292546 L43.8935644,98.3803938 Z M64.6604624,86.3662688 C62.8572863,86.3662688 61.4420239,87.0931196 60.4146329,88.546843 C59.3872418,90.0005663 58.873554,92.0203728 58.873554,94.6063231 C58.873554,97.1922733 59.3907363,99.2190688 60.4251164,100.68677 C61.4594965,102.154472 62.8712644,102.888312 64.6604624,102.888312 C66.4636385,102.888312 67.8823953,102.157966 68.9167754,100.697254 C69.9511555,99.2365414 70.4683378,97.2062514 70.4683378,94.6063231 C70.4683378,92.0203728 69.95465,90.0005663 68.9272589,88.546843 C67.8998679,87.0931196 66.4776166,86.3662688 64.6604624,86.3662688 L64.6604624,86.3662688 Z M64.6604624,81.501911 C68.0990773,81.501911 70.929602,82.7319662 73.1521214,85.1921135 C75.3746408,87.6522607 76.4858838,90.7902992 76.4858838,94.6063231 C76.4858838,98.4503032 75.3816297,101.595331 73.1730884,104.0415 C70.9645471,106.487669 68.1270335,107.710735 64.6604624,107.710735 C61.2358256,107.710735 58.4053009,106.477185 56.1688034,104.010049 C53.9323059,101.542913 52.8140739,98.4083688 52.8140739,94.6063231 C52.8140739,90.7763211 53.9218224,87.6347881 56.1373528,85.1816299 C58.3528831,82.7284717 61.1938912,81.501911 64.6604624,81.501911 L64.6604624,81.501911 Z M87.4611651,98.1707232 L87.4611651,102.46897 L89.6207722,102.46897 C90.5293493,102.46897 91.1758272,102.643694 91.5602252,102.993147 C91.9446232,103.3426 92.1368193,103.922682 92.1368193,104.733413 C92.1368193,105.558121 91.9411287,106.152182 91.5497417,106.515613 C91.1583546,106.879044 90.5153712,107.060756 89.6207722,107.060756 L82.3661697,107.060756 C81.4436145,107.060756 80.7831587,106.879044 80.3847826,106.515613 C79.9864065,106.152182 79.7872214,105.558121 79.7872214,104.733413 C79.7872214,103.992573 79.9759231,103.429962 80.353332,103.045564 C80.730741,102.661166 81.282868,102.46897 82.0097297,102.46897 L82.3661697,102.46897 L82.3661697,86.8275441 L82.0097297,86.8275441 C81.2968461,86.8275441 80.7482136,86.628359 80.3638155,86.2299829 C79.9794175,85.8316068 79.7872214,85.2620074 79.7872214,84.5211676 C79.7872214,83.7104372 79.989901,83.119871 80.3952661,82.7494511 C80.8006313,82.3790312 81.4575926,82.193824 82.3661697,82.193824 L91.0255652,82.193824 C94.450202,82.193824 97.0396079,82.8507853 98.7938606,84.1647276 C100.548113,85.4786699 101.425227,87.414609 101.425227,89.972603 C101.425227,92.6703781 100.551608,94.7111515 98.8043442,96.0949843 C97.0570805,97.4788171 94.4641801,98.1707232 91.0255652,98.1707232 L87.4611651,98.1707232 Z M87.4611651,86.8275441 L87.4611651,93.4531348 L90.4384875,93.4531348 C92.0879044,93.4531348 93.328443,93.1735768 94.1601405,92.6144525 C94.9918381,92.0553281 95.4076806,91.2166541 95.4076806,90.0984053 C95.4076806,89.0500471 94.9778602,88.2428234 94.1182064,87.67671 C93.2585527,87.1105966 92.031992,86.8275441 90.4384875,86.8275441 L87.4611651,86.8275441 Z M114.727851,107.396229 L113.092421,109.03166 C113.69348,108.835966 114.284046,108.689198 114.864137,108.591352 C115.444229,108.493505 116.013828,108.444582 116.572953,108.444582 C117.677223,108.444582 118.840883,108.608823 120.063968,108.937308 C121.287053,109.265794 122.031376,109.430034 122.29696,109.430034 C122.744259,109.430034 123.327837,109.279772 124.047709,108.979242 C124.767582,108.678713 125.253314,108.52845 125.50492,108.52845 C126.02211,108.52845 126.45193,108.727636 126.794394,109.126012 C127.136858,109.524388 127.308087,110.024098 127.308087,110.625156 C127.308087,111.421909 126.836333,112.099837 125.892811,112.658961 C124.949288,113.218086 123.792617,113.497643 122.422762,113.497643 C121.486229,113.497643 120.28413,113.277492 118.816428,112.837181 C117.348727,112.396871 116.286406,112.176719 115.629435,112.176719 C114.636989,112.176719 113.518757,112.449288 112.274706,112.994434 C111.030654,113.53958 110.261869,113.812149 109.968329,113.812149 C109.36727,113.812149 108.857077,113.612964 108.437734,113.214588 C108.01839,112.816212 107.808722,112.337469 107.808722,111.778345 C107.808722,111.386958 107.941512,110.971115 108.207096,110.530805 C108.47268,110.090494 108.94094,109.520895 109.611889,108.821989 L111.729562,106.683349 C109.395218,105.830685 107.536157,104.29661 106.152324,102.08108 C104.768491,99.8655494 104.076585,97.3180772 104.076585,94.4385866 C104.076585,90.6365409 105.180839,87.5299526 107.389381,85.1187288 C109.597922,82.7075049 112.442425,81.501911 115.922974,81.501911 C119.389545,81.501911 122.227059,82.7109994 124.4356,85.1292123 C126.644141,87.5474252 127.748395,90.650519 127.748395,94.4385866 C127.748395,98.2126762 126.65113,101.322759 124.456567,103.768928 C122.262004,106.215097 119.480402,107.438163 116.111677,107.438163 C115.888028,107.438163 115.660887,107.434669 115.430248,107.42768 C115.199609,107.420691 114.965479,107.410207 114.727851,107.396229 L114.727851,107.396229 Z M115.922974,86.3662688 C114.119798,86.3662688 112.704535,87.0931196 111.677144,88.546843 C110.649753,90.0005663 110.136065,92.0203728 110.136065,94.6063231 C110.136065,97.1922733 110.653248,99.2190688 111.687628,100.68677 C112.722008,102.154472 114.133776,102.888312 115.922974,102.888312 C117.72615,102.888312 119.144907,102.157966 120.179287,100.697254 C121.213667,99.2365414 121.730849,97.2062514 121.730849,94.6063231 C121.730849,92.0203728 121.217161,90.0005663 120.18977,88.546843 C119.162379,87.0931196 117.740128,86.3662688 115.922974,86.3662688 L115.922974,86.3662688 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/mono-line": {
"title": "$:/core/images/mono-line",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-mono-line tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M60.4374591,84.522627 L61.3450888,84.522627 C63.2671377,84.522627 64.7264493,85.0120303 65.7230673,85.9908515 C66.7196852,86.9696727 67.2179868,88.4022896 67.2179868,90.288745 C67.2179868,92.3887615 66.6929905,93.9014625 65.6429823,94.8268935 C64.5929741,95.7523244 62.857817,96.215033 60.4374591,96.215033 L44.3670747,96.215033 C41.9111232,96.215033 40.1670679,95.7612227 39.1348565,94.8535884 C38.102645,93.9459542 37.586547,92.424355 37.586547,90.288745 C37.586547,88.2243221 38.102645,86.747214 39.1348565,85.8573766 C40.1670679,84.9675391 41.9111232,84.522627 44.3670747,84.522627 L46.235724,84.522627 L44.0467348,78.2759992 L20.9822627,78.2759992 L18.6864935,84.522627 L20.5551429,84.522627 C22.9755008,84.522627 24.7106579,84.9764373 25.7606661,85.8840716 C26.8106743,86.7917058 27.3356705,88.2599156 27.3356705,90.288745 C27.3356705,92.3887615 26.8106743,93.9014625 25.7606661,94.8268935 C24.7106579,95.7523244 22.9755008,96.215033 20.5551429,96.215033 L6.78052766,96.215033 C4.32457622,96.215033 2.58052094,95.7523244 1.54830946,94.8268935 C0.516097994,93.9014625 0,92.3887615 0,90.288745 C0,88.4022896 0.498301511,86.9696727 1.49491948,85.9908515 C2.49153745,85.0120303 3.95084902,84.522627 5.87289797,84.522627 L6.78052766,84.522627 L21.0890427,44.6937008 L16.8178442,44.6937008 C14.3974863,44.6937008 12.6623292,44.2309922 11.612321,43.3055613 C10.5623128,42.3801303 10.0373165,40.8852258 10.0373165,38.8208028 C10.0373165,36.7207864 10.5623128,35.2080854 11.612321,34.2826544 C12.6623292,33.3572234 14.3974863,32.8945149 16.8178442,32.8945149 L36.8390873,32.8945149 C40.0069087,32.8945149 42.231469,34.6029772 43.512835,38.0199531 L43.512835,38.180123 L60.4374591,84.522627 Z M32.4611088,44.6937008 L24.7195615,67.224273 L40.2026561,67.224273 L32.4611088,44.6937008 Z M89.5058233,68.5590225 L89.5058233,84.8429669 L97.5143205,84.8429669 C103.173687,84.8429669 107.160099,84.22009 109.473676,82.9743176 C111.787254,81.7285451 112.944025,79.6463566 112.944025,76.7276897 C112.944025,73.7734293 111.840643,71.6734444 109.633846,70.4276719 C107.427049,69.1818994 103.565213,68.5590225 98.0482204,68.5590225 L89.5058233,68.5590225 Z M116.734714,62.6327346 C120.614405,64.0564746 123.461842,66.0051894 125.277111,68.4789376 C127.092379,70.9526857 128,74.1115614 128,77.9556593 C128,81.1946677 127.216955,84.1488838 125.650841,86.8183962 C124.084727,89.4879087 121.84237,91.676876 118.923703,93.385364 C117.215215,94.3819819 115.302093,95.1027395 113.18428,95.5476582 C111.066467,95.9925769 108.06776,96.215033 104.188068,96.215033 L99.7033098,96.215033 L76.3184979,96.215033 C73.9693269,96.215033 72.2875593,95.7523244 71.2731446,94.8268935 C70.2587299,93.9014625 69.7515301,92.3887615 69.7515301,90.288745 C69.7515301,88.4022896 70.2320352,86.9696727 71.1930596,85.9908515 C72.1540841,85.0120303 73.5600062,84.522627 75.4108682,84.522627 L76.3184979,84.522627 L76.3184979,44.6937008 L75.4108682,44.6937008 C73.5600062,44.6937008 72.1540841,44.1953993 71.1930596,43.1987813 C70.2320352,42.2021633 69.7515301,40.7428518 69.7515301,38.8208028 C69.7515301,36.7563799 70.2676281,35.2525771 71.2998396,34.3093494 C72.3320511,33.3661217 74.0049204,32.8945149 76.3184979,32.8945149 L100.877889,32.8945149 C108.388118,32.8945149 114.09189,34.3538264 117.989378,37.2724934 C121.886867,40.1911603 123.835581,44.4623161 123.835581,50.0860889 C123.835581,52.8623819 123.239399,55.3093982 122.047017,57.4272114 C120.854635,59.5450246 119.083885,61.2801816 116.734714,62.6327346 L116.734714,62.6327346 Z M89.5058233,44.3733609 L89.5058233,57.8276363 L96.7134708,57.8276363 C101.091471,57.8276363 104.179161,57.3115383 105.976633,56.2793268 C107.774104,55.2471153 108.672827,53.50306 108.672827,51.0471086 C108.672827,48.7335312 107.863087,47.0428653 106.243583,45.9750604 C104.624078,44.9072554 101.999097,44.3733609 98.3685602,44.3733609 L89.5058233,44.3733609 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/new-button": {
"title": "$:/core/images/new-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M56,72 L8.00697327,72 C3.59075293,72 0,68.418278 0,64 C0,59.5907123 3.58484404,56 8.00697327,56 L56,56 L56,8.00697327 C56,3.59075293 59.581722,0 64,0 C68.4092877,0 72,3.58484404 72,8.00697327 L72,56 L119.993027,56 C124.409247,56 128,59.581722 128,64 C128,68.4092877 124.415156,72 119.993027,72 L72,72 L72,119.993027 C72,124.409247 68.418278,128 64,128 C59.5907123,128 56,124.415156 56,119.993027 L56,72 L56,72 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/new-here-button": {
"title": "$:/core/images/new-here-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-here-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n \t<g transform=\"translate(52.233611, 64.389922) rotate(75.000000) translate(-52.233611, -64.389922) translate(-7.734417, 3.702450)\">\n\t <path d=\"M18.9270186,45.959338 L18.9080585,49.6521741 C18.8884833,53.4648378 21.0574548,58.7482162 23.7526408,61.4434022 L78.5671839,116.257945 C81.2617332,118.952495 85.6348701,118.950391 88.3334363,116.251825 L115.863237,88.7220241 C118.555265,86.0299959 118.564544,81.6509578 115.869358,78.9557717 L61.0548144,24.1412286 C58.3602652,21.4466794 53.0787224,19.2788426 49.2595808,19.3006519 L25.9781737,19.4336012 C22.1633003,19.4553862 19.0471195,22.5673232 19.0275223,26.3842526 L18.9871663,34.2443819 C19.0818862,34.255617 19.1779758,34.2665345 19.2754441,34.2771502 C22.6891275,34.6489512 27.0485594,34.2348566 31.513244,33.2285542 C31.7789418,32.8671684 32.075337,32.5211298 32.4024112,32.1940556 C34.8567584,29.7397084 38.3789778,29.0128681 41.4406288,30.0213822 C41.5958829,29.9543375 41.7503946,29.8866669 41.9041198,29.8183808 L42.1110981,30.2733467 C43.1114373,30.6972371 44.0473796,31.3160521 44.8614145,32.1300869 C48.2842088,35.5528813 48.2555691,41.130967 44.7974459,44.5890903 C41.4339531,47.952583 36.0649346,48.0717177 32.6241879,44.9262969 C27.8170558,45.8919233 23.0726921,46.2881596 18.9270186,45.959338 Z\"></path>\n\t <path d=\"M45.4903462,38.8768094 C36.7300141,42.6833154 26.099618,44.7997354 18.1909048,43.9383587 C7.2512621,42.7468685 1.50150083,35.8404432 4.66865776,24.7010202 C7.51507386,14.6896965 15.4908218,6.92103848 24.3842626,4.38423012 C34.1310219,1.60401701 42.4070208,6.15882777 42.4070209,16.3101169 L34.5379395,16.310117 C34.5379394,11.9285862 31.728784,10.3825286 26.5666962,11.8549876 C20.2597508,13.6540114 14.3453742,19.4148216 12.2444303,26.8041943 C10.4963869,32.9523565 12.6250796,35.5092726 19.0530263,36.2093718 C25.5557042,36.9176104 35.0513021,34.9907189 42.7038419,31.5913902 L42.7421786,31.6756595 C44.3874154,31.5384763 47.8846101,37.3706354 45.9274416,38.6772897 L45.9302799,38.6835285 C45.9166992,38.6895612 45.9031139,38.6955897 45.8895238,38.7016142 C45.8389288,38.7327898 45.7849056,38.7611034 45.7273406,38.7863919 C45.6506459,38.8200841 45.571574,38.8501593 45.4903462,38.8768094 Z\"></path>\n </g>\n <rect x=\"96\" y=\"80\" width=\"16\" height=\"48\" rx=\"8\"></rect>\n <rect x=\"80\" y=\"96\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n </g>\n </g>\n</svg>"
},
"$:/core/images/new-image-button": {
"title": "$:/core/images/new-image-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M81.3619177,73.6270062 L97.1875317,46.2162388 C97.91364,44.9585822 97.4824378,43.3533085 96.2260476,42.6279312 L46.2162388,13.7547547 C44.9585822,13.0286463 43.3533085,13.4598485 42.6279312,14.7162388 L30.0575956,36.4886988 L40.0978909,31.2276186 C43.1404959,29.6333041 46.8692155,31.3421319 47.6479264,34.6877101 L51.2545483,52.3903732 L61.1353556,53.2399953 C63.2899974,53.4346096 65.1046382,54.9309951 65.706105,57.0091178 C65.7395572,57.1246982 65.8069154,57.3539875 65.9047035,57.6813669 C66.0696435,58.2335608 66.2581528,58.852952 66.4667073,59.5238092 C67.0618822,61.4383079 67.6960725,63.3742727 68.3393254,65.2021174 C68.5462918,65.7902259 68.7511789,66.3583016 68.953259,66.9034738 C69.5777086,68.5881157 70.1617856,70.0172008 70.6783305,71.110045 C70.9334784,71.6498566 71.1627732,72.0871602 71.4035746,72.5373068 C71.6178999,72.7492946 71.9508843,72.9623307 72.4151452,73.1586945 C73.5561502,73.6412938 75.1990755,73.899146 77.0720271,73.9171651 C77.9355886,73.9254732 78.7819239,73.8832103 79.5638842,73.8072782 C80.0123946,73.7637257 80.3172916,73.7224469 80.4352582,73.7027375 C80.7503629,73.6500912 81.0598053,73.6256267 81.3619177,73.6270062 L81.3619177,73.6270062 L81.3619177,73.6270062 L81.3619177,73.6270062 Z M37.4707881,2.64867269 C38.9217993,0.135447653 42.1388058,-0.723707984 44.6486727,0.725364314 L108.293614,37.4707881 C110.806839,38.9217993 111.665994,42.1388058 110.216922,44.6486727 L73.4714982,108.293614 C72.0204871,110.806839 68.8034805,111.665994 66.2936136,110.216922 L2.64867269,73.4714982 C0.135447653,72.0204871 -0.723707984,68.8034805 0.725364314,66.2936136 L37.4707881,2.64867269 L37.4707881,2.64867269 L37.4707881,2.64867269 L37.4707881,2.64867269 Z M80.3080975,53.1397764 C82.8191338,54.5895239 86.0299834,53.7291793 87.4797308,51.218143 C88.9294783,48.7071068 88.0691338,45.4962571 85.5580975,44.0465097 C83.0470612,42.5967622 79.8362116,43.4571068 78.3864641,45.968143 C76.9367166,48.4791793 77.7970612,51.6900289 80.3080975,53.1397764 L80.3080975,53.1397764 L80.3080975,53.1397764 L80.3080975,53.1397764 Z M96,112 L88.0070969,112 C83.5881712,112 80,108.418278 80,104 C80,99.5907123 83.5848994,96 88.0070969,96 L96,96 L96,88.0070969 C96,83.5881712 99.581722,80 104,80 C108.409288,80 112,83.5848994 112,88.0070969 L112,96 L119.992903,96 C124.411829,96 128,99.581722 128,104 C128,108.409288 124.415101,112 119.992903,112 L112,112 L112,119.992903 C112,124.411829 108.418278,128 104,128 C99.5907123,128 96,124.415101 96,119.992903 L96,112 L96,112 Z M33.3471097,51.7910932 C40.7754579,59.7394511 42.3564368,62.4818351 40.7958321,65.1848818 C39.2352273,67.8879286 26.9581062,62.8571718 24.7019652,66.7649227 C22.4458242,70.6726735 23.7947046,70.0228006 22.2648667,72.6725575 L41.9944593,84.0634431 C41.9944593,84.0634431 36.3904568,75.8079231 37.7602356,73.4353966 C40.2754811,69.0788636 46.5298923,72.1787882 48.1248275,69.4162793 C50.538989,65.234829 43.0222016,59.7770885 33.3471097,51.7910932 L33.3471097,51.7910932 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/new-journal-button": {
"title": "$:/core/images/new-journal-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-new-journal-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M102.545455,112.818182 L102.545455,124.636364 L102.545455,124.636364 L102.545455,124.636364 C102.545455,125.941761 103.630828,127 104.969697,127 L111.030303,127 C112.369172,127 113.454545,125.941761 113.454545,124.636364 L113.454545,112.818182 L125.575758,112.818182 C126.914626,112.818182 128,111.759982 128,110.454545 L128,104.545455 C128,103.240018 126.914626,102.181818 125.575758,102.181818 L113.454545,102.181818 L113.454545,90.3636364 C113.454545,89.0582 112.369172,88 111.030303,88 L104.969697,88 L104.969697,88 C103.630828,88 102.545455,89.0582 102.545455,90.3636364 L102.545455,102.181818 L90.4242424,102.181818 L90.4242424,102.181818 C89.0853705,102.181818 88,103.240018 88,104.545455 L88,110.454545 L88,110.454545 L88,110.454545 C88,111.759982 89.0853705,112.818182 90.4242424,112.818182 L102.545455,112.818182 Z\"></path>\n <g transform=\"translate(59.816987, 64.316987) rotate(30.000000) translate(-59.816987, -64.316987) translate(20.316987, 12.816987)\">\n <g transform=\"translate(0.000000, 0.000000)\">\n <path d=\"M9.99631148,0 C4.4755011,0 -2.27373675e-13,4.48070044 -2.27373675e-13,9.99759461 L-2.27373675e-13,91.6128884 C-2.27373675e-13,97.1344074 4.46966773,101.610483 9.99631148,101.610483 L68.9318917,101.610483 C74.4527021,101.610483 78.9282032,97.1297826 78.9282032,91.6128884 L78.9282032,9.99759461 C78.9282032,4.47607557 74.4585355,0 68.9318917,0 L9.99631148,0 Z M20.8885263,26 C24.2022348,26 26.8885263,23.3137085 26.8885263,20 C26.8885263,16.6862915 24.2022348,14 20.8885263,14 C17.5748178,14 14.8885263,16.6862915 14.8885263,20 C14.8885263,23.3137085 17.5748178,26 20.8885263,26 Z M57.3033321,25.6783342 C60.6170406,25.6783342 63.3033321,22.9920427 63.3033321,19.6783342 C63.3033321,16.3646258 60.6170406,13.6783342 57.3033321,13.6783342 C53.9896236,13.6783342 51.3033321,16.3646258 51.3033321,19.6783342 C51.3033321,22.9920427 53.9896236,25.6783342 57.3033321,25.6783342 Z\"></path>\n <text font-family=\"Helvetica\" font-size=\"47.1724138\" font-weight=\"bold\" fill=\"#FFFFFF\">\n <tspan x=\"42\" y=\"77.4847912\" text-anchor=\"middle\"><<now \"DD\">></tspan>\n </text>\n </g>\n </g>\n </g>\n</svg>"
},
"$:/core/images/opacity": {
"title": "$:/core/images/opacity",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-opacity tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M102.361773,65 C101.833691,67.051742 101.183534,69.0544767 100.419508,71 L82.5835324,71 C83.7602504,69.1098924 84.7666304,67.1027366 85.581205,65 L102.361773,65 Z M102.834311,63 C103.256674,61.0388326 103.568427,59.0365486 103.762717,57 L87.6555706,57 C87.3692052,59.0609452 86.9083652,61.0660782 86.2884493,63 L102.834311,63 Z M99.5852583,73 C98.6682925,75.0747721 97.6196148,77.0783056 96.4498253,79 L75.8124196,79 C77.8387053,77.2115633 79.6621163,75.1985844 81.2437158,73 L99.5852583,73 Z M95.1689122,81 C93.7449202,83.1155572 92.1695234,85.1207336 90.458251,87 L60.4614747,87 C65.1836162,85.86248 69.5430327,83.794147 73.3347255,81 L95.1689122,81 Z M87.6555706,47 L103.762717,47 C101.246684,20.6269305 79.0321807,0 52,0 C23.281193,0 0,23.281193 0,52 C0,77.2277755 17.9651296,98.2595701 41.8000051,103 L62.1999949,103 C67.8794003,101.870444 73.2255333,99.8158975 78.074754,97 L39,97 L39,95 L81.2493857,95 C83.8589242,93.2215015 86.2981855,91.2116653 88.5376609,89 L39,89 L39,87 L43.5385253,87 C27.7389671,83.1940333 16,68.967908 16,52 C16,32.117749 32.117749,16 52,16 C70.1856127,16 85.2217929,29.4843233 87.6555706,47 Z M87.8767787,49 L103.914907,49 C103.971379,49.9928025 104,50.9930589 104,52 C104,53.0069411 103.971379,54.0071975 103.914907,55 L87.8767787,55 C87.958386,54.0107999 88,53.0102597 88,52 C88,50.9897403 87.958386,49.9892001 87.8767787,49 Z\"></path>\n <path d=\"M76,128 C104.718807,128 128,104.718807 128,76 C128,47.281193 104.718807,24 76,24 C47.281193,24 24,47.281193 24,76 C24,104.718807 47.281193,128 76,128 L76,128 Z M76,112 C95.882251,112 112,95.882251 112,76 C112,56.117749 95.882251,40 76,40 C56.117749,40 40,56.117749 40,76 C40,95.882251 56.117749,112 76,112 L76,112 Z\"></path>\n <path d=\"M37,58 L90,58 L90,62 L37,62 L37,58 L37,58 Z M40,50 L93,50 L93,54 L40,54 L40,50 L40,50 Z M40,42 L93,42 L93,46 L40,46 L40,42 L40,42 Z M32,66 L85,66 L85,70 L32,70 L32,66 L32,66 Z M30,74 L83,74 L83,78 L30,78 L30,74 L30,74 Z M27,82 L80,82 L80,86 L27,86 L27,82 L27,82 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/open-window": {
"title": "$:/core/images/open-window",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-open-window tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M16,112 L104.993898,112 C108.863261,112 112,115.590712 112,120 C112,124.418278 108.858091,128 104.993898,128 L7.00610161,128 C3.13673853,128 0,124.409288 0,120 C0,119.998364 4.30952878e-07,119.996727 1.29273572e-06,119.995091 C4.89579306e-07,119.993456 0,119.99182 0,119.990183 L0,24.0098166 C0,19.586117 3.59071231,16 8,16 C12.418278,16 16,19.5838751 16,24.0098166 L16,112 Z\"></path>\n <path d=\"M96,43.1959595 L96,56 C96,60.418278 99.581722,64 104,64 C108.418278,64 112,60.418278 112,56 L112,24 C112,19.5907123 108.415101,16 103.992903,16 L72.0070969,16 C67.5881712,16 64,19.581722 64,24 C64,28.4092877 67.5848994,32 72.0070969,32 L84.5685425,32 L48.2698369,68.2987056 C45.1421332,71.4264093 45.1434327,76.4904296 48.267627,79.614624 C51.3854642,82.7324612 56.4581306,82.7378289 59.5835454,79.6124141 L96,43.1959595 Z M32,7.9992458 C32,3.58138434 35.5881049,0 39.9992458,0 L120.000754,0 C124.418616,0 128,3.5881049 128,7.9992458 L128,88.0007542 C128,92.4186157 124.411895,96 120.000754,96 L39.9992458,96 C35.5813843,96 32,92.4118951 32,88.0007542 L32,7.9992458 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/options-button": {
"title": "$:/core/images/options-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-options-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M110.48779,76.0002544 C109.354214,80.4045063 107.611262,84.5641217 105.354171,88.3838625 L105.354171,88.3838625 L112.07833,95.1080219 C115.20107,98.2307613 115.210098,103.299824 112.089164,106.420759 L106.420504,112.089418 C103.301049,115.208874 98.2346851,115.205502 95.1077675,112.078585 L88.3836082,105.354425 C84.5638673,107.611516 80.4042519,109.354468 76,110.488045 L76,110.488045 L76,119.993281 C76,124.409501 72.4220153,128.000254 68.0083475,128.000254 L59.9916525,128.000254 C55.5800761,128.000254 52,124.41541 52,119.993281 L52,110.488045 C47.5957481,109.354468 43.4361327,107.611516 39.6163918,105.354425 L32.8922325,112.078585 C29.7694931,115.201324 24.7004301,115.210353 21.5794957,112.089418 L15.9108363,106.420759 C12.7913807,103.301303 12.7947522,98.2349395 15.9216697,95.1080219 L22.6458291,88.3838625 C20.3887383,84.5641217 18.6457859,80.4045063 17.5122098,76.0002544 L8.00697327,76.0002544 C3.59075293,76.0002544 2.19088375e-16,72.4222697 4.89347582e-16,68.0086019 L9.80228577e-16,59.9919069 C1.25035972e-15,55.5803305 3.58484404,52.0002544 8.00697327,52.0002544 L17.5122098,52.0002544 C18.6457859,47.5960025 20.3887383,43.4363871 22.6458291,39.6166462 L15.9216697,32.8924868 C12.7989304,29.7697475 12.7899019,24.7006845 15.9108363,21.5797501 L21.5794957,15.9110907 C24.6989513,12.7916351 29.7653149,12.7950065 32.8922325,15.9219241 L39.6163918,22.6460835 C43.4361327,20.3889927 47.5957481,18.6460403 52,17.5124642 L52,8.00722764 C52,3.5910073 55.5779847,0.000254375069 59.9916525,0.000254375069 L68.0083475,0.000254375069 C72.4199239,0.000254375069 76,3.58509841 76,8.00722764 L76,17.5124642 C80.4042519,18.6460403 84.5638673,20.3889927 88.3836082,22.6460835 L95.1077675,15.9219241 C98.2305069,12.7991848 103.29957,12.7901562 106.420504,15.9110907 L112.089164,21.5797501 C115.208619,24.6992057 115.205248,29.7655693 112.07833,32.8924868 L105.354171,39.6166462 L105.354171,39.6166462 C107.611262,43.4363871 109.354214,47.5960025 110.48779,52.0002544 L119.993027,52.0002544 C124.409247,52.0002544 128,55.5782391 128,59.9919069 L128,68.0086019 C128,72.4201783 124.415156,76.0002544 119.993027,76.0002544 L110.48779,76.0002544 L110.48779,76.0002544 Z M64,96.0002544 C81.673112,96.0002544 96,81.6733664 96,64.0002544 C96,46.3271424 81.673112,32.0002544 64,32.0002544 C46.326888,32.0002544 32,46.3271424 32,64.0002544 C32,81.6733664 46.326888,96.0002544 64,96.0002544 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/paint": {
"title": "$:/core/images/paint",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-paint tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M83.5265806,76.1907935 C90.430962,69.2864121 91.8921169,59.0000433 87.9100453,50.6642209 L125.812763,12.7615036 C128.732035,9.84223095 128.72611,5.10322984 125.812796,2.18991592 C122.893542,-0.729338085 118.161775,-0.730617045 115.241209,2.18994966 L77.3384914,40.092667 C69.002669,36.1105954 58.7163002,37.5717503 51.8119188,44.4761317 L83.5265806,76.1907935 L83.5265806,76.1907935 L83.5265806,76.1907935 L83.5265806,76.1907935 Z M80.8836921,78.8336819 L49.1690303,47.1190201 C49.1690303,47.1190201 8.50573364,81.242543 0,80.2820711 C0,80.2820711 3.78222974,85.8744423 6.82737483,88.320684 C20.8514801,82.630792 44.1526049,63.720771 44.1526049,63.720771 L44.8144806,64.3803375 C44.8144806,64.3803375 19.450356,90.2231043 9.18040433,92.0477601 C10.4017154,93.4877138 13.5343883,96.1014812 15.4269991,97.8235871 C20.8439164,96.3356979 50.1595367,69.253789 50.1595367,69.253789 L50.8214124,69.9133555 L18.4136144,100.936036 L23.6993903,106.221812 L56.1060358,75.2002881 L56.7679115,75.8598546 C56.7679115,75.8598546 28.9040131,106.396168 28.0841366,108.291555 C28.0841366,108.291555 34.1159238,115.144621 35.6529617,116.115796 C36.3545333,113.280171 63.5365402,82.6307925 63.5365402,82.6307925 L64.1984159,83.290359 C64.1984159,83.290359 43.6013016,107.04575 39.2343772,120.022559 C42.443736,123.571575 46.7339155,125.159692 50.1595362,126.321151 C47.9699978,114.504469 80.8836921,78.8336819 80.8836921,78.8336819 L80.8836921,78.8336819 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/palette": {
"title": "$:/core/images/palette",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-palette tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M80.2470434,39.1821571 C75.0645698,38.2680897 69.6261555,37.7814854 64.0193999,37.7814854 C28.6624616,37.7814854 0,57.1324214 0,81.0030106 C0,90.644534 4.67604329,99.5487133 12.5805659,106.738252 C23.5031767,91.1899067 26.3405471,72.3946229 36.8885698,63.5622337 C52.0716764,50.8486559 63.4268694,55.7343343 63.4268694,55.7343343 L80.2470434,39.1821571 Z M106.781666,48.8370714 C119.830962,56.749628 128.0388,68.229191 128.0388,81.0030106 C128.0388,90.3534932 128.557501,98.4142085 116.165191,106.082518 C105.367708,112.763955 112.341384,99.546808 104.321443,95.1851533 C96.3015017,90.8234987 84.3749007,96.492742 86.1084305,103.091059 C89.3087234,115.272303 105.529892,114.54645 92.4224435,119.748569 C79.3149955,124.950687 74.2201582,124.224536 64.0193999,124.224536 C56.1979176,124.224536 48.7040365,123.277578 41.7755684,121.544216 C51.620343,117.347916 69.6563669,109.006202 75.129737,102.088562 C82.7876655,92.4099199 87.3713218,80.0000002 83.3235694,72.4837191 C83.1303943,72.1250117 94.5392656,60.81569 106.781666,48.8370714 Z M1.13430476,123.866563 C0.914084026,123.867944 0.693884185,123.868637 0.473712455,123.868637 C33.9526848,108.928928 22.6351223,59.642592 59.2924543,59.6425917 C59.6085574,61.0606542 59.9358353,62.5865065 60.3541977,64.1372318 C34.4465025,59.9707319 36.7873124,112.168427 1.13429588,123.866563 L1.13430476,123.866563 Z M1.84669213,123.859694 C40.7185279,123.354338 79.9985412,101.513051 79.9985401,79.0466836 C70.7284906,79.0466835 65.9257264,75.5670082 63.1833375,71.1051511 C46.585768,64.1019718 32.81846,116.819636 1.84665952,123.859695 L1.84669213,123.859694 Z M67.1980193,59.8524981 C62.748213,63.9666823 72.0838429,76.2846822 78.5155805,71.1700593 C89.8331416,59.8524993 112.468264,37.2173758 123.785825,25.8998146 C135.103386,14.5822535 123.785825,3.26469247 112.468264,14.5822535 C101.150703,25.8998144 78.9500931,48.9868127 67.1980193,59.8524981 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/permalink-button": {
"title": "$:/core/images/permalink-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-permalink-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M80.4834582,48 L73.0956761,80 L73.0956761,80 L47.5165418,80 L54.9043239,48 L80.4834582,48 Z M84.1773493,32 L89.8007299,7.64246248 C90.7941633,3.33942958 95.0918297,0.64641956 99.3968675,1.64031585 C103.693145,2.63218977 106.385414,6.93288901 105.390651,11.2416793 L100.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L96.9043239,48 L89.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L85.8226507,96 L80.1992701,120.357538 C79.2058367,124.66057 74.9081703,127.35358 70.6031325,126.359684 C66.3068546,125.36781 63.6145865,121.067111 64.6093491,116.758321 L69.401785,96 L43.8226507,96 L38.1992701,120.357538 C37.2058367,124.66057 32.9081703,127.35358 28.6031325,126.359684 C24.3068546,125.36781 21.6145865,121.067111 22.6093491,116.758321 L27.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L31.0956761,80 L38.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L42.1773493,32 L47.8007299,7.64246248 C48.7941633,3.33942958 53.0918297,0.64641956 57.3968675,1.64031585 C61.6931454,2.63218977 64.3854135,6.93288901 63.3906509,11.2416793 L58.598215,32 L84.1773493,32 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/permaview-button": {
"title": "$:/core/images/permaview-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-permaview-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M81.4834582,48 L79.6365127,56 L79.6365127,56 L74.0573784,56 L75.9043239,48 L81.4834582,48 Z M85.1773493,32 L90.8007299,7.64246248 C91.7941633,3.33942958 96.0918297,0.64641956 100.396867,1.64031585 C104.693145,2.63218977 107.385414,6.93288901 106.390651,11.2416793 L101.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L97.9043239,48 L96.0573784,56 L104.000754,56 C108.411895,56 112,59.581722 112,64 C112,68.4092877 108.418616,72 104.000754,72 L92.3634873,72 L90.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L86.8226507,96 L81.1992701,120.357538 C80.2058367,124.66057 75.9081703,127.35358 71.6031325,126.359684 C67.3068546,125.36781 64.6145865,121.067111 65.6093491,116.758321 L70.401785,96 L64.8226507,96 L59.1992701,120.357538 C58.2058367,124.66057 53.9081703,127.35358 49.6031325,126.359684 C45.3068546,125.36781 42.6145865,121.067111 43.6093491,116.758321 L48.401785,96 L42.8226507,96 L37.1992701,120.357538 C36.2058367,124.66057 31.9081703,127.35358 27.6031325,126.359684 C23.3068546,125.36781 20.6145865,121.067111 21.6093491,116.758321 L26.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L30.0956761,80 L31.9426216,72 L23.9992458,72 C19.5881049,72 16,68.418278 16,64 C16,59.5907123 19.5813843,56 23.9992458,56 L35.6365127,56 L37.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L41.1773493,32 L46.8007299,7.64246248 C47.7941633,3.33942958 52.0918297,0.64641956 56.3968675,1.64031585 C60.6931454,2.63218977 63.3854135,6.93288901 62.3906509,11.2416793 L57.598215,32 L63.1773493,32 L68.8007299,7.64246248 C69.7941633,3.33942958 74.0918297,0.64641956 78.3968675,1.64031585 C82.6931454,2.63218977 85.3854135,6.93288901 84.3906509,11.2416793 L79.598215,32 L85.1773493,32 Z M53.9043239,48 L52.0573784,56 L57.6365127,56 L59.4834582,48 L53.9043239,48 Z M75.9426216,72 L74.0956761,80 L74.0956761,80 L68.5165418,80 L70.3634873,72 L75.9426216,72 L75.9426216,72 Z M48.3634873,72 L46.5165418,80 L52.0956761,80 L53.9426216,72 L48.3634873,72 L48.3634873,72 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/picture": {
"title": "$:/core/images/picture",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-picture tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M112,68.2332211 L112,20.0027785 C112,17.7898769 110.207895,16 107.997221,16 L20.0027785,16 C17.7898769,16 16,17.792105 16,20.0027785 L16,58.312373 L25.2413115,43.7197989 C28.041793,39.297674 34.2643908,38.7118128 37.8410347,42.5335275 L56.0882845,63.1470817 L69.7748997,56.7400579 C72.766567,55.3552503 76.3013751,55.9473836 78.678437,58.2315339 C78.8106437,58.3585731 79.0742301,58.609836 79.4527088,58.9673596 C80.0910923,59.570398 80.8117772,60.2441563 81.598127,60.9705595 C83.8422198,63.043576 86.1541548,65.1151944 88.3956721,67.0372264 C89.1168795,67.6556396 89.8200801,68.2492007 90.5021258,68.8146755 C92.6097224,70.5620551 94.4693308,72.0029474 95.9836366,73.0515697 C96.7316295,73.5695379 97.3674038,73.9719282 98.0281481,74.3824999 C98.4724987,74.4989557 99.0742374,74.5263881 99.8365134,74.4317984 C101.709944,74.1993272 104.074502,73.2878514 106.559886,71.8846196 C107.705822,71.2376318 108.790494,70.5370325 109.764561,69.8410487 C110.323259,69.4418522 110.694168,69.1550757 110.834827,69.0391868 C111.210545,68.7296319 111.600264,68.4615815 112,68.2332211 L112,68.2332211 Z M0,8.00697327 C0,3.58484404 3.59075293,0 8.00697327,0 L119.993027,0 C124.415156,0 128,3.59075293 128,8.00697327 L128,119.993027 C128,124.415156 124.409247,128 119.993027,128 L8.00697327,128 C3.58484404,128 0,124.409247 0,119.993027 L0,8.00697327 L0,8.00697327 Z M95,42 C99.418278,42 103,38.418278 103,34 C103,29.581722 99.418278,26 95,26 C90.581722,26 87,29.581722 87,34 C87,38.418278 90.581722,42 95,42 L95,42 Z M32,76 C47.8587691,80.8294182 52.0345556,83.2438712 52.0345556,88 C52.0345556,92.7561288 32,95.4712486 32,102.347107 C32,109.222965 33.2849191,107.337637 33.2849191,112 L67.999999,112 C67.999999,112 54.3147136,105.375255 54.3147136,101.200691 C54.3147136,93.535181 64.9302432,92.860755 64.9302432,88 C64.9302432,80.6425555 50.8523779,79.167282 32,76 L32,76 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-language": {
"title": "$:/core/images/plugin-generic-language",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M61.2072232,68.1369825 C56.8829239,70.9319564 54.2082892,74.793177 54.2082892,79.0581634 C54.2082892,86.9638335 63.3980995,93.4821994 75.2498076,94.3940006 C77.412197,98.2964184 83.8475284,101.178858 91.5684735,101.403106 C86.4420125,100.27851 82.4506393,97.6624107 80.9477167,94.3948272 C92.8046245,93.4861461 102,86.9662269 102,79.0581634 C102,70.5281905 91.3014611,63.6132813 78.1041446,63.6132813 C71.5054863,63.6132813 65.5315225,65.3420086 61.2072232,68.1369825 Z M74.001066,53.9793443 C69.6767667,56.7743182 63.7028029,58.5030456 57.1041446,58.5030456 C54.4851745,58.5030456 51.9646095,58.2307276 49.6065315,57.7275105 C46.2945155,59.9778212 41.2235699,61.4171743 35.5395922,61.4171743 C35.4545771,61.4171743 35.3696991,61.4168523 35.2849622,61.4162104 C39.404008,60.5235193 42.7961717,58.6691298 44.7630507,56.286533 C37.8379411,53.5817651 33.2082892,48.669413 33.2082892,43.0581634 C33.2082892,34.5281905 43.9068281,27.6132812 57.1041446,27.6132812 C70.3014611,27.6132812 81,34.5281905 81,43.0581634 C81,47.3231498 78.3253653,51.1843704 74.001066,53.9793443 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-plugin": {
"title": "$:/core/images/plugin-generic-plugin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M40.3972881,76.4456988 L40.3972881,95.3404069 L54.5170166,95.3404069 L54.5170166,95.3404069 C54.5165526,95.3385183 54.516089,95.3366295 54.515626,95.3347404 C54.6093153,95.3385061 54.7034848,95.3404069 54.7980982,95.3404069 C58.6157051,95.3404069 61.710487,92.245625 61.710487,88.4280181 C61.710487,86.6197822 61.01617,84.9737128 59.8795929,83.7418666 L59.8795929,83.7418666 C59.8949905,83.7341665 59.9104102,83.7265043 59.925852,83.7188798 C58.8840576,82.5086663 58.2542926,80.9336277 58.2542926,79.2114996 C58.2542926,75.3938927 61.3490745,72.2991108 65.1666814,72.2991108 C68.9842884,72.2991108 72.0790703,75.3938927 72.0790703,79.2114996 C72.0790703,81.1954221 71.2432806,82.9841354 69.9045961,84.2447446 L69.9045961,84.2447446 C69.9333407,84.2629251 69.9619885,84.281245 69.9905383,84.2997032 L69.9905383,84.2997032 C69.1314315,85.4516923 68.6228758,86.8804654 68.6228758,88.4280181 C68.6228758,91.8584969 71.1218232,94.7053153 74.3986526,95.2474079 C74.3913315,95.2784624 74.3838688,95.3094624 74.3762652,95.3404069 L95.6963988,95.3404069 L95.6963988,75.5678578 L95.6963988,75.5678578 C95.6466539,75.5808558 95.5967614,75.5934886 95.5467242,75.6057531 C95.5504899,75.5120637 95.5523907,75.4178943 95.5523907,75.3232809 C95.5523907,71.505674 92.4576088,68.4108921 88.6400019,68.4108921 C86.831766,68.4108921 85.1856966,69.105209 83.9538504,70.2417862 L83.9538504,70.2417862 C83.9461503,70.2263886 83.938488,70.2109688 83.9308636,70.1955271 C82.7206501,71.2373215 81.1456115,71.8670865 79.4234834,71.8670865 C75.6058765,71.8670865 72.5110946,68.7723046 72.5110946,64.9546976 C72.5110946,61.1370907 75.6058765,58.0423088 79.4234834,58.0423088 C81.4074059,58.0423088 83.1961192,58.8780985 84.4567284,60.2167829 L84.4567284,60.2167829 C84.4749089,60.1880383 84.4932288,60.1593906 84.511687,60.1308407 L84.511687,60.1308407 C85.6636761,60.9899475 87.0924492,61.4985032 88.6400019,61.4985032 C92.0704807,61.4985032 94.9172991,58.9995558 95.4593917,55.7227265 C95.538755,55.7414363 95.6177614,55.761071 95.6963988,55.7816184 L95.6963988,40.0412962 L74.3762652,40.0412962 L74.3762652,40.0412962 C74.3838688,40.0103516 74.3913315,39.9793517 74.3986526,39.9482971 L74.3986526,39.9482971 C71.1218232,39.4062046 68.6228758,36.5593862 68.6228758,33.1289073 C68.6228758,31.5813547 69.1314315,30.1525815 69.9905383,29.0005925 C69.9619885,28.9821342 69.9333407,28.9638143 69.9045961,28.9456339 C71.2432806,27.6850247 72.0790703,25.8963113 72.0790703,23.9123888 C72.0790703,20.0947819 68.9842884,17 65.1666814,17 C61.3490745,17 58.2542926,20.0947819 58.2542926,23.9123888 C58.2542926,25.6345169 58.8840576,27.2095556 59.925852,28.419769 L59.925852,28.419769 C59.9104102,28.4273935 59.8949905,28.4350558 59.8795929,28.4427558 C61.01617,29.674602 61.710487,31.3206715 61.710487,33.1289073 C61.710487,36.9465143 58.6157051,40.0412962 54.7980982,40.0412962 C54.7034848,40.0412962 54.6093153,40.0393953 54.515626,40.0356296 L54.515626,40.0356296 C54.516089,40.0375187 54.5165526,40.0394075 54.5170166,40.0412962 L40.3972881,40.0412962 L40.3972881,52.887664 L40.3972881,52.887664 C40.4916889,53.3430132 40.5412962,53.8147625 40.5412962,54.2980982 C40.5412962,58.1157051 37.4465143,61.210487 33.6289073,61.210487 C32.0813547,61.210487 30.6525815,60.7019313 29.5005925,59.8428245 C29.4821342,59.8713744 29.4638143,59.9000221 29.4456339,59.9287667 C28.1850247,58.5900823 26.3963113,57.7542926 24.4123888,57.7542926 C20.5947819,57.7542926 17.5,60.8490745 17.5,64.6666814 C17.5,68.4842884 20.5947819,71.5790703 24.4123888,71.5790703 C26.134517,71.5790703 27.7095556,70.9493053 28.919769,69.9075109 L28.919769,69.9075109 C28.9273935,69.9229526 28.9350558,69.9383724 28.9427558,69.95377 C30.174602,68.8171928 31.8206715,68.1228758 33.6289073,68.1228758 C37.4465143,68.1228758 40.5412962,71.2176578 40.5412962,75.0352647 C40.5412962,75.5186004 40.4916889,75.9903496 40.3972881,76.4456988 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/plugin-generic-theme": {
"title": "$:/core/images/plugin-generic-theme",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M29.4078519,91.4716406 L51.4693474,69.4101451 L51.4646675,69.4054652 C50.5969502,68.5377479 50.5929779,67.1348725 51.4693474,66.2585029 C52.3396494,65.3882009 53.7499654,65.3874786 54.6163097,66.2538229 L64.0805963,75.7181095 C64.9483136,76.5858268 64.9522859,77.9887022 64.0759163,78.8650718 C63.2056143,79.7353737 61.7952984,79.736096 60.9289541,78.8697517 L60.9242741,78.8650718 L60.9242741,78.8650718 L38.8627786,100.926567 C36.2518727,103.537473 32.0187578,103.537473 29.4078519,100.926567 C26.796946,98.3156614 26.796946,94.0825465 29.4078519,91.4716406 Z M60.8017407,66.3810363 C58.3659178,63.6765806 56.3370667,61.2899536 54.9851735,59.5123615 C48.1295381,50.4979488 44.671561,55.2444054 40.7586738,59.5123614 C36.8457866,63.7803174 41.789473,67.2384487 38.0759896,70.2532832 C34.3625062,73.2681177 34.5917646,74.3131575 28.3243876,68.7977024 C22.0570105,63.2822473 21.6235306,61.7636888 24.5005999,58.6166112 C27.3776691,55.4695337 29.7823103,60.4247912 35.6595047,54.8320442 C41.5366991,49.2392972 36.5996215,44.2825646 36.5996215,44.2825646 C36.5996215,44.2825646 48.8365511,19.267683 65.1880231,21.1152173 C81.5394952,22.9627517 59.0022276,18.7228947 53.3962199,38.3410355 C50.9960082,46.7405407 53.8429162,44.7613399 58.3941742,48.3090467 C59.7875202,49.3951602 64.4244828,52.7100463 70.1884353,56.9943417 L90.8648751,36.3179019 L92.4795866,31.5515482 L100.319802,26.8629752 L103.471444,30.0146174 L98.782871,37.8548326 L94.0165173,39.4695441 L73.7934912,59.6925702 C86.4558549,69.2403631 102.104532,81.8392557 102.104532,86.4016913 C102.104533,93.6189834 99.0337832,97.9277545 92.5695848,95.5655717 C87.8765989,93.8506351 73.8015497,80.3744087 63.8173444,69.668717 L60.9242741,72.5617873 L57.7726319,69.4101451 L60.8017407,66.3810363 L60.8017407,66.3810363 Z M63.9533761,1.42108547e-13 L118.512977,32 L118.512977,96 L63.9533761,128 L9.39377563,96 L9.39377563,32 L63.9533761,1.42108547e-13 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/preview-closed": {
"title": "$:/core/images/preview-closed",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-preview-closed tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M0.0881363238,64 C-0.210292223,65.8846266 0.249135869,67.8634737 1.4664206,69.4579969 C16.2465319,88.8184886 39.1692554,100.414336 64,100.414336 C88.8307446,100.414336 111.753468,88.8184886 126.533579,69.4579969 C127.750864,67.8634737 128.210292,65.8846266 127.911864,64 C110.582357,78.4158332 88.3036732,87.0858436 64,87.0858436 C39.6963268,87.0858436 17.4176431,78.4158332 0.0881363238,64 Z\"></path>\n <rect x=\"62\" y=\"96\" width=\"4\" height=\"16\" rx=\"4\"></rect>\n <rect transform=\"translate(80.000000, 101.000000) rotate(-5.000000) translate(-80.000000, -101.000000) \" x=\"78\" y=\"93\" width=\"4\" height=\"16\" rx=\"4\"></rect>\n <rect transform=\"translate(48.000000, 101.000000) rotate(-355.000000) translate(-48.000000, -101.000000) \" x=\"46\" y=\"93\" width=\"4\" height=\"16\" rx=\"4\"></rect>\n <rect transform=\"translate(32.000000, 96.000000) rotate(-350.000000) translate(-32.000000, -96.000000) \" x=\"30\" y=\"88\" width=\"4\" height=\"16\" rx=\"4\"></rect>\n <rect transform=\"translate(96.000000, 96.000000) rotate(-10.000000) translate(-96.000000, -96.000000) \" x=\"94\" y=\"88\" width=\"4\" height=\"16\" rx=\"4\"></rect>\n <rect transform=\"translate(112.000000, 88.000000) rotate(-20.000000) translate(-112.000000, -88.000000) \" x=\"110\" y=\"80\" width=\"4\" height=\"16\" rx=\"4\"></rect>\n <rect transform=\"translate(16.000000, 88.000000) rotate(-340.000000) translate(-16.000000, -88.000000) \" x=\"14\" y=\"80\" width=\"4\" height=\"16\" rx=\"4\"></rect>\n </g>\n</svg>"
},
"$:/core/images/preview-open": {
"title": "$:/core/images/preview-open",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-preview-open tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64.1099282,99.5876785 C39.2791836,99.5876785 16.3564602,87.9918313 1.57634884,68.6313396 C-0.378878622,66.070184 -0.378878622,62.5174945 1.57634884,59.9563389 C16.3564602,40.5958472 39.2791836,29 64.1099282,29 C88.9406729,29 111.863396,40.5958472 126.643508,59.9563389 C128.598735,62.5174945 128.598735,66.070184 126.643508,68.6313396 C111.863396,87.9918313 88.9406729,99.5876785 64.1099282,99.5876785 Z M110.213805,67.5808331 C111.654168,66.0569335 111.654168,63.9430665 110.213805,62.4191669 C99.3257042,50.8995835 82.4391647,44 64.1470385,44 C45.8549124,44 28.9683729,50.8995835 18.0802717,62.4191669 C16.6399094,63.9430665 16.6399094,66.0569335 18.0802717,67.5808331 C28.9683729,79.1004165 45.8549124,86 64.1470385,86 C82.4391647,86 99.3257042,79.1004165 110.213805,67.5808331 Z\"></path>\n <path d=\"M63.5,88 C76.4786916,88 87,77.4786916 87,64.5 C87,51.5213084 76.4786916,41 63.5,41 C50.5213084,41 40,51.5213084 40,64.5 C40,77.4786916 50.5213084,88 63.5,88 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/print-button": {
"title": "$:/core/images/print-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M112,71 L112,30.5 L111.96811,30.5 L111.96811,30.5 C111.932942,28.4998414 111.151676,26.510538 109.625176,24.9840387 L86.9982489,2.35711116 C85.3482153,0.707077645 83.1589869,-0.071534047 81,0.0201838424 L81,0 L23.9992458,0 C19.5808867,0 16,3.58213437 16,8.00092105 L16,71 L24,71 L24,8 L81,8 L81,22.4996539 C81,26.9216269 84.5818769,30.5 89.0003461,30.5 L104,30.5 L104,71 L112,71 Z\"></path>\n <rect x=\"32\" y=\"36\" width=\"64\" height=\"8\" rx=\"4\"></rect>\n <rect x=\"32\" y=\"52\" width=\"64\" height=\"8\" rx=\"4\"></rect>\n <rect x=\"32\" y=\"20\" width=\"40\" height=\"8\" rx=\"4\"></rect>\n <path d=\"M0,80.0054195 C0,71.1658704 7.15611005,64 16.0008841,64 L111.999116,64 C120.83616,64 128,71.1553215 128,80.0054195 L128,111.99458 C128,120.83413 120.84389,128 111.999116,128 L16.0008841,128 C7.16383982,128 0,120.844679 0,111.99458 L0,80.0054195 Z M104,96 C108.418278,96 112,92.418278 112,88 C112,83.581722 108.418278,80 104,80 C99.581722,80 96,83.581722 96,88 C96,92.418278 99.581722,96 104,96 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/quote": {
"title": "$:/core/images/quote",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-quote tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M51.2188077,117.712501 L51.2188077,62.1993386 L27.4274524,62.1993386 C27.4274524,53.3075754 29.1096526,45.797753 32.4741035,39.669646 C35.8385544,33.541539 42.0867267,28.9154883 51.2188077,25.7913554 L51.2188077,2 C43.7689521,2.96127169 36.8599155,5.18417913 30.4914905,8.668789 C24.1230656,12.1533989 18.6559149,16.5391352 14.0898743,21.8261295 C9.52383382,27.1131238 5.97919764,33.2411389 3.45585945,40.2103586 C0.932521268,47.1795784 -0.208971741,54.6293222 0.0313461819,62.5598136 L0.0313461819,117.712501 L51.2188077,117.712501 Z M128,117.712501 L128,62.1993386 L104.208645,62.1993386 C104.208645,53.3075754 105.890845,45.797753 109.255296,39.669646 C112.619747,33.541539 118.867919,28.9154883 128,25.7913554 L128,2 C120.550144,2.96127169 113.641108,5.18417913 107.272683,8.668789 C100.904258,12.1533989 95.4371072,16.5391352 90.8710666,21.8261295 C86.3050261,27.1131238 82.7603899,33.2411389 80.2370517,40.2103586 C77.7137136,47.1795784 76.5722206,54.6293222 76.8125385,62.5598136 L76.8125385,117.712501 L128,117.712501 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/refresh-button": {
"title": "$:/core/images/refresh-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-refresh-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M106.369002,39.4325143 C116.529932,60.3119371 112.939592,86.1974934 95.5979797,103.539105 C73.7286194,125.408466 38.2713806,125.408466 16.4020203,103.539105 C-5.46734008,81.6697449 -5.46734008,46.2125061 16.4020203,24.3431458 C19.5262146,21.2189514 24.5915344,21.2189514 27.7157288,24.3431458 C30.8399231,27.4673401 30.8399231,32.5326599 27.7157288,35.6568542 C12.0947571,51.2778259 12.0947571,76.6044251 27.7157288,92.2253967 C43.3367004,107.846368 68.6632996,107.846368 84.2842712,92.2253967 C97.71993,78.7897379 99.5995262,58.1740623 89.9230597,42.729491 L83.4844861,54.9932839 C81.4307001,58.9052072 76.5945372,60.4115251 72.682614,58.3577391 C68.7706907,56.3039532 67.2643728,51.4677903 69.3181587,47.555867 L84.4354914,18.7613158 C86.4966389,14.8353707 91.3577499,13.3347805 95.273202,15.415792 L124.145886,30.7612457 C128.047354,32.8348248 129.52915,37.6785572 127.455571,41.5800249 C125.381992,45.4814927 120.53826,46.9632892 116.636792,44.8897102 L106.369002,39.4325143 Z M98.1470904,27.0648707 C97.9798954,26.8741582 97.811187,26.6843098 97.6409651,26.4953413 L98.6018187,26.1987327 L98.1470904,27.0648707 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/right-arrow": {
"title": "$:/core/images/right-arrow",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-right-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <path d=\"M80.3563798,109.353315 C78.9238993,110.786918 76.9450203,111.675144 74.7592239,111.675144 L-4.40893546,111.675144 C-8.77412698,111.675144 -12.3248558,108.130732 -12.3248558,103.758478 C-12.3248558,99.3951199 -8.78077754,95.8418109 -4.40893546,95.8418109 L66.8418109,95.8418109 L66.8418109,24.5910645 C66.8418109,20.225873 70.3862233,16.6751442 74.7584775,16.6751442 C79.1218352,16.6751442 82.6751442,20.2192225 82.6751442,24.5910645 L82.6751442,103.759224 C82.6751442,105.941695 81.7891419,107.920575 80.3566508,109.353886 Z\" transform=\"translate(35.175144, 64.175144) rotate(-45.000000) translate(-35.175144, -64.175144) \"></path>\n</svg>"
},
"$:/core/images/rotate-left": {
"title": "$:/core/images/rotate-left",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-rotate-left tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect x=\"48\" y=\"96\" width=\"80\" height=\"32\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 0 1-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 1 1-5.657 5.657L49.172 43.142a4 4 0 0 1 0-5.657l11.313-11.313a4 4 0 1 1 5.657 5.656l-4.821 4.822z\"/></g></svg>"
},
"$:/core/images/save-button": {
"title": "$:/core/images/save-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/size": {
"title": "$:/core/images/size",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-size tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <path d=\"M92.3431458,26 L83.1715729,35.1715729 C81.6094757,36.73367 81.6094757,39.26633 83.1715729,40.8284271 C84.73367,42.3905243 87.26633,42.3905243 88.8284271,40.8284271 L104.828427,24.8284271 C106.390524,23.26633 106.390524,20.73367 104.828427,19.1715729 L88.8284271,3.17157288 C87.26633,1.60947571 84.73367,1.60947571 83.1715729,3.17157288 C81.6094757,4.73367004 81.6094757,7.26632996 83.1715729,8.82842712 L92.3431457,18 L22,18 C19.790861,18 18,19.790861 18,22 L18,92.3431458 L8.82842712,83.1715729 C7.26632996,81.6094757 4.73367004,81.6094757 3.17157288,83.1715729 C1.60947571,84.73367 1.60947571,87.26633 3.17157288,88.8284271 L19.1715729,104.828427 C20.73367,106.390524 23.26633,106.390524 24.8284271,104.828427 L40.8284271,88.8284271 C42.3905243,87.26633 42.3905243,84.73367 40.8284271,83.1715729 C39.26633,81.6094757 36.73367,81.6094757 35.1715729,83.1715729 L26,92.3431458 L26,22 L22,26 L92.3431458,26 L92.3431458,26 Z M112,52 L112,116 L116,112 L52,112 C49.790861,112 48,113.790861 48,116 C48,118.209139 49.790861,120 52,120 L116,120 C118.209139,120 120,118.209139 120,116 L120,52 C120,49.790861 118.209139,48 116,48 C113.790861,48 112,49.790861 112,52 L112,52 Z\"></path>\n</svg>"
},
"$:/core/images/spiral": {
"title": "$:/core/images/spiral",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-spiral tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"nonzero\">\n <path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074.14-2.64-1.89-4.89-4.52-5.03-2.64-.14-4.89 1.88-5.03 4.52-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01-.02-.015-.054-.045-.094-.088-.06-.064-.12-.145-.17-.244-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"></path>\n </g>\n</svg>"
},
"$:/core/images/stamp": {
"title": "$:/core/images/stamp",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-stamp tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M49.7334301,64 L16.0098166,64 C11.5838751,64 8,67.5829053 8,72.002643 L8,74.4986785 L8,97 L120,97 L120,74.4986785 L120,72.002643 C120,67.5737547 116.413883,64 111.990183,64 L78.2665699,64 C76.502049,60.7519149 75.5,57.0311962 75.5,53.0769231 C75.5,46.6017951 78.1869052,40.7529228 82.5087769,36.5800577 C85.3313113,32.7688808 87,28.0549983 87,22.952183 C87,10.2760423 76.7025492,0 64,0 C51.2974508,0 41,10.2760423 41,22.952183 C41,28.0549983 42.6686887,32.7688808 45.4912231,36.5800577 C49.8130948,40.7529228 52.5,46.6017951 52.5,53.0769231 C52.5,57.0311962 51.497951,60.7519149 49.7334301,64 Z M8,104 L120,104 L120,112 L8,112 L8,104 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/star-filled": {
"title": "$:/core/images/star-filled",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-star-filled tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"nonzero\">\n <path d=\"M61.8361286,96.8228569 L99.1627704,124.110219 C101.883827,126.099427 105.541968,123.420868 104.505636,120.198072 L90.2895569,75.9887263 L89.0292911,79.8977279 L126.314504,52.5528988 C129.032541,50.5595011 127.635256,46.2255025 124.273711,46.2229134 L78.1610486,46.1873965 L81.4604673,48.6032923 L67.1773543,4.41589688 C66.1361365,1.19470104 61.6144265,1.19470104 60.5732087,4.41589688 L46.2900957,48.6032923 L49.5895144,46.1873965 L3.47685231,46.2229134 C0.115307373,46.2255025 -1.28197785,50.5595011 1.43605908,52.5528988 L38.7212719,79.8977279 L37.4610061,75.9887263 L23.2449266,120.198072 C22.2085954,123.420868 25.8667356,126.099427 28.5877926,124.110219 L65.9144344,96.8228569 L61.8361286,96.8228569 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-classic": {
"title": "$:/core/images/storyview-classic",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-classic tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-pop": {
"title": "$:/core/images/storyview-pop",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-pop tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M16.0098166,56 C11.586117,56 8,59.5776607 8,63.9924054 L8,80.0075946 C8,84.4216782 11.5838751,88 16.0098166,88 L111.990183,88 C116.413883,88 120,84.4223393 120,80.0075946 L120,63.9924054 C120,59.5783218 116.416125,56 111.990183,56 L16.0098166,56 L16.0098166,56 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/storyview-zoomin": {
"title": "$:/core/images/storyview-zoomin",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-storyview-zoomin tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.578055 16,24.0085154 L16,71.9914846 C16,76.4144655 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.421945 112,71.9914846 L112,24.0085154 C112,19.5855345 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/strikethrough": {
"title": "$:/core/images/strikethrough",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-strikethrough tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M92.793842,38.7255689 L108.215529,38.7255689 C107.987058,31.985687 106.70193,26.1883331 104.360107,21.3333333 C102.018284,16.4783336 98.8197436,12.4516001 94.7643909,9.25301205 C90.7090382,6.05442399 85.9969032,3.71263572 80.6278447,2.22757697 C75.2587862,0.742518233 69.4328739,0 63.1499331,0 C57.552404,0 52.0977508,0.713959839 46.7858099,2.14190094 C41.473869,3.56984203 36.7331757,5.74027995 32.5635877,8.65327979 C28.3939997,11.5662796 25.0526676,15.2788708 22.5394913,19.7911647 C20.026315,24.3034585 18.7697456,29.6438781 18.7697456,35.8125837 C18.7697456,41.4101128 19.883523,46.0651309 22.1111111,49.7777778 C24.3386992,53.4904246 27.3087722,56.5176144 31.021419,58.8594378 C34.7340659,61.2012612 38.9321497,63.0861151 43.6157965,64.5140562 C48.2994433,65.9419973 53.068695,67.1985666 57.9236948,68.2838019 C62.7786945,69.3690371 67.5479462,70.4256977 72.231593,71.4538153 C76.9152398,72.4819329 81.1133237,73.8241773 84.8259705,75.480589 C88.5386174,77.1370007 91.5086903,79.2788802 93.7362784,81.9062918 C95.9638666,84.5337035 97.0776439,87.9607107 97.0776439,92.1874163 C97.0776439,96.6425926 96.1637753,100.298067 94.3360107,103.153949 C92.5082461,106.009831 90.109341,108.265944 87.1392236,109.922356 C84.1691061,111.578768 80.827774,112.749662 77.1151272,113.435074 C73.4024803,114.120485 69.7184476,114.463186 66.0629183,114.463186 C61.4935068,114.463186 57.0383974,113.892018 52.6974565,112.749665 C48.3565156,111.607312 44.5582492,109.836692 41.3025435,107.437751 C38.0468378,105.03881 35.4194656,101.983062 33.4203481,98.270415 C31.4212305,94.5577681 30.4216867,90.1312171 30.4216867,84.9906292 L15,84.9906292 C15,92.4159229 16.3422445,98.8415614 19.0267738,104.267738 C21.711303,109.693914 25.3667774,114.149023 29.9933066,117.633199 C34.6198357,121.117376 39.9888137,123.71619 46.1004016,125.429719 C52.2119895,127.143248 58.6947448,128 65.5488621,128 C71.1463912,128 76.7723948,127.343157 82.4270415,126.029451 C88.0816882,124.715745 93.1936407,122.602424 97.7630522,119.689424 C102.332464,116.776425 106.073613,113.006717 108.986613,108.380187 C111.899613,103.753658 113.356091,98.1847715 113.356091,91.6733601 C113.356091,85.6188899 112.242314,80.5926126 110.014726,76.5943775 C107.787137,72.5961424 104.817065,69.2833688 101.104418,66.6559572 C97.3917708,64.0285455 93.193687,61.9437828 88.5100402,60.4016064 C83.8263934,58.85943 79.0571416,57.5171855 74.2021419,56.3748327 C69.3471422,55.2324798 64.5778904,54.1758192 59.8942436,53.2048193 C55.2105968,52.2338193 51.012513,51.0058084 47.2998661,49.5207497 C43.5872193,48.0356909 40.6171463,46.1222786 38.3895582,43.7804552 C36.1619701,41.4386318 35.0481928,38.3828836 35.0481928,34.6131191 C35.0481928,30.6148841 35.8192694,27.273552 37.3614458,24.5890228 C38.9036222,21.9044935 40.9598265,19.762614 43.5301205,18.1633199 C46.1004145,16.5640259 49.041929,15.4216902 52.3547523,14.7362784 C55.6675757,14.0508667 59.0374661,13.708166 62.4645248,13.708166 C70.9179361,13.708166 77.8576257,15.6786952 83.2838019,19.6198126 C88.709978,23.56093 91.8799597,29.9294518 92.793842,38.7255689 L92.793842,38.7255689 Z\"></path>\n <rect x=\"5\" y=\"54\" width=\"118\" height=\"16\"></rect>\n </g>\n</svg>"
},
"$:/core/images/subscript": {
"title": "$:/core/images/subscript",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-subscript tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M2.27170276,16 L22.1825093,16 L43.8305003,49.6746527 L66.4138983,16 L85.1220387,16 L53.5854592,61.9685735 L87.3937414,111.411516 L67.0820462,111.411516 L43.295982,74.9306422 L19.1090291,111.411516 L0,111.411516 L33.8082822,61.9685735 L2.27170276,16 Z M127.910914,128.411516 L85.3276227,128.411516 C85.3870139,123.24448 86.6342108,118.730815 89.0692508,114.870386 C91.5042907,111.009956 94.8301491,107.654403 99.0469256,104.803624 C101.066227,103.318844 103.174584,101.878629 105.372059,100.482935 C107.569534,99.0872413 109.588805,97.5876355 111.429933,95.9840726 C113.271061,94.3805097 114.785514,92.6433426 115.973338,90.7725192 C117.161163,88.9016958 117.784761,86.7487964 117.844152,84.3137564 C117.844152,83.1853233 117.710524,81.9826691 117.443264,80.7057579 C117.176003,79.4288467 116.656338,78.2410402 115.884252,77.1423026 C115.112166,76.0435651 114.04314,75.123015 112.677142,74.3806248 C111.311144,73.6382345 109.529434,73.267045 107.331959,73.267045 C105.312658,73.267045 103.634881,73.6679297 102.298579,74.4697112 C100.962276,75.2714926 99.8932503,76.3702137 99.0914688,77.7659073 C98.2896874,79.161601 97.6957841,80.8096826 97.3097412,82.7102016 C96.9236982,84.6107206 96.7009845,86.6596869 96.6415933,88.857162 L86.4857457,88.857162 C86.4857457,85.4124713 86.9460207,82.2202411 87.8665846,79.2803758 C88.7871485,76.3405105 90.1679736,73.801574 92.0091014,71.6634901 C93.8502292,69.5254062 96.092214,67.8476295 98.7351233,66.6301095 C101.378033,65.4125895 104.451482,64.8038386 107.955564,64.8038386 C111.756602,64.8038386 114.933984,65.4274371 117.487807,66.6746527 C120.041629,67.9218683 122.105443,69.4957119 123.67931,71.3962309 C125.253178,73.2967499 126.366746,75.3605638 127.02005,77.5877345 C127.673353,79.8149053 128,81.9381095 128,83.9574109 C128,86.4518421 127.613963,88.7086746 126.841877,90.727976 C126.069791,92.7472774 125.03046,94.6032252 123.723854,96.2958749 C122.417247,97.9885247 120.932489,99.5475208 119.269534,100.97291 C117.60658,102.398299 115.884261,103.734582 114.102524,104.981797 C112.320788,106.229013 110.539078,107.416819 108.757341,108.545253 C106.975605,109.673686 105.327523,110.802102 103.813047,111.930535 C102.298571,113.058968 100.977136,114.231927 99.8487031,115.449447 C98.7202699,116.666967 97.9481956,117.958707 97.5324571,119.324705 L127.910914,119.324705 L127.910914,128.411516 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/superscript": {
"title": "$:/core/images/superscript",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-superscript tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M2.27170276,16 L22.1825093,16 L43.8305003,49.6746527 L66.4138983,16 L85.1220387,16 L53.5854592,61.9685735 L87.3937414,111.411516 L67.0820462,111.411516 L43.295982,74.9306422 L19.1090291,111.411516 L0,111.411516 L33.8082822,61.9685735 L2.27170276,16 Z M127.910914,63.4115159 L85.3276227,63.4115159 C85.3870139,58.2444799 86.6342108,53.7308149 89.0692508,49.8703857 C91.5042907,46.0099565 94.8301491,42.654403 99.0469256,39.8036245 C101.066227,38.318844 103.174584,36.8786285 105.372059,35.4829349 C107.569534,34.0872413 109.588805,32.5876355 111.429933,30.9840726 C113.271061,29.3805097 114.785514,27.6433426 115.973338,25.7725192 C117.161163,23.9016958 117.784761,21.7487964 117.844152,19.3137564 C117.844152,18.1853233 117.710524,16.9826691 117.443264,15.7057579 C117.176003,14.4288467 116.656338,13.2410402 115.884252,12.1423026 C115.112166,11.0435651 114.04314,10.123015 112.677142,9.38062477 C111.311144,8.63823453 109.529434,8.26704499 107.331959,8.26704499 C105.312658,8.26704499 103.634881,8.6679297 102.298579,9.46971115 C100.962276,10.2714926 99.8932503,11.3702137 99.0914688,12.7659073 C98.2896874,14.161601 97.6957841,15.8096826 97.3097412,17.7102016 C96.9236982,19.6107206 96.7009845,21.6596869 96.6415933,23.857162 L86.4857457,23.857162 C86.4857457,20.4124713 86.9460207,17.2202411 87.8665846,14.2803758 C88.7871485,11.3405105 90.1679736,8.80157397 92.0091014,6.6634901 C93.8502292,4.52540622 96.092214,2.84762946 98.7351233,1.63010947 C101.378033,0.412589489 104.451482,-0.196161372 107.955564,-0.196161372 C111.756602,-0.196161372 114.933984,0.427437071 117.487807,1.67465266 C120.041629,2.92186826 122.105443,4.49571195 123.67931,6.39623095 C125.253178,8.29674995 126.366746,10.3605638 127.02005,12.5877345 C127.673353,14.8149053 128,16.9381095 128,18.9574109 C128,21.4518421 127.613963,23.7086746 126.841877,25.727976 C126.069791,27.7472774 125.03046,29.6032252 123.723854,31.2958749 C122.417247,32.9885247 120.932489,34.5475208 119.269534,35.97291 C117.60658,37.3982993 115.884261,38.7345816 114.102524,39.9817972 C112.320788,41.2290128 110.539078,42.4168194 108.757341,43.5452525 C106.975605,44.6736857 105.327523,45.8021019 103.813047,46.9305351 C102.298571,48.0589682 100.977136,49.2319272 99.8487031,50.4494472 C98.7202699,51.6669672 97.9481956,52.9587068 97.5324571,54.3247048 L127.910914,54.3247048 L127.910914,63.4115159 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/tag-button": {
"title": "$:/core/images/tag-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-tag-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M18.1643182,47.6600756 L18.1677196,51.7651887 C18.1708869,55.5878829 20.3581578,60.8623899 23.0531352,63.5573673 L84.9021823,125.406414 C87.5996731,128.103905 91.971139,128.096834 94.6717387,125.396234 L125.766905,94.3010679 C128.473612,91.5943612 128.472063,87.2264889 125.777085,84.5315115 L63.9280381,22.6824644 C61.2305472,19.9849735 55.9517395,17.801995 52.1318769,17.8010313 L25.0560441,17.7942007 C21.2311475,17.7932358 18.1421354,20.8872832 18.1452985,24.7049463 L18.1535504,34.6641936 C18.2481119,34.6754562 18.3439134,34.6864294 18.4409623,34.6971263 C22.1702157,35.1081705 26.9295004,34.6530132 31.806204,33.5444844 C32.1342781,33.0700515 32.5094815,32.6184036 32.9318197,32.1960654 C35.6385117,29.4893734 39.5490441,28.718649 42.94592,29.8824694 C43.0432142,29.8394357 43.1402334,29.7961748 43.2369683,29.7526887 L43.3646982,30.0368244 C44.566601,30.5115916 45.6933052,31.2351533 46.6655958,32.2074439 C50.4612154,36.0030635 50.4663097,42.1518845 46.6769742,45.94122 C43.0594074,49.5587868 37.2914155,49.7181264 33.4734256,46.422636 C28.1082519,47.5454734 22.7987486,48.0186448 18.1643182,47.6600756 Z\"></path>\n <path d=\"M47.6333528,39.5324628 L47.6562932,39.5834939 C37.9670934,43.9391617 26.0718874,46.3819521 17.260095,45.4107025 C5.27267473,44.0894301 -1.02778744,36.4307276 2.44271359,24.0779512 C5.56175386,12.9761516 14.3014034,4.36129832 24.0466405,1.54817001 C34.7269254,-1.53487574 43.7955833,3.51606438 43.7955834,14.7730751 L35.1728168,14.7730752 C35.1728167,9.91428944 32.0946059,8.19982862 26.4381034,9.83267419 C19.5270911,11.8276553 13.046247,18.2159574 10.7440788,26.4102121 C8.82861123,33.2280582 11.161186,36.0634845 18.2047888,36.8398415 C25.3302805,37.6252244 35.7353482,35.4884477 44.1208333,31.7188498 L44.1475077,31.7781871 C44.159701,31.7725635 44.1718402,31.7671479 44.1839238,31.7619434 C45.9448098,31.0035157 50.4503245,38.3109156 47.7081571,39.5012767 C47.6834429,39.512005 47.6585061,39.5223987 47.6333528,39.5324628 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/theme-button": {
"title": "$:/core/images/theme-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-theme-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M55.854113,66.9453198 C54.3299482,65.1432292 53.0133883,63.518995 51.9542746,62.1263761 C40.8899947,47.578055 35.3091807,55.2383404 28.9941893,62.1263758 C22.6791979,69.0144112 30.6577916,74.5954741 24.6646171,79.4611023 C18.6714426,84.3267304 19.0414417,86.0133155 8.92654943,77.1119468 C-1.18834284,68.2105781 -1.88793412,65.7597832 2.7553553,60.6807286 C7.39864472,55.601674 11.2794845,63.5989423 20.7646627,54.5728325 C30.2498409,45.5467226 22.2819131,37.5470737 22.2819131,37.5470737 C22.2819131,37.5470737 42.0310399,-2.82433362 68.4206088,0.157393922 C94.8101776,3.13912147 58.4373806,-3.70356506 49.3898693,27.958066 C45.5161782,41.5139906 50.1107906,38.3197672 57.4560458,44.0453955 C59.1625767,45.3756367 63.8839488,48.777453 70.127165,53.3625321 C63.9980513,59.2416709 58.9704753,64.0315459 55.854113,66.9453198 Z M67.4952439,79.8919946 C83.5082212,96.9282402 105.237121,117.617674 112.611591,120.312493 C123.044132,124.12481 128.000001,117.170903 128,105.522947 C127.999999,98.3705516 104.170675,78.980486 84.0760493,63.7529565 C76.6683337,70.9090328 70.7000957,76.7055226 67.4952439,79.8919946 Z\"></path>\n <path d=\"M58.2852966,138.232794 L58.2852966,88.3943645 C56.318874,88.3923153 54.7254089,86.7952906 54.7254089,84.8344788 C54.7254089,82.8684071 56.3175932,81.2745911 58.2890859,81.2745911 L79.6408336,81.2745911 C81.608998,81.2745911 83.2045105,82.8724076 83.2045105,84.8344788 C83.2045105,86.7992907 81.614366,88.3923238 79.6446228,88.3943645 L79.6446228,88.3943646 L79.6446228,138.232794 C79.6446228,144.131009 74.8631748,148.912457 68.9649597,148.912457 C63.0667446,148.912457 58.2852966,144.131009 58.2852966,138.232794 Z M65.405072,-14.8423767 L72.5248474,-14.8423767 L76.0847351,-0.690681892 L72.5248474,6.51694947 L72.5248474,81.2745911 L65.405072,81.2745911 L65.405072,6.51694947 L61.8451843,-0.690681892 L65.405072,-14.8423767 Z\" transform=\"translate(68.964960, 67.035040) rotate(45.000000) translate(-68.964960, -67.035040) \"></path>\n </g>\n</svg>"
},
"$:/core/images/timestamp-off": {
"title": "$:/core/images/timestamp-off",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-timestamp-off tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10c-2.762 0-5-2.24-5-5-.004-2.756 2.238-5 5-5H66.69c2.762 0 5.002 2.24 5 5 .006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/>\n </g>\n</svg>\n"
},
"$:/core/images/timestamp-on": {
"title": "$:/core/images/timestamp-on",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-timestamp-on tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10c-2.762 0-5-2.24-5-5-.004-2.756 2.238-5 5-5H66.69c2.762 0 5.002 2.24 5 5 .006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178c-2.116 1.775-5.27 1.498-7.045-.613-1.772-2.11-1.498-5.27.616-7.047l9.95-8.348c2.115-1.774 5.27-1.5 7.045.618 1.775 2.108 1.498 5.27-.616 7.043l-9.95 8.348zM102.983 27.178c2.116 1.775 5.27 1.498 7.045-.613 1.772-2.11 1.498-5.27-.616-7.047l-9.95-8.348c-2.114-1.774-5.27-1.5-7.044.618-1.775 2.108-1.498 5.27.616 7.043l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/>\n </g>\n</svg>\n"
},
"$:/core/images/tip": {
"title": "$:/core/images/tip",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-tip tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,128.241818 C99.346224,128.241818 128,99.5880417 128,64.2418177 C128,28.8955937 99.346224,0.241817675 64,0.241817675 C28.653776,0.241817675 0,28.8955937 0,64.2418177 C0,99.5880417 28.653776,128.241818 64,128.241818 Z M75.9358659,91.4531941 C75.3115438,95.581915 70.2059206,98.8016748 64,98.8016748 C57.7940794,98.8016748 52.6884562,95.581915 52.0641341,91.4531941 C54.3299053,94.0502127 58.8248941,95.8192805 64,95.8192805 C69.1751059,95.8192805 73.6700947,94.0502127 75.9358659,91.4531941 L75.9358659,91.4531941 Z M75.9358659,95.9453413 C75.3115438,100.074062 70.2059206,103.293822 64,103.293822 C57.7940794,103.293822 52.6884562,100.074062 52.0641341,95.9453413 C54.3299053,98.5423599 58.8248941,100.311428 64,100.311428 C69.1751059,100.311428 73.6700947,98.5423599 75.9358659,95.9453413 L75.9358659,95.9453413 Z M75.9358659,100.40119 C75.3115438,104.529911 70.2059206,107.74967 64,107.74967 C57.7940794,107.74967 52.6884562,104.529911 52.0641341,100.40119 C54.3299053,102.998208 58.8248941,104.767276 64,104.767276 C69.1751059,104.767276 73.6700947,102.998208 75.9358659,100.40119 L75.9358659,100.40119 Z M75.9358659,104.893337 C75.3115438,109.022058 70.2059206,112.241818 64,112.241818 C57.7940794,112.241818 52.6884562,109.022058 52.0641341,104.893337 C54.3299053,107.490356 58.8248941,109.259423 64,109.259423 C69.1751059,109.259423 73.6700947,107.490356 75.9358659,104.893337 L75.9358659,104.893337 Z M64.3010456,24.2418177 C75.9193117,24.2418188 88.0000013,32.0619847 88,48.4419659 C87.9999987,64.8219472 75.9193018,71.7540963 75.9193021,83.5755932 C75.9193022,89.4486648 70.0521957,92.8368862 63.9999994,92.8368862 C57.947803,92.8368862 51.9731007,89.8295115 51.9731007,83.5755932 C51.9731007,71.1469799 39.9999998,65.4700602 40,48.4419647 C40.0000002,31.4138691 52.6827796,24.2418166 64.3010456,24.2418177 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/transcludify": {
"title": "$:/core/images/transcludify",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\"><path d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 0 0 2.75-.932 6.762 6.762 0 0 0 2.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 0 0-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 0 0-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 0 0 2.75-.932 6.762 6.762 0 0 0 2.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 0 0-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 0 0-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 0 0-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 0 0 .71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 0 0-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 0 0 2.262 2.084 8.868 8.868 0 0 0 2.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 0 0-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 0 0 .71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 0 0-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 0 0 2.262 2.084 8.868 8.868 0 0 0 2.75 1.02c.946.177 1.745.266 2.395.266v7.806z\" fill-rule=\"evenodd\"/></svg>\n"
},
"$:/core/images/twitter": {
"title": "$:/core/images/twitter",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-twitter tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M41.6263422,115.803477 C27.0279663,115.803477 13.4398394,111.540813 1.99987456,104.234833 C4.02221627,104.472643 6.08004574,104.594302 8.16644978,104.594302 C20.277456,104.594302 31.4238403,100.47763 40.270894,93.5715185 C28.9590538,93.3635501 19.4123842,85.9189246 16.1230832,75.6885328 C17.7011365,75.9892376 19.320669,76.1503787 20.9862896,76.1503787 C23.344152,76.1503787 25.6278127,75.8359011 27.7971751,75.247346 C15.9709927,72.8821073 7.06079851,62.4745062 7.06079851,49.9982394 C7.06079851,49.8898938 7.06079851,49.7820074 7.06264203,49.67458 C10.5482779,51.6032228 14.5339687,52.7615103 18.7717609,52.8951059 C11.8355159,48.277565 7.2714207,40.3958845 7.2714207,31.4624258 C7.2714207,26.7434257 8.54621495,22.3200804 10.7713439,18.5169676 C23.5211299,34.0957738 42.568842,44.3472839 64.0532269,45.4210985 C63.6126256,43.5365285 63.3835682,41.5711584 63.3835682,39.5529928 C63.3835682,25.3326379 74.95811,13.8034766 89.2347917,13.8034766 C96.6697089,13.8034766 103.387958,16.930807 108.103682,21.9353619 C113.991886,20.780288 119.52429,18.6372496 124.518847,15.6866694 C122.588682,21.6993889 118.490075,26.7457211 113.152623,29.9327334 C118.381769,29.3102055 123.363882,27.926045 127.999875,25.8780385 C124.534056,31.0418981 120.151087,35.5772616 115.100763,39.2077561 C115.150538,40.3118708 115.175426,41.4224128 115.175426,42.538923 C115.175426,76.5663154 89.1744164,115.803477 41.6263422,115.803477\"></path>\n </g>\n</svg>\n"
},
"$:/core/images/underline": {
"title": "$:/core/images/underline",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-underline tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M7,117.421488 L121.247934,117.421488 L121.247934,128 L7,128 L7,117.421488 Z M104.871212,98.8958333 L104.871212,0 L88.6117424,0 L88.6117424,55.8560606 C88.6117424,60.3194668 88.0060035,64.432115 86.7945076,68.1941288 C85.5830116,71.9561425 83.7657949,75.239885 81.342803,78.0454545 C78.9198111,80.8510241 75.8911167,83.0189317 72.2566288,84.5492424 C68.6221409,86.0795531 64.3182067,86.844697 59.344697,86.844697 C53.0959284,86.844697 48.1862552,85.0593613 44.6155303,81.4886364 C41.0448054,77.9179114 39.2594697,73.0720003 39.2594697,66.9507576 L39.2594697,0 L23,0 L23,65.0378788 C23,70.3939662 23.5419769,75.2717583 24.625947,79.6714015 C25.709917,84.0710447 27.5908957,87.864883 30.2689394,91.0530303 C32.9469831,94.2411776 36.4538925,96.6960141 40.7897727,98.4176136 C45.125653,100.139213 50.545422,101 57.0492424,101 C64.3182182,101 70.630655,99.5653553 75.9867424,96.6960227 C81.3428298,93.8266902 85.742407,89.33147 89.1856061,83.2102273 L89.5681818,83.2102273 L89.5681818,98.8958333 L104.871212,98.8958333 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/unfold-all-button": {
"title": "$:/core/images/unfold-all-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-unfold-all tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <rect x=\"0\" y=\"0\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"64\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <path d=\"M85.598226,8.34884273 C84.1490432,6.89863875 82.1463102,6 79.9340286,6 L47.9482224,6 C43.5292967,6 39.9411255,9.581722 39.9411255,14 C39.9411255,18.4092877 43.5260249,22 47.9482224,22 L71.9411255,22 L71.9411255,45.9929031 C71.9411255,50.4118288 75.5228475,54 79.9411255,54 C84.3504132,54 87.9411255,50.4151006 87.9411255,45.9929031 L87.9411255,14.0070969 C87.9411255,11.7964515 87.0447363,9.79371715 85.5956548,8.34412458 Z\" transform=\"translate(63.941125, 30.000000) scale(1, -1) rotate(-45.000000) translate(-63.941125, -30.000000) \"></path>\n <path d=\"M85.6571005,72.2899682 C84.2079177,70.8397642 82.2051847,69.9411255 79.9929031,69.9411255 L48.0070969,69.9411255 C43.5881712,69.9411255 40,73.5228475 40,77.9411255 C40,82.3504132 43.5848994,85.9411255 48.0070969,85.9411255 L72,85.9411255 L72,109.934029 C72,114.352954 75.581722,117.941125 80,117.941125 C84.4092877,117.941125 88,114.356226 88,109.934029 L88,77.9482224 C88,75.737577 87.1036108,73.7348426 85.6545293,72.2852501 Z\" transform=\"translate(64.000000, 93.941125) scale(1, -1) rotate(-45.000000) translate(-64.000000, -93.941125) \"></path>\n </g>\n</svg>"
},
"$:/core/images/unfold-button": {
"title": "$:/core/images/unfold-button",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-unfold tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <rect x=\"0\" y=\"0\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <path d=\"M85.598226,11.3488427 C84.1490432,9.89863875 82.1463102,9 79.9340286,9 L47.9482224,9 C43.5292967,9 39.9411255,12.581722 39.9411255,17 C39.9411255,21.4092877 43.5260249,25 47.9482224,25 L71.9411255,25 L71.9411255,48.9929031 C71.9411255,53.4118288 75.5228475,57 79.9411255,57 C84.3504132,57 87.9411255,53.4151006 87.9411255,48.9929031 L87.9411255,17.0070969 C87.9411255,14.7964515 87.0447363,12.7937171 85.5956548,11.3441246 Z\" transform=\"translate(63.941125, 33.000000) scale(1, -1) rotate(-45.000000) translate(-63.941125, -33.000000) \"></path>\n <path d=\"M85.6571005,53.4077172 C84.2079177,51.9575133 82.2051847,51.0588745 79.9929031,51.0588745 L48.0070969,51.0588745 C43.5881712,51.0588745 40,54.6405965 40,59.0588745 C40,63.4681622 43.5848994,67.0588745 48.0070969,67.0588745 L72,67.0588745 L72,91.0517776 C72,95.4707033 75.581722,99.0588745 80,99.0588745 C84.4092877,99.0588745 88,95.4739751 88,91.0517776 L88,59.0659714 C88,56.855326 87.1036108,54.8525917 85.6545293,53.4029991 Z\" transform=\"translate(64.000000, 75.058875) scale(1, -1) rotate(-45.000000) translate(-64.000000, -75.058875) \"></path>\n </g>\n</svg>"
},
"$:/core/images/unlocked-padlock": {
"title": "$:/core/images/unlocked-padlock",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-unlocked-padlock tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M48.6266053,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L30.136303,64 C19.6806213,51.3490406 2.77158986,28.2115132 25.8366966,8.85759246 C50.4723026,-11.8141335 71.6711028,13.2108337 81.613302,25.0594855 C91.5555012,36.9081373 78.9368488,47.4964439 69.1559674,34.9513593 C59.375086,22.4062748 47.9893192,10.8049522 35.9485154,20.9083862 C23.9077117,31.0118202 34.192312,43.2685325 44.7624679,55.8655518 C47.229397,58.805523 48.403443,61.5979188 48.6266053,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/up-arrow": {
"title": "$:/core/images/up-arrow",
"created": "20150316000544368",
"modified": "20150316000831867",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-up-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n<path transform=\"rotate(-135, 63.8945, 64.1752)\" d=\"m109.07576,109.35336c-1.43248,1.43361 -3.41136,2.32182 -5.59717,2.32182l-79.16816,0c-4.36519,0 -7.91592,-3.5444 -7.91592,-7.91666c0,-4.36337 3.54408,-7.91667 7.91592,-7.91667l71.25075,0l0,-71.25074c0,-4.3652 3.54442,-7.91592 7.91667,-7.91592c4.36336,0 7.91667,3.54408 7.91667,7.91592l0,79.16815c0,2.1825 -0.88602,4.16136 -2.3185,5.59467l-0.00027,-0.00056l0.00001,-0.00001z\" />\n</svg>\n \n"
},
"$:/core/images/video": {
"title": "$:/core/images/video",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-video tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,12 C29.0909091,12 8.72727273,14.9166667 5.81818182,17.8333333 C2.90909091,20.75 1.93784382e-15,41.1666667 0,64.5 C1.93784382e-15,87.8333333 2.90909091,108.25 5.81818182,111.166667 C8.72727273,114.083333 29.0909091,117 64,117 C98.9090909,117 119.272727,114.083333 122.181818,111.166667 C125.090909,108.25 128,87.8333333 128,64.5 C128,41.1666667 125.090909,20.75 122.181818,17.8333333 C119.272727,14.9166667 98.9090909,12 64,12 Z M54.9161194,44.6182253 C51.102648,42.0759111 48.0112186,43.7391738 48.0112186,48.3159447 L48.0112186,79.6840553 C48.0112186,84.2685636 51.109784,85.9193316 54.9161194,83.3817747 L77.0838806,68.6032672 C80.897352,66.0609529 80.890216,61.9342897 77.0838806,59.3967328 L54.9161194,44.6182253 Z\"></path>\n </g>\n</svg>"
},
"$:/core/images/warning": {
"title": "$:/core/images/warning",
"tags": "$:/tags/Image",
"text": "<svg class=\"tc-image-warning tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M57.0717968,11 C60.1509982,5.66666667 67.8490018,5.66666667 70.9282032,11 L126.353829,107 C129.433031,112.333333 125.584029,119 119.425626,119 L8.57437416,119 C2.41597129,119 -1.43303051,112.333333 1.64617093,107 L57.0717968,11 Z M64,37 C59.581722,37 56,40.5820489 56,44.9935776 L56,73.0064224 C56,77.4211534 59.5907123,81 64,81 C68.418278,81 72,77.4179511 72,73.0064224 L72,44.9935776 C72,40.5788466 68.4092877,37 64,37 Z M64,104 C68.418278,104 72,100.418278 72,96 C72,91.581722 68.418278,88 64,88 C59.581722,88 56,91.581722 56,96 C56,100.418278 59.581722,104 64,104 Z\"></path>\n </g>\n</svg>"
},
"$:/language/Buttons/AdvancedSearch/Caption": {
"title": "$:/language/Buttons/AdvancedSearch/Caption",
"text": "advanced search"
},
"$:/language/Buttons/AdvancedSearch/Hint": {
"title": "$:/language/Buttons/AdvancedSearch/Hint",
"text": "Advanced search"
},
"$:/language/Buttons/Cancel/Caption": {
"title": "$:/language/Buttons/Cancel/Caption",
"text": "cancel"
},
"$:/language/Buttons/Cancel/Hint": {
"title": "$:/language/Buttons/Cancel/Hint",
"text": "Discard changes to this tiddler"
},
"$:/language/Buttons/Clone/Caption": {
"title": "$:/language/Buttons/Clone/Caption",
"text": "clone"
},
"$:/language/Buttons/Clone/Hint": {
"title": "$:/language/Buttons/Clone/Hint",
"text": "Clone this tiddler"
},
"$:/language/Buttons/Close/Caption": {
"title": "$:/language/Buttons/Close/Caption",
"text": "close"
},
"$:/language/Buttons/Close/Hint": {
"title": "$:/language/Buttons/Close/Hint",
"text": "Close this tiddler"
},
"$:/language/Buttons/CloseAll/Caption": {
"title": "$:/language/Buttons/CloseAll/Caption",
"text": "close all"
},
"$:/language/Buttons/CloseAll/Hint": {
"title": "$:/language/Buttons/CloseAll/Hint",
"text": "Close all tiddlers"
},
"$:/language/Buttons/CloseOthers/Caption": {
"title": "$:/language/Buttons/CloseOthers/Caption",
"text": "close others"
},
"$:/language/Buttons/CloseOthers/Hint": {
"title": "$:/language/Buttons/CloseOthers/Hint",
"text": "Close other tiddlers"
},
"$:/language/Buttons/ControlPanel/Caption": {
"title": "$:/language/Buttons/ControlPanel/Caption",
"text": "control panel"
},
"$:/language/Buttons/ControlPanel/Hint": {
"title": "$:/language/Buttons/ControlPanel/Hint",
"text": "Open control panel"
},
"$:/language/Buttons/CopyToClipboard/Caption": {
"title": "$:/language/Buttons/CopyToClipboard/Caption",
"text": "copy to clipboard"
},
"$:/language/Buttons/CopyToClipboard/Hint": {
"title": "$:/language/Buttons/CopyToClipboard/Hint",
"text": "Copy this text to the clipboard"
},
"$:/language/Buttons/Delete/Caption": {
"title": "$:/language/Buttons/Delete/Caption",
"text": "delete"
},
"$:/language/Buttons/Delete/Hint": {
"title": "$:/language/Buttons/Delete/Hint",
"text": "Delete this tiddler"
},
"$:/language/Buttons/Edit/Caption": {
"title": "$:/language/Buttons/Edit/Caption",
"text": "edit"
},
"$:/language/Buttons/Edit/Hint": {
"title": "$:/language/Buttons/Edit/Hint",
"text": "Edit this tiddler"
},
"$:/language/Buttons/Encryption/Caption": {
"title": "$:/language/Buttons/Encryption/Caption",
"text": "encryption"
},
"$:/language/Buttons/Encryption/Hint": {
"title": "$:/language/Buttons/Encryption/Hint",
"text": "Set or clear a password for saving this wiki"
},
"$:/language/Buttons/Encryption/ClearPassword/Caption": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
"text": "clear password"
},
"$:/language/Buttons/Encryption/ClearPassword/Hint": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
"text": "Clear the password and save this wiki without encryption"
},
"$:/language/Buttons/Encryption/SetPassword/Caption": {
"title": "$:/language/Buttons/Encryption/SetPassword/Caption",
"text": "set password"
},
"$:/language/Buttons/Encryption/SetPassword/Hint": {
"title": "$:/language/Buttons/Encryption/SetPassword/Hint",
"text": "Set a password for saving this wiki with encryption"
},
"$:/language/Buttons/ExportPage/Caption": {
"title": "$:/language/Buttons/ExportPage/Caption",
"text": "export all"
},
"$:/language/Buttons/ExportPage/Hint": {
"title": "$:/language/Buttons/ExportPage/Hint",
"text": "Export all tiddlers"
},
"$:/language/Buttons/ExportTiddler/Caption": {
"title": "$:/language/Buttons/ExportTiddler/Caption",
"text": "export tiddler"
},
"$:/language/Buttons/ExportTiddler/Hint": {
"title": "$:/language/Buttons/ExportTiddler/Hint",
"text": "Export tiddler"
},
"$:/language/Buttons/ExportTiddlers/Caption": {
"title": "$:/language/Buttons/ExportTiddlers/Caption",
"text": "export tiddlers"
},
"$:/language/Buttons/ExportTiddlers/Hint": {
"title": "$:/language/Buttons/ExportTiddlers/Hint",
"text": "Export tiddlers"
},
"$:/language/Buttons/SidebarSearch/Hint": {
"title": "$:/language/Buttons/SidebarSearch/Hint",
"text": "Select the sidebar search field"
},
"$:/language/Buttons/Fold/Caption": {
"title": "$:/language/Buttons/Fold/Caption",
"text": "fold tiddler"
},
"$:/language/Buttons/Fold/Hint": {
"title": "$:/language/Buttons/Fold/Hint",
"text": "Fold the body of this tiddler"
},
"$:/language/Buttons/Fold/FoldBar/Caption": {
"title": "$:/language/Buttons/Fold/FoldBar/Caption",
"text": "fold-bar"
},
"$:/language/Buttons/Fold/FoldBar/Hint": {
"title": "$:/language/Buttons/Fold/FoldBar/Hint",
"text": "Optional bars to fold and unfold tiddlers"
},
"$:/language/Buttons/Unfold/Caption": {
"title": "$:/language/Buttons/Unfold/Caption",
"text": "unfold tiddler"
},
"$:/language/Buttons/Unfold/Hint": {
"title": "$:/language/Buttons/Unfold/Hint",
"text": "Unfold the body of this tiddler"
},
"$:/language/Buttons/FoldOthers/Caption": {
"title": "$:/language/Buttons/FoldOthers/Caption",
"text": "fold other tiddlers"
},
"$:/language/Buttons/FoldOthers/Hint": {
"title": "$:/language/Buttons/FoldOthers/Hint",
"text": "Fold the bodies of other opened tiddlers"
},
"$:/language/Buttons/FoldAll/Caption": {
"title": "$:/language/Buttons/FoldAll/Caption",
"text": "fold all tiddlers"
},
"$:/language/Buttons/FoldAll/Hint": {
"title": "$:/language/Buttons/FoldAll/Hint",
"text": "Fold the bodies of all opened tiddlers"
},
"$:/language/Buttons/UnfoldAll/Caption": {
"title": "$:/language/Buttons/UnfoldAll/Caption",
"text": "unfold all tiddlers"
},
"$:/language/Buttons/UnfoldAll/Hint": {
"title": "$:/language/Buttons/UnfoldAll/Hint",
"text": "Unfold the bodies of all opened tiddlers"
},
"$:/language/Buttons/FullScreen/Caption": {
"title": "$:/language/Buttons/FullScreen/Caption",
"text": "full-screen"
},
"$:/language/Buttons/FullScreen/Hint": {
"title": "$:/language/Buttons/FullScreen/Hint",
"text": "Enter or leave full-screen mode"
},
"$:/language/Buttons/Help/Caption": {
"title": "$:/language/Buttons/Help/Caption",
"text": "help"
},
"$:/language/Buttons/Help/Hint": {
"title": "$:/language/Buttons/Help/Hint",
"text": "Show help panel"
},
"$:/language/Buttons/Import/Caption": {
"title": "$:/language/Buttons/Import/Caption",
"text": "import"
},
"$:/language/Buttons/Import/Hint": {
"title": "$:/language/Buttons/Import/Hint",
"text": "Import many types of file including text, image, TiddlyWiki or JSON"
},
"$:/language/Buttons/Info/Caption": {
"title": "$:/language/Buttons/Info/Caption",
"text": "info"
},
"$:/language/Buttons/Info/Hint": {
"title": "$:/language/Buttons/Info/Hint",
"text": "Show information for this tiddler"
},
"$:/language/Buttons/Home/Caption": {
"title": "$:/language/Buttons/Home/Caption",
"text": "home"
},
"$:/language/Buttons/Home/Hint": {
"title": "$:/language/Buttons/Home/Hint",
"text": "Open the default tiddlers"
},
"$:/language/Buttons/Language/Caption": {
"title": "$:/language/Buttons/Language/Caption",
"text": "language"
},
"$:/language/Buttons/Language/Hint": {
"title": "$:/language/Buttons/Language/Hint",
"text": "Choose the user interface language"
},
"$:/language/Buttons/Manager/Caption": {
"title": "$:/language/Buttons/Manager/Caption",
"text": "tiddler manager"
},
"$:/language/Buttons/Manager/Hint": {
"title": "$:/language/Buttons/Manager/Hint",
"text": "Open tiddler manager"
},
"$:/language/Buttons/More/Caption": {
"title": "$:/language/Buttons/More/Caption",
"text": "more"
},
"$:/language/Buttons/More/Hint": {
"title": "$:/language/Buttons/More/Hint",
"text": "More actions"
},
"$:/language/Buttons/NewHere/Caption": {
"title": "$:/language/Buttons/NewHere/Caption",
"text": "new here"
},
"$:/language/Buttons/NewHere/Hint": {
"title": "$:/language/Buttons/NewHere/Hint",
"text": "Create a new tiddler tagged with this one"
},
"$:/language/Buttons/NewJournal/Caption": {
"title": "$:/language/Buttons/NewJournal/Caption",
"text": "new journal"
},
"$:/language/Buttons/NewJournal/Hint": {
"title": "$:/language/Buttons/NewJournal/Hint",
"text": "Create a new journal tiddler"
},
"$:/language/Buttons/NewJournalHere/Caption": {
"title": "$:/language/Buttons/NewJournalHere/Caption",
"text": "new journal here"
},
"$:/language/Buttons/NewJournalHere/Hint": {
"title": "$:/language/Buttons/NewJournalHere/Hint",
"text": "Create a new journal tiddler tagged with this one"
},
"$:/language/Buttons/NewImage/Caption": {
"title": "$:/language/Buttons/NewImage/Caption",
"text": "new image"
},
"$:/language/Buttons/NewImage/Hint": {
"title": "$:/language/Buttons/NewImage/Hint",
"text": "Create a new image tiddler"
},
"$:/language/Buttons/NewMarkdown/Caption": {
"title": "$:/language/Buttons/NewMarkdown/Caption",
"text": "new Markdown tiddler"
},
"$:/language/Buttons/NewMarkdown/Hint": {
"title": "$:/language/Buttons/NewMarkdown/Hint",
"text": "Create a new Markdown tiddler"
},
"$:/language/Buttons/NewTiddler/Caption": {
"title": "$:/language/Buttons/NewTiddler/Caption",
"text": "new tiddler"
},
"$:/language/Buttons/NewTiddler/Hint": {
"title": "$:/language/Buttons/NewTiddler/Hint",
"text": "Create a new tiddler"
},
"$:/language/Buttons/OpenWindow/Caption": {
"title": "$:/language/Buttons/OpenWindow/Caption",
"text": "open in new window"
},
"$:/language/Buttons/OpenWindow/Hint": {
"title": "$:/language/Buttons/OpenWindow/Hint",
"text": "Open tiddler in new window"
},
"$:/language/Buttons/Palette/Caption": {
"title": "$:/language/Buttons/Palette/Caption",
"text": "palette"
},
"$:/language/Buttons/Palette/Hint": {
"title": "$:/language/Buttons/Palette/Hint",
"text": "Choose the colour palette"
},
"$:/language/Buttons/Permalink/Caption": {
"title": "$:/language/Buttons/Permalink/Caption",
"text": "permalink"
},
"$:/language/Buttons/Permalink/Hint": {
"title": "$:/language/Buttons/Permalink/Hint",
"text": "Set browser address bar to a direct link to this tiddler"
},
"$:/language/Buttons/Permaview/Caption": {
"title": "$:/language/Buttons/Permaview/Caption",
"text": "permaview"
},
"$:/language/Buttons/Permaview/Hint": {
"title": "$:/language/Buttons/Permaview/Hint",
"text": "Set browser address bar to a direct link to all the tiddlers in this story"
},
"$:/language/Buttons/Print/Caption": {
"title": "$:/language/Buttons/Print/Caption",
"text": "print page"
},
"$:/language/Buttons/Print/Hint": {
"title": "$:/language/Buttons/Print/Hint",
"text": "Print the current page"
},
"$:/language/Buttons/Refresh/Caption": {
"title": "$:/language/Buttons/Refresh/Caption",
"text": "refresh"
},
"$:/language/Buttons/Refresh/Hint": {
"title": "$:/language/Buttons/Refresh/Hint",
"text": "Perform a full refresh of the wiki"
},
"$:/language/Buttons/Save/Caption": {
"title": "$:/language/Buttons/Save/Caption",
"text": "ok"
},
"$:/language/Buttons/Save/Hint": {
"title": "$:/language/Buttons/Save/Hint",
"text": "Confirm changes to this tiddler"
},
"$:/language/Buttons/SaveWiki/Caption": {
"title": "$:/language/Buttons/SaveWiki/Caption",
"text": "save changes"
},
"$:/language/Buttons/SaveWiki/Hint": {
"title": "$:/language/Buttons/SaveWiki/Hint",
"text": "Save changes"
},
"$:/language/Buttons/StoryView/Caption": {
"title": "$:/language/Buttons/StoryView/Caption",
"text": "storyview"
},
"$:/language/Buttons/StoryView/Hint": {
"title": "$:/language/Buttons/StoryView/Hint",
"text": "Choose the story visualisation"
},
"$:/language/Buttons/HideSideBar/Caption": {
"title": "$:/language/Buttons/HideSideBar/Caption",
"text": "hide sidebar"
},
"$:/language/Buttons/HideSideBar/Hint": {
"title": "$:/language/Buttons/HideSideBar/Hint",
"text": "Hide sidebar"
},
"$:/language/Buttons/ShowSideBar/Caption": {
"title": "$:/language/Buttons/ShowSideBar/Caption",
"text": "show sidebar"
},
"$:/language/Buttons/ShowSideBar/Hint": {
"title": "$:/language/Buttons/ShowSideBar/Hint",
"text": "Show sidebar"
},
"$:/language/Buttons/TagManager/Caption": {
"title": "$:/language/Buttons/TagManager/Caption",
"text": "tag manager"
},
"$:/language/Buttons/TagManager/Hint": {
"title": "$:/language/Buttons/TagManager/Hint",
"text": "Open tag manager"
},
"$:/language/Buttons/Timestamp/Caption": {
"title": "$:/language/Buttons/Timestamp/Caption",
"text": "timestamps"
},
"$:/language/Buttons/Timestamp/Hint": {
"title": "$:/language/Buttons/Timestamp/Hint",
"text": "Choose whether modifications update timestamps"
},
"$:/language/Buttons/Timestamp/On/Caption": {
"title": "$:/language/Buttons/Timestamp/On/Caption",
"text": "timestamps are on"
},
"$:/language/Buttons/Timestamp/On/Hint": {
"title": "$:/language/Buttons/Timestamp/On/Hint",
"text": "Update timestamps when tiddlers are modified"
},
"$:/language/Buttons/Timestamp/Off/Caption": {
"title": "$:/language/Buttons/Timestamp/Off/Caption",
"text": "timestamps are off"
},
"$:/language/Buttons/Timestamp/Off/Hint": {
"title": "$:/language/Buttons/Timestamp/Off/Hint",
"text": "Don't update timestamps when tiddlers are modified"
},
"$:/language/Buttons/Theme/Caption": {
"title": "$:/language/Buttons/Theme/Caption",
"text": "theme"
},
"$:/language/Buttons/Theme/Hint": {
"title": "$:/language/Buttons/Theme/Hint",
"text": "Choose the display theme"
},
"$:/language/Buttons/Bold/Caption": {
"title": "$:/language/Buttons/Bold/Caption",
"text": "bold"
},
"$:/language/Buttons/Bold/Hint": {
"title": "$:/language/Buttons/Bold/Hint",
"text": "Apply bold formatting to selection"
},
"$:/language/Buttons/Clear/Caption": {
"title": "$:/language/Buttons/Clear/Caption",
"text": "clear"
},
"$:/language/Buttons/Clear/Hint": {
"title": "$:/language/Buttons/Clear/Hint",
"text": "Clear image to solid colour"
},
"$:/language/Buttons/EditorHeight/Caption": {
"title": "$:/language/Buttons/EditorHeight/Caption",
"text": "editor height"
},
"$:/language/Buttons/EditorHeight/Caption/Auto": {
"title": "$:/language/Buttons/EditorHeight/Caption/Auto",
"text": "Automatically adjust height to fit content"
},
"$:/language/Buttons/EditorHeight/Caption/Fixed": {
"title": "$:/language/Buttons/EditorHeight/Caption/Fixed",
"text": "Fixed height:"
},
"$:/language/Buttons/EditorHeight/Hint": {
"title": "$:/language/Buttons/EditorHeight/Hint",
"text": "Choose the height of the text editor"
},
"$:/language/Buttons/Excise/Caption": {
"title": "$:/language/Buttons/Excise/Caption",
"text": "excise"
},
"$:/language/Buttons/Excise/Caption/Excise": {
"title": "$:/language/Buttons/Excise/Caption/Excise",
"text": "Perform excision"
},
"$:/language/Buttons/Excise/Caption/MacroName": {
"title": "$:/language/Buttons/Excise/Caption/MacroName",
"text": "Macro name:"
},
"$:/language/Buttons/Excise/Caption/NewTitle": {
"title": "$:/language/Buttons/Excise/Caption/NewTitle",
"text": "Title of new tiddler:"
},
"$:/language/Buttons/Excise/Caption/Replace": {
"title": "$:/language/Buttons/Excise/Caption/Replace",
"text": "Replace excised text with:"
},
"$:/language/Buttons/Excise/Caption/Replace/Macro": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Macro",
"text": "macro"
},
"$:/language/Buttons/Excise/Caption/Replace/Link": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Link",
"text": "link"
},
"$:/language/Buttons/Excise/Caption/Replace/Transclusion": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Transclusion",
"text": "transclusion"
},
"$:/language/Buttons/Excise/Caption/Tag": {
"title": "$:/language/Buttons/Excise/Caption/Tag",
"text": "Tag new tiddler with the title of this tiddler"
},
"$:/language/Buttons/Excise/Caption/TiddlerExists": {
"title": "$:/language/Buttons/Excise/Caption/TiddlerExists",
"text": "Warning: tiddler already exists"
},
"$:/language/Buttons/Excise/Hint": {
"title": "$:/language/Buttons/Excise/Hint",
"text": "Excise the selected text into a new tiddler"
},
"$:/language/Buttons/Heading1/Caption": {
"title": "$:/language/Buttons/Heading1/Caption",
"text": "heading 1"
},
"$:/language/Buttons/Heading1/Hint": {
"title": "$:/language/Buttons/Heading1/Hint",
"text": "Apply heading level 1 formatting to lines containing selection"
},
"$:/language/Buttons/Heading2/Caption": {
"title": "$:/language/Buttons/Heading2/Caption",
"text": "heading 2"
},
"$:/language/Buttons/Heading2/Hint": {
"title": "$:/language/Buttons/Heading2/Hint",
"text": "Apply heading level 2 formatting to lines containing selection"
},
"$:/language/Buttons/Heading3/Caption": {
"title": "$:/language/Buttons/Heading3/Caption",
"text": "heading 3"
},
"$:/language/Buttons/Heading3/Hint": {
"title": "$:/language/Buttons/Heading3/Hint",
"text": "Apply heading level 3 formatting to lines containing selection"
},
"$:/language/Buttons/Heading4/Caption": {
"title": "$:/language/Buttons/Heading4/Caption",
"text": "heading 4"
},
"$:/language/Buttons/Heading4/Hint": {
"title": "$:/language/Buttons/Heading4/Hint",
"text": "Apply heading level 4 formatting to lines containing selection"
},
"$:/language/Buttons/Heading5/Caption": {
"title": "$:/language/Buttons/Heading5/Caption",
"text": "heading 5"
},
"$:/language/Buttons/Heading5/Hint": {
"title": "$:/language/Buttons/Heading5/Hint",
"text": "Apply heading level 5 formatting to lines containing selection"
},
"$:/language/Buttons/Heading6/Caption": {
"title": "$:/language/Buttons/Heading6/Caption",
"text": "heading 6"
},
"$:/language/Buttons/Heading6/Hint": {
"title": "$:/language/Buttons/Heading6/Hint",
"text": "Apply heading level 6 formatting to lines containing selection"
},
"$:/language/Buttons/Italic/Caption": {
"title": "$:/language/Buttons/Italic/Caption",
"text": "italic"
},
"$:/language/Buttons/Italic/Hint": {
"title": "$:/language/Buttons/Italic/Hint",
"text": "Apply italic formatting to selection"
},
"$:/language/Buttons/LineWidth/Caption": {
"title": "$:/language/Buttons/LineWidth/Caption",
"text": "line width"
},
"$:/language/Buttons/LineWidth/Hint": {
"title": "$:/language/Buttons/LineWidth/Hint",
"text": "Set line width for painting"
},
"$:/language/Buttons/Link/Caption": {
"title": "$:/language/Buttons/Link/Caption",
"text": "link"
},
"$:/language/Buttons/Link/Hint": {
"title": "$:/language/Buttons/Link/Hint",
"text": "Create wikitext link"
},
"$:/language/Buttons/Linkify/Caption": {
"title": "$:/language/Buttons/Linkify/Caption",
"text": "wikilink"
},
"$:/language/Buttons/Linkify/Hint": {
"title": "$:/language/Buttons/Linkify/Hint",
"text": "Wrap selection in square brackets"
},
"$:/language/Buttons/ListBullet/Caption": {
"title": "$:/language/Buttons/ListBullet/Caption",
"text": "bulleted list"
},
"$:/language/Buttons/ListBullet/Hint": {
"title": "$:/language/Buttons/ListBullet/Hint",
"text": "Apply bulleted list formatting to lines containing selection"
},
"$:/language/Buttons/ListNumber/Caption": {
"title": "$:/language/Buttons/ListNumber/Caption",
"text": "numbered list"
},
"$:/language/Buttons/ListNumber/Hint": {
"title": "$:/language/Buttons/ListNumber/Hint",
"text": "Apply numbered list formatting to lines containing selection"
},
"$:/language/Buttons/MonoBlock/Caption": {
"title": "$:/language/Buttons/MonoBlock/Caption",
"text": "monospaced block"
},
"$:/language/Buttons/MonoBlock/Hint": {
"title": "$:/language/Buttons/MonoBlock/Hint",
"text": "Apply monospaced block formatting to lines containing selection"
},
"$:/language/Buttons/MonoLine/Caption": {
"title": "$:/language/Buttons/MonoLine/Caption",
"text": "monospaced"
},
"$:/language/Buttons/MonoLine/Hint": {
"title": "$:/language/Buttons/MonoLine/Hint",
"text": "Apply monospaced character formatting to selection"
},
"$:/language/Buttons/Opacity/Caption": {
"title": "$:/language/Buttons/Opacity/Caption",
"text": "opacity"
},
"$:/language/Buttons/Opacity/Hint": {
"title": "$:/language/Buttons/Opacity/Hint",
"text": "Set painting opacity"
},
"$:/language/Buttons/Paint/Caption": {
"title": "$:/language/Buttons/Paint/Caption",
"text": "paint colour"
},
"$:/language/Buttons/Paint/Hint": {
"title": "$:/language/Buttons/Paint/Hint",
"text": "Set painting colour"
},
"$:/language/Buttons/Picture/Caption": {
"title": "$:/language/Buttons/Picture/Caption",
"text": "picture"
},
"$:/language/Buttons/Picture/Hint": {
"title": "$:/language/Buttons/Picture/Hint",
"text": "Insert picture"
},
"$:/language/Buttons/Preview/Caption": {
"title": "$:/language/Buttons/Preview/Caption",
"text": "preview"
},
"$:/language/Buttons/Preview/Hint": {
"title": "$:/language/Buttons/Preview/Hint",
"text": "Show preview pane"
},
"$:/language/Buttons/PreviewType/Caption": {
"title": "$:/language/Buttons/PreviewType/Caption",
"text": "preview type"
},
"$:/language/Buttons/PreviewType/Hint": {
"title": "$:/language/Buttons/PreviewType/Hint",
"text": "Choose preview type"
},
"$:/language/Buttons/Quote/Caption": {
"title": "$:/language/Buttons/Quote/Caption",
"text": "quote"
},
"$:/language/Buttons/Quote/Hint": {
"title": "$:/language/Buttons/Quote/Hint",
"text": "Apply quoted text formatting to lines containing selection"
},
"$:/language/Buttons/RotateLeft/Caption": {
"title": "$:/language/Buttons/RotateLeft/Caption",
"text": "rotate left"
},
"$:/language/Buttons/RotateLeft/Hint": {
"title": "$:/language/Buttons/RotateLeft/Hint",
"text": "Rotate image left by 90 degrees"
},
"$:/language/Buttons/Size/Caption": {
"title": "$:/language/Buttons/Size/Caption",
"text": "image size"
},
"$:/language/Buttons/Size/Caption/Height": {
"title": "$:/language/Buttons/Size/Caption/Height",
"text": "Height:"
},
"$:/language/Buttons/Size/Caption/Resize": {
"title": "$:/language/Buttons/Size/Caption/Resize",
"text": "Resize image"
},
"$:/language/Buttons/Size/Caption/Width": {
"title": "$:/language/Buttons/Size/Caption/Width",
"text": "Width:"
},
"$:/language/Buttons/Size/Hint": {
"title": "$:/language/Buttons/Size/Hint",
"text": "Set image size"
},
"$:/language/Buttons/Stamp/Caption": {
"title": "$:/language/Buttons/Stamp/Caption",
"text": "stamp"
},
"$:/language/Buttons/Stamp/Caption/New": {
"title": "$:/language/Buttons/Stamp/Caption/New",
"text": "Add your own"
},
"$:/language/Buttons/Stamp/Hint": {
"title": "$:/language/Buttons/Stamp/Hint",
"text": "Insert a preconfigured snippet of text"
},
"$:/language/Buttons/Stamp/New/Title": {
"title": "$:/language/Buttons/Stamp/New/Title",
"text": "Name as shown in menu"
},
"$:/language/Buttons/Stamp/New/Text": {
"title": "$:/language/Buttons/Stamp/New/Text",
"text": "Text of snippet. (Remember to add a descriptive title in the caption field)."
},
"$:/language/Buttons/Strikethrough/Caption": {
"title": "$:/language/Buttons/Strikethrough/Caption",
"text": "strikethrough"
},
"$:/language/Buttons/Strikethrough/Hint": {
"title": "$:/language/Buttons/Strikethrough/Hint",
"text": "Apply strikethrough formatting to selection"
},
"$:/language/Buttons/Subscript/Caption": {
"title": "$:/language/Buttons/Subscript/Caption",
"text": "subscript"
},
"$:/language/Buttons/Subscript/Hint": {
"title": "$:/language/Buttons/Subscript/Hint",
"text": "Apply subscript formatting to selection"
},
"$:/language/Buttons/Superscript/Caption": {
"title": "$:/language/Buttons/Superscript/Caption",
"text": "superscript"
},
"$:/language/Buttons/Superscript/Hint": {
"title": "$:/language/Buttons/Superscript/Hint",
"text": "Apply superscript formatting to selection"
},
"$:/language/Buttons/ToggleSidebar/Hint": {
"title": "$:/language/Buttons/ToggleSidebar/Hint",
"text": "Toggle the sidebar visibility"
},
"$:/language/Buttons/Transcludify/Caption": {
"title": "$:/language/Buttons/Transcludify/Caption",
"text": "transclusion"
},
"$:/language/Buttons/Transcludify/Hint": {
"title": "$:/language/Buttons/Transcludify/Hint",
"text": "Wrap selection in curly brackets"
},
"$:/language/Buttons/Underline/Caption": {
"title": "$:/language/Buttons/Underline/Caption",
"text": "underline"
},
"$:/language/Buttons/Underline/Hint": {
"title": "$:/language/Buttons/Underline/Hint",
"text": "Apply underline formatting to selection"
},
"$:/language/ControlPanel/Advanced/Caption": {
"title": "$:/language/ControlPanel/Advanced/Caption",
"text": "Advanced"
},
"$:/language/ControlPanel/Advanced/Hint": {
"title": "$:/language/ControlPanel/Advanced/Hint",
"text": "Internal information about this TiddlyWiki"
},
"$:/language/ControlPanel/Appearance/Caption": {
"title": "$:/language/ControlPanel/Appearance/Caption",
"text": "Appearance"
},
"$:/language/ControlPanel/Appearance/Hint": {
"title": "$:/language/ControlPanel/Appearance/Hint",
"text": "Ways to customise the appearance of your TiddlyWiki."
},
"$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
"title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
"text": "Animation duration:"
},
"$:/language/ControlPanel/Basics/Caption": {
"title": "$:/language/ControlPanel/Basics/Caption",
"text": "Basics"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
"text": "Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
"text": "Default tiddlers:"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
"text": "Choose which tiddlers are displayed at startup:"
},
"$:/language/ControlPanel/Basics/Language/Prompt": {
"title": "$:/language/ControlPanel/Basics/Language/Prompt",
"text": "Hello! Current language:"
},
"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
"text": "Title of new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Text/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt",
"text": "Text for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
"text": "Tags for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt",
"text": "Title of new tiddlers"
},
"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
"text": "Number of overridden shadow tiddlers:"
},
"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
"text": "Number of shadow tiddlers:"
},
"$:/language/ControlPanel/Basics/Subtitle/Prompt": {
"title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
"text": "Subtitle:"
},
"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
"text": "Number of system tiddlers:"
},
"$:/language/ControlPanel/Basics/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tags/Prompt",
"text": "Number of tags:"
},
"$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
"text": "Number of tiddlers:"
},
"$:/language/ControlPanel/Basics/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/Title/Prompt",
"text": "Title of this ~TiddlyWiki:"
},
"$:/language/ControlPanel/Basics/Username/Prompt": {
"title": "$:/language/ControlPanel/Basics/Username/Prompt",
"text": "Username for signing edits:"
},
"$:/language/ControlPanel/Basics/Version/Prompt": {
"title": "$:/language/ControlPanel/Basics/Version/Prompt",
"text": "~TiddlyWiki version:"
},
"$:/language/ControlPanel/EditorTypes/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Caption",
"text": "Editor Types"
},
"$:/language/ControlPanel/EditorTypes/Editor/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
"text": "Editor"
},
"$:/language/ControlPanel/EditorTypes/Hint": {
"title": "$:/language/ControlPanel/EditorTypes/Hint",
"text": "These tiddlers determine which editor is used to edit specific tiddler types."
},
"$:/language/ControlPanel/EditorTypes/Type/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
"text": "Type"
},
"$:/language/ControlPanel/Info/Caption": {
"title": "$:/language/ControlPanel/Info/Caption",
"text": "Info"
},
"$:/language/ControlPanel/Info/Hint": {
"title": "$:/language/ControlPanel/Info/Hint",
"text": "Information about this TiddlyWiki"
},
"$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt",
"text": "Type shortcut here"
},
"$:/language/ControlPanel/KeyboardShortcuts/Add/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption",
"text": "add shortcut"
},
"$:/language/ControlPanel/KeyboardShortcuts/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Caption",
"text": "Keyboard Shortcuts"
},
"$:/language/ControlPanel/KeyboardShortcuts/Hint": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Hint",
"text": "Manage keyboard shortcut assignments"
},
"$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption",
"text": "No keyboard shortcuts assigned"
},
"$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint",
"text": "remove keyboard shortcut"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/All": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/All",
"text": "All platforms"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac",
"text": "Macintosh platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac",
"text": "Non-Macintosh platforms only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux",
"text": "Linux platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux",
"text": "Non-Linux platforms only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows",
"text": "Windows platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows",
"text": "Non-Windows platforms only"
},
"$:/language/ControlPanel/LoadedModules/Caption": {
"title": "$:/language/ControlPanel/LoadedModules/Caption",
"text": "Loaded Modules"
},
"$:/language/ControlPanel/LoadedModules/Hint": {
"title": "$:/language/ControlPanel/LoadedModules/Hint",
"text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
},
"$:/language/ControlPanel/Palette/Caption": {
"title": "$:/language/ControlPanel/Palette/Caption",
"text": "Palette"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
"text": "clone"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
"text": "It is recommended that you clone this shadow palette before editing it"
},
"$:/language/ControlPanel/Palette/Editor/Delete/Hint": {
"title": "$:/language/ControlPanel/Palette/Editor/Delete/Hint",
"text": "delete this entry from the current palette"
},
"$:/language/ControlPanel/Palette/Editor/Names/External/Show": {
"title": "$:/language/ControlPanel/Palette/Editor/Names/External/Show",
"text": "Show color names that are not part of the current palette"
},
"$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
"text": "This shadow palette has been modified"
},
"$:/language/ControlPanel/Palette/Editor/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt",
"text": "Editing"
},
"$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
"text": "reset"
},
"$:/language/ControlPanel/Palette/HideEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
"text": "hide editor"
},
"$:/language/ControlPanel/Palette/Prompt": {
"title": "$:/language/ControlPanel/Palette/Prompt",
"text": "Current palette:"
},
"$:/language/ControlPanel/Palette/ShowEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
"text": "show editor"
},
"$:/language/ControlPanel/Parsing/Caption": {
"title": "$:/language/ControlPanel/Parsing/Caption",
"text": "Parsing"
},
"$:/language/ControlPanel/Parsing/Hint": {
"title": "$:/language/ControlPanel/Parsing/Hint",
"text": "Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation."
},
"$:/language/ControlPanel/Parsing/Block/Caption": {
"title": "$:/language/ControlPanel/Parsing/Block/Caption",
"text": "Block Parse Rules"
},
"$:/language/ControlPanel/Parsing/Inline/Caption": {
"title": "$:/language/ControlPanel/Parsing/Inline/Caption",
"text": "Inline Parse Rules"
},
"$:/language/ControlPanel/Parsing/Pragma/Caption": {
"title": "$:/language/ControlPanel/Parsing/Pragma/Caption",
"text": "Pragma Parse Rules"
},
"$:/language/ControlPanel/Plugins/Add/Caption": {
"title": "$:/language/ControlPanel/Plugins/Add/Caption",
"text": "Get more plugins"
},
"$:/language/ControlPanel/Plugins/Add/Hint": {
"title": "$:/language/ControlPanel/Plugins/Add/Hint",
"text": "Install plugins from the official library"
},
"$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint": {
"title": "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint",
"text": "This plugin is already installed at version <$text text=<<installedVersion>>/>"
},
"$:/language/ControlPanel/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Disable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Disable/Caption",
"text": "disable"
},
"$:/language/ControlPanel/Plugins/Disable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Disable/Hint",
"text": "Disable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Disabled/Status": {
"title": "$:/language/ControlPanel/Plugins/Disabled/Status",
"text": "(disabled)"
},
"$:/language/ControlPanel/Plugins/Empty/Hint": {
"title": "$:/language/ControlPanel/Plugins/Empty/Hint",
"text": "None"
},
"$:/language/ControlPanel/Plugins/Enable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Enable/Caption",
"text": "enable"
},
"$:/language/ControlPanel/Plugins/Enable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Enable/Hint",
"text": "Enable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Install/Caption": {
"title": "$:/language/ControlPanel/Plugins/Install/Caption",
"text": "install"
},
"$:/language/ControlPanel/Plugins/Installed/Hint": {
"title": "$:/language/ControlPanel/Plugins/Installed/Hint",
"text": "Currently installed plugins:"
},
"$:/language/ControlPanel/Plugins/Languages/Caption": {
"title": "$:/language/ControlPanel/Plugins/Languages/Caption",
"text": "Languages"
},
"$:/language/ControlPanel/Plugins/Languages/Hint": {
"title": "$:/language/ControlPanel/Plugins/Languages/Hint",
"text": "Language pack plugins"
},
"$:/language/ControlPanel/Plugins/NoInfoFound/Hint": {
"title": "$:/language/ControlPanel/Plugins/NoInfoFound/Hint",
"text": "No ''\"<$text text=<<currentTab>>/>\"'' found"
},
"$:/language/ControlPanel/Plugins/NotInstalled/Hint": {
"title": "$:/language/ControlPanel/Plugins/NotInstalled/Hint",
"text": "This plugin is not currently installed"
},
"$:/language/ControlPanel/Plugins/OpenPluginLibrary": {
"title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary",
"text": "open plugin library"
},
"$:/language/ControlPanel/Plugins/ClosePluginLibrary": {
"title": "$:/language/ControlPanel/Plugins/ClosePluginLibrary",
"text": "close plugin library"
},
"$:/language/ControlPanel/Plugins/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Plugins/Hint": {
"title": "$:/language/ControlPanel/Plugins/Plugins/Hint",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Reinstall/Caption": {
"title": "$:/language/ControlPanel/Plugins/Reinstall/Caption",
"text": "reinstall"
},
"$:/language/ControlPanel/Plugins/Themes/Caption": {
"title": "$:/language/ControlPanel/Plugins/Themes/Caption",
"text": "Themes"
},
"$:/language/ControlPanel/Plugins/Themes/Hint": {
"title": "$:/language/ControlPanel/Plugins/Themes/Hint",
"text": "Theme plugins"
},
"$:/language/ControlPanel/Saving/Caption": {
"title": "$:/language/ControlPanel/Saving/Caption",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description",
"text": "Permit automatic saving for the download saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint",
"text": "Enable Autosave for Download Saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/Caption": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/Caption",
"text": "Download Saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/Hint": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/Hint",
"text": "These settings apply to the HTML5-compatible download saver"
},
"$:/language/ControlPanel/Saving/General/Caption": {
"title": "$:/language/ControlPanel/Saving/General/Caption",
"text": "General"
},
"$:/language/ControlPanel/Saving/General/Hint": {
"title": "$:/language/ControlPanel/Saving/General/Hint",
"text": "These settings apply to all the loaded savers"
},
"$:/language/ControlPanel/Saving/Hint": {
"title": "$:/language/ControlPanel/Saving/Hint",
"text": "Settings used for saving the entire TiddlyWiki as a single file via a saver module"
},
"$:/language/ControlPanel/Saving/GitService/Branch": {
"title": "$:/language/ControlPanel/Saving/GitService/Branch",
"text": "Target branch for saving"
},
"$:/language/ControlPanel/Saving/GitService/CommitMessage": {
"title": "$:/language/ControlPanel/Saving/GitService/CommitMessage",
"text": "Saved by TiddlyWiki"
},
"$:/language/ControlPanel/Saving/GitService/Description": {
"title": "$:/language/ControlPanel/Saving/GitService/Description",
"text": "These settings are only used when saving to <<service-name>>"
},
"$:/language/ControlPanel/Saving/GitService/Filename": {
"title": "$:/language/ControlPanel/Saving/GitService/Filename",
"text": "Filename of target file (e.g. `index.html`)"
},
"$:/language/ControlPanel/Saving/GitService/Path": {
"title": "$:/language/ControlPanel/Saving/GitService/Path",
"text": "Path to target file (e.g. `/wiki/`)"
},
"$:/language/ControlPanel/Saving/GitService/Repo": {
"title": "$:/language/ControlPanel/Saving/GitService/Repo",
"text": "Target repository (e.g. `Jermolene/TiddlyWiki5`)"
},
"$:/language/ControlPanel/Saving/GitService/ServerURL": {
"title": "$:/language/ControlPanel/Saving/GitService/ServerURL",
"text": "Server API URL"
},
"$:/language/ControlPanel/Saving/GitService/UserName": {
"title": "$:/language/ControlPanel/Saving/GitService/UserName",
"text": "Username"
},
"$:/language/ControlPanel/Saving/GitService/GitHub/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/GitHub/Caption",
"text": "~GitHub Saver"
},
"$:/language/ControlPanel/Saving/GitService/GitHub/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/GitHub/Password",
"text": "Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)"
},
"$:/language/ControlPanel/Saving/GitService/GitLab/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/GitLab/Caption",
"text": "~GitLab Saver"
},
"$:/language/ControlPanel/Saving/GitService/GitLab/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/GitLab/Password",
"text": "Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
"text": "Advanced Settings"
},
"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
"text": "Backup Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
"text": "Backups"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Caption": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Caption",
"text": "~TiddlySpot Saver"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Description": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
"text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
"text": "Upload Filename"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
"text": "~TiddlySpot"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
"text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Password": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
"text": "Password"
},
"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
"text": "Server URL"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
"text": "Upload Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
"text": "Wiki Name"
},
"$:/language/ControlPanel/Settings/AutoSave/Caption": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
"text": "Autosave"
},
"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
"text": "Do not save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
"text": "Save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
"text": "Attempt to automatically save changes during editing when using a supporting saver"
},
"$:/language/ControlPanel/Settings/CamelCase/Caption": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Caption",
"text": "Camel Case Wiki Links"
},
"$:/language/ControlPanel/Settings/CamelCase/Hint": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Hint",
"text": "You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect"
},
"$:/language/ControlPanel/Settings/CamelCase/Description": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Description",
"text": "Enable automatic ~CamelCase linking"
},
"$:/language/ControlPanel/Settings/Caption": {
"title": "$:/language/ControlPanel/Settings/Caption",
"text": "Settings"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Caption": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Caption",
"text": "Editor Toolbar"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Hint": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Hint",
"text": "Enable or disable the editor toolbar:"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Description": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Description",
"text": "Show editor toolbar"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Caption": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Caption",
"text": "Tiddler Info Panel Mode"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Hint": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Hint",
"text": "Control when the tiddler info panel closes:"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description",
"text": "Tiddler info panel closes automatically"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description",
"text": "Tiddler info panel stays open until explicitly closed"
},
"$:/language/ControlPanel/Settings/Hint": {
"title": "$:/language/ControlPanel/Settings/Hint",
"text": "These settings let you customise the behaviour of TiddlyWiki."
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
"text": "Navigation Address Bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
"text": "Behaviour of the browser address bar when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
"text": "Do not update the address bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
"text": "Include the target tiddler"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
"text": "Include the target tiddler and the current story sequence"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
"text": "Navigation History"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
"text": "Update browser history when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
"text": "Do not update history"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
"text": "Update history"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption",
"text": "Permalink/permaview Mode"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint",
"text": "Choose how permalink/permaview is handled:"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description",
"text": "Copy permalink/permaview URL to clipboard"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description",
"text": "Update address bar with permalink/permaview URL"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption",
"text": "Performance Instrumentation"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint",
"text": "Displays performance statistics in the browser developer console. Requires reload to take effect"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description",
"text": "Enable performance instrumentation"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption",
"text": "Toolbar Button Style"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint",
"text": "Choose the style for toolbar buttons:"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless",
"text": "Borderless"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed",
"text": "Boxed"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded",
"text": "Rounded"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption",
"text": "Toolbar Buttons"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint",
"text": "Default toolbar button appearance:"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description",
"text": "Include icon"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description",
"text": "Include text"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption",
"text": "Default Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint",
"text": "Specify which sidebar tab is displayed by default"
},
"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption",
"text": "Default More Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint",
"text": "Specify which More sidebar tab is displayed by default"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/Caption": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption",
"text": "Tiddler Opening Behaviour"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint",
"text": "Navigation from //within// the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint",
"text": "Navigation from //outside// the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove",
"text": "Open above the current tiddler"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow",
"text": "Open below the current tiddler"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop",
"text": "Open at the top of the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom",
"text": "Open at the bottom of the story river"
},
"$:/language/ControlPanel/Settings/TitleLinks/Caption": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Caption",
"text": "Tiddler Titles"
},
"$:/language/ControlPanel/Settings/TitleLinks/Hint": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Hint",
"text": "Optionally display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/TitleLinks/No/Description": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description",
"text": "Do not display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description",
"text": "Display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/MissingLinks/Caption": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Caption",
"text": "Wiki Links"
},
"$:/language/ControlPanel/Settings/MissingLinks/Hint": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Hint",
"text": "Choose whether to link to tiddlers that do not exist yet"
},
"$:/language/ControlPanel/Settings/MissingLinks/Description": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Description",
"text": "Enable links to missing tiddlers"
},
"$:/language/ControlPanel/StoryView/Caption": {
"title": "$:/language/ControlPanel/StoryView/Caption",
"text": "Story View"
},
"$:/language/ControlPanel/StoryView/Prompt": {
"title": "$:/language/ControlPanel/StoryView/Prompt",
"text": "Current view:"
},
"$:/language/ControlPanel/Stylesheets/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Caption",
"text": "Stylesheets"
},
"$:/language/ControlPanel/Stylesheets/Expand/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Expand/Caption",
"text": "Expand All"
},
"$:/language/ControlPanel/Stylesheets/Hint": {
"title": "$:/language/ControlPanel/Stylesheets/Hint",
"text": "This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>"
},
"$:/language/ControlPanel/Stylesheets/Restore/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Restore/Caption",
"text": "Restore"
},
"$:/language/ControlPanel/Theme/Caption": {
"title": "$:/language/ControlPanel/Theme/Caption",
"text": "Theme"
},
"$:/language/ControlPanel/Theme/Prompt": {
"title": "$:/language/ControlPanel/Theme/Prompt",
"text": "Current theme:"
},
"$:/language/ControlPanel/TiddlerFields/Caption": {
"title": "$:/language/ControlPanel/TiddlerFields/Caption",
"text": "Tiddler Fields"
},
"$:/language/ControlPanel/TiddlerFields/Hint": {
"title": "$:/language/ControlPanel/TiddlerFields/Hint",
"text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
},
"$:/language/ControlPanel/Toolbars/Caption": {
"title": "$:/language/ControlPanel/Toolbars/Caption",
"text": "Toolbars"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
"text": "Edit Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/Hint": {
"title": "$:/language/ControlPanel/Toolbars/Hint",
"text": "Select which toolbar buttons are displayed"
},
"$:/language/ControlPanel/Toolbars/PageControls/Caption": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
"text": "Page Toolbar"
},
"$:/language/ControlPanel/Toolbars/PageControls/Hint": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
"text": "Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/EditorToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption",
"text": "Editor Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditorToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint",
"text": "Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
"text": "View Toolbar"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Tools/Download/Full/Caption": {
"title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
"text": "Download full wiki"
},
"$:/language/Date/DaySuffix/1": {
"title": "$:/language/Date/DaySuffix/1",
"text": "st"
},
"$:/language/Date/DaySuffix/2": {
"title": "$:/language/Date/DaySuffix/2",
"text": "nd"
},
"$:/language/Date/DaySuffix/3": {
"title": "$:/language/Date/DaySuffix/3",
"text": "rd"
},
"$:/language/Date/DaySuffix/4": {
"title": "$:/language/Date/DaySuffix/4",
"text": "th"
},
"$:/language/Date/DaySuffix/5": {
"title": "$:/language/Date/DaySuffix/5",
"text": "th"
},
"$:/language/Date/DaySuffix/6": {
"title": "$:/language/Date/DaySuffix/6",
"text": "th"
},
"$:/language/Date/DaySuffix/7": {
"title": "$:/language/Date/DaySuffix/7",
"text": "th"
},
"$:/language/Date/DaySuffix/8": {
"title": "$:/language/Date/DaySuffix/8",
"text": "th"
},
"$:/language/Date/DaySuffix/9": {
"title": "$:/language/Date/DaySuffix/9",
"text": "th"
},
"$:/language/Date/DaySuffix/10": {
"title": "$:/language/Date/DaySuffix/10",
"text": "th"
},
"$:/language/Date/DaySuffix/11": {
"title": "$:/language/Date/DaySuffix/11",
"text": "th"
},
"$:/language/Date/DaySuffix/12": {
"title": "$:/language/Date/DaySuffix/12",
"text": "th"
},
"$:/language/Date/DaySuffix/13": {
"title": "$:/language/Date/DaySuffix/13",
"text": "th"
},
"$:/language/Date/DaySuffix/14": {
"title": "$:/language/Date/DaySuffix/14",
"text": "th"
},
"$:/language/Date/DaySuffix/15": {
"title": "$:/language/Date/DaySuffix/15",
"text": "th"
},
"$:/language/Date/DaySuffix/16": {
"title": "$:/language/Date/DaySuffix/16",
"text": "th"
},
"$:/language/Date/DaySuffix/17": {
"title": "$:/language/Date/DaySuffix/17",
"text": "th"
},
"$:/language/Date/DaySuffix/18": {
"title": "$:/language/Date/DaySuffix/18",
"text": "th"
},
"$:/language/Date/DaySuffix/19": {
"title": "$:/language/Date/DaySuffix/19",
"text": "th"
},
"$:/language/Date/DaySuffix/20": {
"title": "$:/language/Date/DaySuffix/20",
"text": "th"
},
"$:/language/Date/DaySuffix/21": {
"title": "$:/language/Date/DaySuffix/21",
"text": "st"
},
"$:/language/Date/DaySuffix/22": {
"title": "$:/language/Date/DaySuffix/22",
"text": "nd"
},
"$:/language/Date/DaySuffix/23": {
"title": "$:/language/Date/DaySuffix/23",
"text": "rd"
},
"$:/language/Date/DaySuffix/24": {
"title": "$:/language/Date/DaySuffix/24",
"text": "th"
},
"$:/language/Date/DaySuffix/25": {
"title": "$:/language/Date/DaySuffix/25",
"text": "th"
},
"$:/language/Date/DaySuffix/26": {
"title": "$:/language/Date/DaySuffix/26",
"text": "th"
},
"$:/language/Date/DaySuffix/27": {
"title": "$:/language/Date/DaySuffix/27",
"text": "th"
},
"$:/language/Date/DaySuffix/28": {
"title": "$:/language/Date/DaySuffix/28",
"text": "th"
},
"$:/language/Date/DaySuffix/29": {
"title": "$:/language/Date/DaySuffix/29",
"text": "th"
},
"$:/language/Date/DaySuffix/30": {
"title": "$:/language/Date/DaySuffix/30",
"text": "th"
},
"$:/language/Date/DaySuffix/31": {
"title": "$:/language/Date/DaySuffix/31",
"text": "st"
},
"$:/language/Date/Long/Day/0": {
"title": "$:/language/Date/Long/Day/0",
"text": "Sunday"
},
"$:/language/Date/Long/Day/1": {
"title": "$:/language/Date/Long/Day/1",
"text": "Monday"
},
"$:/language/Date/Long/Day/2": {
"title": "$:/language/Date/Long/Day/2",
"text": "Tuesday"
},
"$:/language/Date/Long/Day/3": {
"title": "$:/language/Date/Long/Day/3",
"text": "Wednesday"
},
"$:/language/Date/Long/Day/4": {
"title": "$:/language/Date/Long/Day/4",
"text": "Thursday"
},
"$:/language/Date/Long/Day/5": {
"title": "$:/language/Date/Long/Day/5",
"text": "Friday"
},
"$:/language/Date/Long/Day/6": {
"title": "$:/language/Date/Long/Day/6",
"text": "Saturday"
},
"$:/language/Date/Long/Month/1": {
"title": "$:/language/Date/Long/Month/1",
"text": "January"
},
"$:/language/Date/Long/Month/2": {
"title": "$:/language/Date/Long/Month/2",
"text": "February"
},
"$:/language/Date/Long/Month/3": {
"title": "$:/language/Date/Long/Month/3",
"text": "March"
},
"$:/language/Date/Long/Month/4": {
"title": "$:/language/Date/Long/Month/4",
"text": "April"
},
"$:/language/Date/Long/Month/5": {
"title": "$:/language/Date/Long/Month/5",
"text": "May"
},
"$:/language/Date/Long/Month/6": {
"title": "$:/language/Date/Long/Month/6",
"text": "June"
},
"$:/language/Date/Long/Month/7": {
"title": "$:/language/Date/Long/Month/7",
"text": "July"
},
"$:/language/Date/Long/Month/8": {
"title": "$:/language/Date/Long/Month/8",
"text": "August"
},
"$:/language/Date/Long/Month/9": {
"title": "$:/language/Date/Long/Month/9",
"text": "September"
},
"$:/language/Date/Long/Month/10": {
"title": "$:/language/Date/Long/Month/10",
"text": "October"
},
"$:/language/Date/Long/Month/11": {
"title": "$:/language/Date/Long/Month/11",
"text": "November"
},
"$:/language/Date/Long/Month/12": {
"title": "$:/language/Date/Long/Month/12",
"text": "December"
},
"$:/language/Date/Period/am": {
"title": "$:/language/Date/Period/am",
"text": "am"
},
"$:/language/Date/Period/pm": {
"title": "$:/language/Date/Period/pm",
"text": "pm"
},
"$:/language/Date/Short/Day/0": {
"title": "$:/language/Date/Short/Day/0",
"text": "Sun"
},
"$:/language/Date/Short/Day/1": {
"title": "$:/language/Date/Short/Day/1",
"text": "Mon"
},
"$:/language/Date/Short/Day/2": {
"title": "$:/language/Date/Short/Day/2",
"text": "Tue"
},
"$:/language/Date/Short/Day/3": {
"title": "$:/language/Date/Short/Day/3",
"text": "Wed"
},
"$:/language/Date/Short/Day/4": {
"title": "$:/language/Date/Short/Day/4",
"text": "Thu"
},
"$:/language/Date/Short/Day/5": {
"title": "$:/language/Date/Short/Day/5",
"text": "Fri"
},
"$:/language/Date/Short/Day/6": {
"title": "$:/language/Date/Short/Day/6",
"text": "Sat"
},
"$:/language/Date/Short/Month/1": {
"title": "$:/language/Date/Short/Month/1",
"text": "Jan"
},
"$:/language/Date/Short/Month/2": {
"title": "$:/language/Date/Short/Month/2",
"text": "Feb"
},
"$:/language/Date/Short/Month/3": {
"title": "$:/language/Date/Short/Month/3",
"text": "Mar"
},
"$:/language/Date/Short/Month/4": {
"title": "$:/language/Date/Short/Month/4",
"text": "Apr"
},
"$:/language/Date/Short/Month/5": {
"title": "$:/language/Date/Short/Month/5",
"text": "May"
},
"$:/language/Date/Short/Month/6": {
"title": "$:/language/Date/Short/Month/6",
"text": "Jun"
},
"$:/language/Date/Short/Month/7": {
"title": "$:/language/Date/Short/Month/7",
"text": "Jul"
},
"$:/language/Date/Short/Month/8": {
"title": "$:/language/Date/Short/Month/8",
"text": "Aug"
},
"$:/language/Date/Short/Month/9": {
"title": "$:/language/Date/Short/Month/9",
"text": "Sep"
},
"$:/language/Date/Short/Month/10": {
"title": "$:/language/Date/Short/Month/10",
"text": "Oct"
},
"$:/language/Date/Short/Month/11": {
"title": "$:/language/Date/Short/Month/11",
"text": "Nov"
},
"$:/language/Date/Short/Month/12": {
"title": "$:/language/Date/Short/Month/12",
"text": "Dec"
},
"$:/language/RelativeDate/Future/Days": {
"title": "$:/language/RelativeDate/Future/Days",
"text": "<<period>> days from now"
},
"$:/language/RelativeDate/Future/Hours": {
"title": "$:/language/RelativeDate/Future/Hours",
"text": "<<period>> hours from now"
},
"$:/language/RelativeDate/Future/Minutes": {
"title": "$:/language/RelativeDate/Future/Minutes",
"text": "<<period>> minutes from now"
},
"$:/language/RelativeDate/Future/Months": {
"title": "$:/language/RelativeDate/Future/Months",
"text": "<<period>> months from now"
},
"$:/language/RelativeDate/Future/Second": {
"title": "$:/language/RelativeDate/Future/Second",
"text": "1 second from now"
},
"$:/language/RelativeDate/Future/Seconds": {
"title": "$:/language/RelativeDate/Future/Seconds",
"text": "<<period>> seconds from now"
},
"$:/language/RelativeDate/Future/Years": {
"title": "$:/language/RelativeDate/Future/Years",
"text": "<<period>> years from now"
},
"$:/language/RelativeDate/Past/Days": {
"title": "$:/language/RelativeDate/Past/Days",
"text": "<<period>> days ago"
},
"$:/language/RelativeDate/Past/Hours": {
"title": "$:/language/RelativeDate/Past/Hours",
"text": "<<period>> hours ago"
},
"$:/language/RelativeDate/Past/Minutes": {
"title": "$:/language/RelativeDate/Past/Minutes",
"text": "<<period>> minutes ago"
},
"$:/language/RelativeDate/Past/Months": {
"title": "$:/language/RelativeDate/Past/Months",
"text": "<<period>> months ago"
},
"$:/language/RelativeDate/Past/Second": {
"title": "$:/language/RelativeDate/Past/Second",
"text": "1 second ago"
},
"$:/language/RelativeDate/Past/Seconds": {
"title": "$:/language/RelativeDate/Past/Seconds",
"text": "<<period>> seconds ago"
},
"$:/language/RelativeDate/Past/Years": {
"title": "$:/language/RelativeDate/Past/Years",
"text": "<<period>> years ago"
},
"$:/language/Docs/ModuleTypes/allfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/allfilteroperator",
"text": "A sub-operator for the ''all'' filter operator."
},
"$:/language/Docs/ModuleTypes/animation": {
"title": "$:/language/Docs/ModuleTypes/animation",
"text": "Animations that may be used with the RevealWidget."
},
"$:/language/Docs/ModuleTypes/authenticator": {
"title": "$:/language/Docs/ModuleTypes/authenticator",
"text": "Defines how requests are authenticated by the built-in HTTP server."
},
"$:/language/Docs/ModuleTypes/bitmapeditoroperation": {
"title": "$:/language/Docs/ModuleTypes/bitmapeditoroperation",
"text": "A bitmap editor toolbar operation."
},
"$:/language/Docs/ModuleTypes/command": {
"title": "$:/language/Docs/ModuleTypes/command",
"text": "Commands that can be executed under Node.js."
},
"$:/language/Docs/ModuleTypes/config": {
"title": "$:/language/Docs/ModuleTypes/config",
"text": "Data to be inserted into `$tw.config`."
},
"$:/language/Docs/ModuleTypes/filteroperator": {
"title": "$:/language/Docs/ModuleTypes/filteroperator",
"text": "Individual filter operator methods."
},
"$:/language/Docs/ModuleTypes/global": {
"title": "$:/language/Docs/ModuleTypes/global",
"text": "Global data to be inserted into `$tw`."
},
"$:/language/Docs/ModuleTypes/info": {
"title": "$:/language/Docs/ModuleTypes/info",
"text": "Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin."
},
"$:/language/Docs/ModuleTypes/isfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/isfilteroperator",
"text": "Operands for the ''is'' filter operator."
},
"$:/language/Docs/ModuleTypes/library": {
"title": "$:/language/Docs/ModuleTypes/library",
"text": "Generic module type for general purpose JavaScript modules."
},
"$:/language/Docs/ModuleTypes/macro": {
"title": "$:/language/Docs/ModuleTypes/macro",
"text": "JavaScript macro definitions."
},
"$:/language/Docs/ModuleTypes/parser": {
"title": "$:/language/Docs/ModuleTypes/parser",
"text": "Parsers for different content types."
},
"$:/language/Docs/ModuleTypes/route": {
"title": "$:/language/Docs/ModuleTypes/route",
"text": "Defines how individual URL patterns are handled by the built-in HTTP server."
},
"$:/language/Docs/ModuleTypes/saver": {
"title": "$:/language/Docs/ModuleTypes/saver",
"text": "Savers handle different methods for saving files from the browser."
},
"$:/language/Docs/ModuleTypes/startup": {
"title": "$:/language/Docs/ModuleTypes/startup",
"text": "Startup functions."
},
"$:/language/Docs/ModuleTypes/storyview": {
"title": "$:/language/Docs/ModuleTypes/storyview",
"text": "Story views customise the animation and behaviour of list widgets."
},
"$:/language/Docs/ModuleTypes/texteditoroperation": {
"title": "$:/language/Docs/ModuleTypes/texteditoroperation",
"text": "A text editor toolbar operation."
},
"$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
"title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
"text": "Converts different content types into tiddlers."
},
"$:/language/Docs/ModuleTypes/tiddlerfield": {
"title": "$:/language/Docs/ModuleTypes/tiddlerfield",
"text": "Defines the behaviour of an individual tiddler field."
},
"$:/language/Docs/ModuleTypes/tiddlermethod": {
"title": "$:/language/Docs/ModuleTypes/tiddlermethod",
"text": "Adds methods to the `$tw.Tiddler` prototype."
},
"$:/language/Docs/ModuleTypes/upgrader": {
"title": "$:/language/Docs/ModuleTypes/upgrader",
"text": "Applies upgrade processing to tiddlers during an upgrade/import."
},
"$:/language/Docs/ModuleTypes/utils": {
"title": "$:/language/Docs/ModuleTypes/utils",
"text": "Adds methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/utils-node": {
"title": "$:/language/Docs/ModuleTypes/utils-node",
"text": "Adds Node.js-specific methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/widget": {
"title": "$:/language/Docs/ModuleTypes/widget",
"text": "Widgets encapsulate DOM rendering and refreshing."
},
"$:/language/Docs/ModuleTypes/wikimethod": {
"title": "$:/language/Docs/ModuleTypes/wikimethod",
"text": "Adds methods to `$tw.Wiki`."
},
"$:/language/Docs/ModuleTypes/wikirule": {
"title": "$:/language/Docs/ModuleTypes/wikirule",
"text": "Individual parser rules for the main WikiText parser."
},
"$:/language/Docs/PaletteColours/alert-background": {
"title": "$:/language/Docs/PaletteColours/alert-background",
"text": "Alert background"
},
"$:/language/Docs/PaletteColours/alert-border": {
"title": "$:/language/Docs/PaletteColours/alert-border",
"text": "Alert border"
},
"$:/language/Docs/PaletteColours/alert-highlight": {
"title": "$:/language/Docs/PaletteColours/alert-highlight",
"text": "Alert highlight"
},
"$:/language/Docs/PaletteColours/alert-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
"text": "Alert muted foreground"
},
"$:/language/Docs/PaletteColours/background": {
"title": "$:/language/Docs/PaletteColours/background",
"text": "General background"
},
"$:/language/Docs/PaletteColours/blockquote-bar": {
"title": "$:/language/Docs/PaletteColours/blockquote-bar",
"text": "Blockquote bar"
},
"$:/language/Docs/PaletteColours/button-background": {
"title": "$:/language/Docs/PaletteColours/button-background",
"text": "Default button background"
},
"$:/language/Docs/PaletteColours/button-border": {
"title": "$:/language/Docs/PaletteColours/button-border",
"text": "Default button border"
},
"$:/language/Docs/PaletteColours/button-foreground": {
"title": "$:/language/Docs/PaletteColours/button-foreground",
"text": "Default button foreground"
},
"$:/language/Docs/PaletteColours/dirty-indicator": {
"title": "$:/language/Docs/PaletteColours/dirty-indicator",
"text": "Unsaved changes indicator"
},
"$:/language/Docs/PaletteColours/code-background": {
"title": "$:/language/Docs/PaletteColours/code-background",
"text": "Code background"
},
"$:/language/Docs/PaletteColours/code-border": {
"title": "$:/language/Docs/PaletteColours/code-border",
"text": "Code border"
},
"$:/language/Docs/PaletteColours/code-foreground": {
"title": "$:/language/Docs/PaletteColours/code-foreground",
"text": "Code foreground"
},
"$:/language/Docs/PaletteColours/download-background": {
"title": "$:/language/Docs/PaletteColours/download-background",
"text": "Download button background"
},
"$:/language/Docs/PaletteColours/download-foreground": {
"title": "$:/language/Docs/PaletteColours/download-foreground",
"text": "Download button foreground"
},
"$:/language/Docs/PaletteColours/dragger-background": {
"title": "$:/language/Docs/PaletteColours/dragger-background",
"text": "Dragger background"
},
"$:/language/Docs/PaletteColours/dragger-foreground": {
"title": "$:/language/Docs/PaletteColours/dragger-foreground",
"text": "Dragger foreground"
},
"$:/language/Docs/PaletteColours/dropdown-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-background",
"text": "Dropdown background"
},
"$:/language/Docs/PaletteColours/dropdown-border": {
"title": "$:/language/Docs/PaletteColours/dropdown-border",
"text": "Dropdown border"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
"text": "Dropdown tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
"text": "Dropdown tab background"
},
"$:/language/Docs/PaletteColours/dropzone-background": {
"title": "$:/language/Docs/PaletteColours/dropzone-background",
"text": "Dropzone background"
},
"$:/language/Docs/PaletteColours/external-link-background-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-background-hover",
"text": "External link background hover"
},
"$:/language/Docs/PaletteColours/external-link-background-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-background-visited",
"text": "External link background visited"
},
"$:/language/Docs/PaletteColours/external-link-background": {
"title": "$:/language/Docs/PaletteColours/external-link-background",
"text": "External link background"
},
"$:/language/Docs/PaletteColours/external-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
"text": "External link foreground hover"
},
"$:/language/Docs/PaletteColours/external-link-foreground-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
"text": "External link foreground visited"
},
"$:/language/Docs/PaletteColours/external-link-foreground": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground",
"text": "External link foreground"
},
"$:/language/Docs/PaletteColours/foreground": {
"title": "$:/language/Docs/PaletteColours/foreground",
"text": "General foreground"
},
"$:/language/Docs/PaletteColours/message-background": {
"title": "$:/language/Docs/PaletteColours/message-background",
"text": "Message box background"
},
"$:/language/Docs/PaletteColours/message-border": {
"title": "$:/language/Docs/PaletteColours/message-border",
"text": "Message box border"
},
"$:/language/Docs/PaletteColours/message-foreground": {
"title": "$:/language/Docs/PaletteColours/message-foreground",
"text": "Message box foreground"
},
"$:/language/Docs/PaletteColours/modal-backdrop": {
"title": "$:/language/Docs/PaletteColours/modal-backdrop",
"text": "Modal backdrop"
},
"$:/language/Docs/PaletteColours/modal-background": {
"title": "$:/language/Docs/PaletteColours/modal-background",
"text": "Modal background"
},
"$:/language/Docs/PaletteColours/modal-border": {
"title": "$:/language/Docs/PaletteColours/modal-border",
"text": "Modal border"
},
"$:/language/Docs/PaletteColours/modal-footer-background": {
"title": "$:/language/Docs/PaletteColours/modal-footer-background",
"text": "Modal footer background"
},
"$:/language/Docs/PaletteColours/modal-footer-border": {
"title": "$:/language/Docs/PaletteColours/modal-footer-border",
"text": "Modal footer border"
},
"$:/language/Docs/PaletteColours/modal-header-border": {
"title": "$:/language/Docs/PaletteColours/modal-header-border",
"text": "Modal header border"
},
"$:/language/Docs/PaletteColours/muted-foreground": {
"title": "$:/language/Docs/PaletteColours/muted-foreground",
"text": "General muted foreground"
},
"$:/language/Docs/PaletteColours/notification-background": {
"title": "$:/language/Docs/PaletteColours/notification-background",
"text": "Notification background"
},
"$:/language/Docs/PaletteColours/notification-border": {
"title": "$:/language/Docs/PaletteColours/notification-border",
"text": "Notification border"
},
"$:/language/Docs/PaletteColours/page-background": {
"title": "$:/language/Docs/PaletteColours/page-background",
"text": "Page background"
},
"$:/language/Docs/PaletteColours/pre-background": {
"title": "$:/language/Docs/PaletteColours/pre-background",
"text": "Preformatted code background"
},
"$:/language/Docs/PaletteColours/pre-border": {
"title": "$:/language/Docs/PaletteColours/pre-border",
"text": "Preformatted code border"
},
"$:/language/Docs/PaletteColours/primary": {
"title": "$:/language/Docs/PaletteColours/primary",
"text": "General primary"
},
"$:/language/Docs/PaletteColours/select-tag-background": {
"title": "$:/language/Docs/PaletteColours/select-tag-background",
"text": "`<select>` element background"
},
"$:/language/Docs/PaletteColours/select-tag-foreground": {
"title": "$:/language/Docs/PaletteColours/select-tag-foreground",
"text": "`<select>` element text"
},
"$:/language/Docs/PaletteColours/sidebar-button-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
"text": "Sidebar button foreground"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
"text": "Sidebar controls foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
"text": "Sidebar controls foreground"
},
"$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
"text": "Sidebar foreground shadow"
},
"$:/language/Docs/PaletteColours/sidebar-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground",
"text": "Sidebar foreground"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
"text": "Sidebar muted foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
"text": "Sidebar muted foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
"text": "Sidebar tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
"text": "Sidebar tab background"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
"text": "Sidebar tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
"text": "Sidebar tab border"
},
"$:/language/Docs/PaletteColours/sidebar-tab-divider": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
"text": "Sidebar tab divider"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
"text": "Sidebar tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
"text": "Sidebar tab foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
"text": "Sidebar tiddler link foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
"text": "Sidebar tiddler link foreground"
},
"$:/language/Docs/PaletteColours/site-title-foreground": {
"title": "$:/language/Docs/PaletteColours/site-title-foreground",
"text": "Site title foreground"
},
"$:/language/Docs/PaletteColours/static-alert-foreground": {
"title": "$:/language/Docs/PaletteColours/static-alert-foreground",
"text": "Static alert foreground"
},
"$:/language/Docs/PaletteColours/tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/tab-background-selected",
"text": "Tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-background": {
"title": "$:/language/Docs/PaletteColours/tab-background",
"text": "Tab background"
},
"$:/language/Docs/PaletteColours/tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/tab-border-selected",
"text": "Tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-border": {
"title": "$:/language/Docs/PaletteColours/tab-border",
"text": "Tab border"
},
"$:/language/Docs/PaletteColours/tab-divider": {
"title": "$:/language/Docs/PaletteColours/tab-divider",
"text": "Tab divider"
},
"$:/language/Docs/PaletteColours/tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
"text": "Tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-foreground": {
"title": "$:/language/Docs/PaletteColours/tab-foreground",
"text": "Tab foreground"
},
"$:/language/Docs/PaletteColours/table-border": {
"title": "$:/language/Docs/PaletteColours/table-border",
"text": "Table border"
},
"$:/language/Docs/PaletteColours/table-footer-background": {
"title": "$:/language/Docs/PaletteColours/table-footer-background",
"text": "Table footer background"
},
"$:/language/Docs/PaletteColours/table-header-background": {
"title": "$:/language/Docs/PaletteColours/table-header-background",
"text": "Table header background"
},
"$:/language/Docs/PaletteColours/tag-background": {
"title": "$:/language/Docs/PaletteColours/tag-background",
"text": "Tag background"
},
"$:/language/Docs/PaletteColours/tag-foreground": {
"title": "$:/language/Docs/PaletteColours/tag-foreground",
"text": "Tag foreground"
},
"$:/language/Docs/PaletteColours/tiddler-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-background",
"text": "Tiddler background"
},
"$:/language/Docs/PaletteColours/tiddler-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-border",
"text": "Tiddler border"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
"text": "Tiddler controls foreground hover"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
"text": "Tiddler controls foreground for selected controls"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
"text": "Tiddler controls foreground"
},
"$:/language/Docs/PaletteColours/tiddler-editor-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
"text": "Tiddler editor background"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
"text": "Tiddler editor border image"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
"text": "Tiddler editor border"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
"text": "Tiddler editor background for even fields"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
"text": "Tiddler editor background for odd fields"
},
"$:/language/Docs/PaletteColours/tiddler-info-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-background",
"text": "Tiddler info panel background"
},
"$:/language/Docs/PaletteColours/tiddler-info-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-border",
"text": "Tiddler info panel border"
},
"$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
"text": "Tiddler info panel tab background"
},
"$:/language/Docs/PaletteColours/tiddler-link-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-background",
"text": "Tiddler link background"
},
"$:/language/Docs/PaletteColours/tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
"text": "Tiddler link foreground"
},
"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
"text": "Tiddler subtitle foreground"
},
"$:/language/Docs/PaletteColours/tiddler-title-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
"text": "Tiddler title foreground"
},
"$:/language/Docs/PaletteColours/toolbar-new-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-new-button",
"text": "Toolbar 'new tiddler' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-options-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-options-button",
"text": "Toolbar 'options' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-save-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-save-button",
"text": "Toolbar 'save' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-info-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-info-button",
"text": "Toolbar 'info' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-edit-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
"text": "Toolbar 'edit' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-close-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-close-button",
"text": "Toolbar 'close' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-delete-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
"text": "Toolbar 'delete' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-cancel-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
"text": "Toolbar 'cancel' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-done-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-done-button",
"text": "Toolbar 'done' button foreground"
},
"$:/language/Docs/PaletteColours/untagged-background": {
"title": "$:/language/Docs/PaletteColours/untagged-background",
"text": "Untagged pill background"
},
"$:/language/Docs/PaletteColours/very-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/very-muted-foreground",
"text": "Very muted foreground"
},
"$:/language/EditTemplate/Body/External/Hint": {
"title": "$:/language/EditTemplate/Body/External/Hint",
"text": "This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
},
"$:/language/EditTemplate/Body/Placeholder": {
"title": "$:/language/EditTemplate/Body/Placeholder",
"text": "Type the text for this tiddler"
},
"$:/language/EditTemplate/Body/Preview/Type/Output": {
"title": "$:/language/EditTemplate/Body/Preview/Type/Output",
"text": "output"
},
"$:/language/EditTemplate/Field/Remove/Caption": {
"title": "$:/language/EditTemplate/Field/Remove/Caption",
"text": "remove field"
},
"$:/language/EditTemplate/Field/Remove/Hint": {
"title": "$:/language/EditTemplate/Field/Remove/Hint",
"text": "Remove field"
},
"$:/language/EditTemplate/Field/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Field/Dropdown/Caption",
"text": "field list"
},
"$:/language/EditTemplate/Field/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Field/Dropdown/Hint",
"text": "Show field list"
},
"$:/language/EditTemplate/Fields/Add/Button": {
"title": "$:/language/EditTemplate/Fields/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
"text": "field name"
},
"$:/language/EditTemplate/Fields/Add/Prompt": {
"title": "$:/language/EditTemplate/Fields/Add/Prompt",
"text": "Add a new field:"
},
"$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
"text": "field value"
},
"$:/language/EditTemplate/Fields/Add/Dropdown/System": {
"title": "$:/language/EditTemplate/Fields/Add/Dropdown/System",
"text": "System fields"
},
"$:/language/EditTemplate/Fields/Add/Dropdown/User": {
"title": "$:/language/EditTemplate/Fields/Add/Dropdown/User",
"text": "User fields"
},
"$:/language/EditTemplate/Shadow/Warning": {
"title": "$:/language/EditTemplate/Shadow/Warning",
"text": "This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>"
},
"$:/language/EditTemplate/Shadow/OverriddenWarning": {
"title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
"text": "This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler"
},
"$:/language/EditTemplate/Tags/Add/Button": {
"title": "$:/language/EditTemplate/Tags/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Tags/Add/Placeholder": {
"title": "$:/language/EditTemplate/Tags/Add/Placeholder",
"text": "tag name"
},
"$:/language/EditTemplate/Tags/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
"text": "tag list"
},
"$:/language/EditTemplate/Tags/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
"text": "Show tag list"
},
"$:/language/EditTemplate/Title/BadCharacterWarning": {
"title": "$:/language/EditTemplate/Title/BadCharacterWarning",
"text": "Warning: avoid using any of the characters <<bad-chars>> in tiddler titles"
},
"$:/language/EditTemplate/Title/Exists/Prompt": {
"title": "$:/language/EditTemplate/Title/Exists/Prompt",
"text": "Target tiddler already exists"
},
"$:/language/EditTemplate/Title/Relink/Prompt": {
"title": "$:/language/EditTemplate/Title/Relink/Prompt",
"text": "Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers"
},
"$:/language/EditTemplate/Title/References/Prompt": {
"title": "$:/language/EditTemplate/Title/References/Prompt",
"text": "The following references to this tiddler will not be automatically updated:"
},
"$:/language/EditTemplate/Type/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Type/Dropdown/Caption",
"text": "content type list"
},
"$:/language/EditTemplate/Type/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Type/Dropdown/Hint",
"text": "Show content type list"
},
"$:/language/EditTemplate/Type/Delete/Caption": {
"title": "$:/language/EditTemplate/Type/Delete/Caption",
"text": "delete content type"
},
"$:/language/EditTemplate/Type/Delete/Hint": {
"title": "$:/language/EditTemplate/Type/Delete/Hint",
"text": "Delete content type"
},
"$:/language/EditTemplate/Type/Placeholder": {
"title": "$:/language/EditTemplate/Type/Placeholder",
"text": "content type"
},
"$:/language/EditTemplate/Type/Prompt": {
"title": "$:/language/EditTemplate/Type/Prompt",
"text": "Type:"
},
"$:/language/Exporters/StaticRiver": {
"title": "$:/language/Exporters/StaticRiver",
"text": "Static HTML"
},
"$:/language/Exporters/JsonFile": {
"title": "$:/language/Exporters/JsonFile",
"text": "JSON file"
},
"$:/language/Exporters/CsvFile": {
"title": "$:/language/Exporters/CsvFile",
"text": "CSV file"
},
"$:/language/Exporters/TidFile": {
"title": "$:/language/Exporters/TidFile",
"text": "\".tid\" file"
},
"$:/language/Docs/Fields/_canonical_uri": {
"title": "$:/language/Docs/Fields/_canonical_uri",
"text": "The full URI of an external image tiddler"
},
"$:/language/Docs/Fields/bag": {
"title": "$:/language/Docs/Fields/bag",
"text": "The name of the bag from which a tiddler came"
},
"$:/language/Docs/Fields/caption": {
"title": "$:/language/Docs/Fields/caption",
"text": "The text to be displayed on a tab or button"
},
"$:/language/Docs/Fields/color": {
"title": "$:/language/Docs/Fields/color",
"text": "The CSS color value associated with a tiddler"
},
"$:/language/Docs/Fields/component": {
"title": "$:/language/Docs/Fields/component",
"text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
},
"$:/language/Docs/Fields/current-tiddler": {
"title": "$:/language/Docs/Fields/current-tiddler",
"text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
},
"$:/language/Docs/Fields/created": {
"title": "$:/language/Docs/Fields/created",
"text": "The date a tiddler was created"
},
"$:/language/Docs/Fields/creator": {
"title": "$:/language/Docs/Fields/creator",
"text": "The name of the person who created a tiddler"
},
"$:/language/Docs/Fields/dependents": {
"title": "$:/language/Docs/Fields/dependents",
"text": "For a plugin, lists the dependent plugin titles"
},
"$:/language/Docs/Fields/description": {
"title": "$:/language/Docs/Fields/description",
"text": "The descriptive text for a plugin, or a modal dialogue"
},
"$:/language/Docs/Fields/draft.of": {
"title": "$:/language/Docs/Fields/draft.of",
"text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
},
"$:/language/Docs/Fields/draft.title": {
"title": "$:/language/Docs/Fields/draft.title",
"text": "For draft tiddlers, contains the proposed new title of the tiddler"
},
"$:/language/Docs/Fields/footer": {
"title": "$:/language/Docs/Fields/footer",
"text": "The footer text for a wizard"
},
"$:/language/Docs/Fields/hack-to-give-us-something-to-compare-against": {
"title": "$:/language/Docs/Fields/hack-to-give-us-something-to-compare-against",
"text": "A temporary storage field used in [[$:/core/templates/static.content]]"
},
"$:/language/Docs/Fields/hide-body": {
"title": "$:/language/Docs/Fields/hide-body",
"text": "The view template will hide bodies of tiddlers if set to: ''yes''"
},
"$:/language/Docs/Fields/icon": {
"title": "$:/language/Docs/Fields/icon",
"text": "The title of the tiddler containing the icon associated with a tiddler"
},
"$:/language/Docs/Fields/library": {
"title": "$:/language/Docs/Fields/library",
"text": "Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''"
},
"$:/language/Docs/Fields/list": {
"title": "$:/language/Docs/Fields/list",
"text": "An ordered list of tiddler titles associated with a tiddler"
},
"$:/language/Docs/Fields/list-before": {
"title": "$:/language/Docs/Fields/list-before",
"text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
},
"$:/language/Docs/Fields/list-after": {
"title": "$:/language/Docs/Fields/list-after",
"text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty"
},
"$:/language/Docs/Fields/modified": {
"title": "$:/language/Docs/Fields/modified",
"text": "The date and time at which a tiddler was last modified"
},
"$:/language/Docs/Fields/modifier": {
"title": "$:/language/Docs/Fields/modifier",
"text": "The tiddler title associated with the person who last modified a tiddler"
},
"$:/language/Docs/Fields/name": {
"title": "$:/language/Docs/Fields/name",
"text": "The human readable name associated with a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-priority": {
"title": "$:/language/Docs/Fields/plugin-priority",
"text": "A numerical value indicating the priority of a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-type": {
"title": "$:/language/Docs/Fields/plugin-type",
"text": "The type of plugin in a plugin tiddler"
},
"$:/language/Docs/Fields/revision": {
"title": "$:/language/Docs/Fields/revision",
"text": "The revision of the tiddler held at the server"
},
"$:/language/Docs/Fields/released": {
"title": "$:/language/Docs/Fields/released",
"text": "Date of a TiddlyWiki release"
},
"$:/language/Docs/Fields/source": {
"title": "$:/language/Docs/Fields/source",
"text": "The source URL associated with a tiddler"
},
"$:/language/Docs/Fields/subtitle": {
"title": "$:/language/Docs/Fields/subtitle",
"text": "The subtitle text for a wizard"
},
"$:/language/Docs/Fields/tags": {
"title": "$:/language/Docs/Fields/tags",
"text": "A list of tags associated with a tiddler"
},
"$:/language/Docs/Fields/text": {
"title": "$:/language/Docs/Fields/text",
"text": "The body text of a tiddler"
},
"$:/language/Docs/Fields/title": {
"title": "$:/language/Docs/Fields/title",
"text": "The unique name of a tiddler"
},
"$:/language/Docs/Fields/toc-link": {
"title": "$:/language/Docs/Fields/toc-link",
"text": "Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''"
},
"$:/language/Docs/Fields/type": {
"title": "$:/language/Docs/Fields/type",
"text": "The content type of a tiddler"
},
"$:/language/Docs/Fields/version": {
"title": "$:/language/Docs/Fields/version",
"text": "Version information for a plugin"
},
"$:/language/Filters/AllTiddlers": {
"title": "$:/language/Filters/AllTiddlers",
"text": "All tiddlers except system tiddlers"
},
"$:/language/Filters/RecentSystemTiddlers": {
"title": "$:/language/Filters/RecentSystemTiddlers",
"text": "Recently modified tiddlers, including system tiddlers"
},
"$:/language/Filters/RecentTiddlers": {
"title": "$:/language/Filters/RecentTiddlers",
"text": "Recently modified tiddlers"
},
"$:/language/Filters/AllTags": {
"title": "$:/language/Filters/AllTags",
"text": "All tags except system tags"
},
"$:/language/Filters/Missing": {
"title": "$:/language/Filters/Missing",
"text": "Missing tiddlers"
},
"$:/language/Filters/Drafts": {
"title": "$:/language/Filters/Drafts",
"text": "Draft tiddlers"
},
"$:/language/Filters/Orphans": {
"title": "$:/language/Filters/Orphans",
"text": "Orphan tiddlers"
},
"$:/language/Filters/SystemTiddlers": {
"title": "$:/language/Filters/SystemTiddlers",
"text": "System tiddlers"
},
"$:/language/Filters/ShadowTiddlers": {
"title": "$:/language/Filters/ShadowTiddlers",
"text": "Shadow tiddlers"
},
"$:/language/Filters/OverriddenShadowTiddlers": {
"title": "$:/language/Filters/OverriddenShadowTiddlers",
"text": "Overridden shadow tiddlers"
},
"$:/language/Filters/SessionTiddlers": {
"title": "$:/language/Filters/SessionTiddlers",
"text": "Tiddlers modified since the wiki was loaded"
},
"$:/language/Filters/SystemTags": {
"title": "$:/language/Filters/SystemTags",
"text": "System tags"
},
"$:/language/Filters/StoryList": {
"title": "$:/language/Filters/StoryList",
"text": "Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>"
},
"$:/language/Filters/TypedTiddlers": {
"title": "$:/language/Filters/TypedTiddlers",
"text": "Non wiki-text tiddlers"
},
"GettingStarted": {
"title": "GettingStarted",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
},
"$:/language/Help/build": {
"title": "$:/language/Help/build",
"description": "Automatically run configured commands",
"text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
},
"$:/language/Help/clearpassword": {
"title": "$:/language/Help/clearpassword",
"description": "Clear a password for subsequent crypto operations",
"text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
},
"$:/language/Help/default": {
"title": "$:/language/Help/default",
"text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
},
"$:/language/Help/deletetiddlers": {
"title": "$:/language/Help/deletetiddlers",
"description": "Deletes a group of tiddlers",
"text": "<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\n```\n"
},
"$:/language/Help/editions": {
"title": "$:/language/Help/editions",
"description": "Lists the available editions of TiddlyWiki",
"text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
},
"$:/language/Help/fetch": {
"title": "$:/language/Help/fetch",
"description": "Fetch tiddlers from wiki by URL",
"text": "Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\n\n"
},
"$:/language/Help/help": {
"title": "$:/language/Help/help",
"description": "Display help for TiddlyWiki commands",
"text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
},
"$:/language/Help/import": {
"title": "$:/language/Help/import",
"description": "Import tiddlers from a file",
"text": "Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\n"
},
"$:/language/Help/init": {
"title": "$:/language/Help/init",
"description": "Initialise a new wiki folder",
"text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
},
"$:/language/Help/listen": {
"title": "$:/language/Help/listen",
"description": "Provides an HTTP server interface to TiddlyWiki",
"text": "Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of header to be used for trusted authentication\n* ''readers'' - comma separated list of principals allowed to read from this wiki\n* ''writers'' - comma separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n"
},
"$:/language/Help/load": {
"title": "$:/language/Help/load",
"description": "Load tiddlers from a file",
"text": "Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
},
"$:/language/Help/makelibrary": {
"title": "$:/language/Help/makelibrary",
"description": "Construct library plugin required by upgrade process",
"text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
},
"$:/language/Help/notfound": {
"title": "$:/language/Help/notfound",
"text": "No such help item"
},
"$:/language/Help/output": {
"title": "$:/language/Help/output",
"description": "Set the base output directory for subsequent commands",
"text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
},
"$:/language/Help/password": {
"title": "$:/language/Help/password",
"description": "Set a password for subsequent crypto operations",
"text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\n"
},
"$:/language/Help/render": {
"title": "$:/language/Help/render",
"description": "Renders individual tiddlers to files",
"text": "Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>]\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variable\n* ''value'': Value of optional variable\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render \"[!is[system]]\" \"[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]\"` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n\n"
},
"$:/language/Help/rendertiddler": {
"title": "$:/language/Help/rendertiddler",
"description": "Render an individual tiddler as a specified ContentType",
"text": "(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n"
},
"$:/language/Help/rendertiddlers": {
"title": "$:/language/Help/rendertiddlers",
"description": "Render tiddlers matching a filter to a specified ContentType",
"text": "(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\n"
},
"$:/language/Help/save": {
"title": "$:/language/Help/save",
"description": "Saves individual raw tiddlers to files",
"text": "Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n"
},
"$:/language/Help/savetiddler": {
"title": "$:/language/Help/savetiddler",
"description": "Saves a raw tiddler to a file",
"text": "(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves an individual tiddler in its raw text or binary format to the specified filename.\n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/savetiddlers": {
"title": "$:/language/Help/savetiddlers",
"description": "Saves a group of raw tiddlers to a directory",
"text": "(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\n\n```\n--savetiddlers <filter> <pathname> [\"noclean\"]\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\n\nAny missing directories in the pathname are automatically created.\n"
},
"$:/language/Help/savewikifolder": {
"title": "$:/language/Help/savewikifolder",
"description": "Saves a wiki to a new wiki folder",
"text": "<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>]\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n"
},
"$:/language/Help/server": {
"title": "$:/language/Help/server",
"description": "Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)",
"text": "Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\n\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n"
},
"$:/language/Help/setfield": {
"title": "$:/language/Help/setfield",
"description": "Prepares external tiddlers for use",
"text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n"
},
"$:/language/Help/unpackplugin": {
"title": "$:/language/Help/unpackplugin",
"description": "Unpack the payload tiddlers from a plugin",
"text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
},
"$:/language/Help/verbose": {
"title": "$:/language/Help/verbose",
"description": "Triggers verbose output mode",
"text": "Triggers verbose output, useful for debugging\n\n```\n--verbose\n```\n"
},
"$:/language/Help/version": {
"title": "$:/language/Help/version",
"description": "Displays the version number of TiddlyWiki",
"text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
},
"$:/language/Import/Imported/Hint": {
"title": "$:/language/Import/Imported/Hint",
"text": "The following tiddlers were imported:"
},
"$:/language/Import/Listing/Cancel/Caption": {
"title": "$:/language/Import/Listing/Cancel/Caption",
"text": "Cancel"
},
"$:/language/Import/Listing/Hint": {
"title": "$:/language/Import/Listing/Hint",
"text": "These tiddlers are ready to import:"
},
"$:/language/Import/Listing/Import/Caption": {
"title": "$:/language/Import/Listing/Import/Caption",
"text": "Import"
},
"$:/language/Import/Listing/Select/Caption": {
"title": "$:/language/Import/Listing/Select/Caption",
"text": "Select"
},
"$:/language/Import/Listing/Status/Caption": {
"title": "$:/language/Import/Listing/Status/Caption",
"text": "Status"
},
"$:/language/Import/Listing/Title/Caption": {
"title": "$:/language/Import/Listing/Title/Caption",
"text": "Title"
},
"$:/language/Import/Listing/Preview": {
"title": "$:/language/Import/Listing/Preview",
"text": "Preview:"
},
"$:/language/Import/Listing/Preview/Text": {
"title": "$:/language/Import/Listing/Preview/Text",
"text": "Text"
},
"$:/language/Import/Listing/Preview/TextRaw": {
"title": "$:/language/Import/Listing/Preview/TextRaw",
"text": "Text (Raw)"
},
"$:/language/Import/Listing/Preview/Fields": {
"title": "$:/language/Import/Listing/Preview/Fields",
"text": "Fields"
},
"$:/language/Import/Listing/Preview/Diff": {
"title": "$:/language/Import/Listing/Preview/Diff",
"text": "Diff"
},
"$:/language/Import/Listing/Preview/DiffFields": {
"title": "$:/language/Import/Listing/Preview/DiffFields",
"text": "Diff (Fields)"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
"text": "Blocked incompatible or obsolete plugin"
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
"text": "Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>)"
},
"$:/language/Import/Upgrader/Plugins/Upgraded": {
"title": "$:/language/Import/Upgrader/Plugins/Upgraded",
"text": "Upgraded plugin from <<incoming>> to <<upgraded>>"
},
"$:/language/Import/Upgrader/State/Suppressed": {
"title": "$:/language/Import/Upgrader/State/Suppressed",
"text": "Blocked temporary state tiddler"
},
"$:/language/Import/Upgrader/System/Suppressed": {
"title": "$:/language/Import/Upgrader/System/Suppressed",
"text": "Blocked system tiddler"
},
"$:/language/Import/Upgrader/System/Warning": {
"title": "$:/language/Import/Upgrader/System/Warning",
"text": "Core module tiddler"
},
"$:/language/Import/Upgrader/System/Alert": {
"title": "$:/language/Import/Upgrader/System/Alert",
"text": "You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable"
},
"$:/language/Import/Upgrader/ThemeTweaks/Created": {
"title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
"text": "Migrated theme tweak from <$text text=<<from>>/>"
},
"$:/language/AboveStory/ClassicPlugin/Warning": {
"title": "$:/language/AboveStory/ClassicPlugin/Warning",
"text": "It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:"
},
"$:/language/BinaryWarning/Prompt": {
"title": "$:/language/BinaryWarning/Prompt",
"text": "This tiddler contains binary data"
},
"$:/language/ClassicWarning/Hint": {
"title": "$:/language/ClassicWarning/Hint",
"text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details."
},
"$:/language/ClassicWarning/Upgrade/Caption": {
"title": "$:/language/ClassicWarning/Upgrade/Caption",
"text": "upgrade"
},
"$:/language/CloseAll/Button": {
"title": "$:/language/CloseAll/Button",
"text": "close all"
},
"$:/language/ColourPicker/Recent": {
"title": "$:/language/ColourPicker/Recent",
"text": "Recent:"
},
"$:/language/ConfirmCancelTiddler": {
"title": "$:/language/ConfirmCancelTiddler",
"text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmDeleteTiddler": {
"title": "$:/language/ConfirmDeleteTiddler",
"text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmOverwriteTiddler": {
"title": "$:/language/ConfirmOverwriteTiddler",
"text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmEditShadowTiddler": {
"title": "$:/language/ConfirmEditShadowTiddler",
"text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
},
"$:/language/Count": {
"title": "$:/language/Count",
"text": "count"
},
"$:/language/DefaultNewTiddlerTitle": {
"title": "$:/language/DefaultNewTiddlerTitle",
"text": "New Tiddler"
},
"$:/language/Diffs/CountMessage": {
"title": "$:/language/Diffs/CountMessage",
"text": "<<diff-count>> differences"
},
"$:/language/DropMessage": {
"title": "$:/language/DropMessage",
"text": "Drop here (or use the 'Escape' key to cancel)"
},
"$:/language/Encryption/Cancel": {
"title": "$:/language/Encryption/Cancel",
"text": "Cancel"
},
"$:/language/Encryption/ConfirmClearPassword": {
"title": "$:/language/Encryption/ConfirmClearPassword",
"text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki"
},
"$:/language/Encryption/PromptSetPassword": {
"title": "$:/language/Encryption/PromptSetPassword",
"text": "Set a new password for this TiddlyWiki"
},
"$:/language/Encryption/Username": {
"title": "$:/language/Encryption/Username",
"text": "Username"
},
"$:/language/Encryption/Password": {
"title": "$:/language/Encryption/Password",
"text": "Password"
},
"$:/language/Encryption/RepeatPassword": {
"title": "$:/language/Encryption/RepeatPassword",
"text": "Repeat password"
},
"$:/language/Encryption/PasswordNoMatch": {
"title": "$:/language/Encryption/PasswordNoMatch",
"text": "Passwords do not match"
},
"$:/language/Encryption/SetPassword": {
"title": "$:/language/Encryption/SetPassword",
"text": "Set password"
},
"$:/language/Error/Caption": {
"title": "$:/language/Error/Caption",
"text": "Error"
},
"$:/language/Error/EditConflict": {
"title": "$:/language/Error/EditConflict",
"text": "File changed on server"
},
"$:/language/Error/Filter": {
"title": "$:/language/Error/Filter",
"text": "Filter error"
},
"$:/language/Error/FilterSyntax": {
"title": "$:/language/Error/FilterSyntax",
"text": "Syntax error in filter expression"
},
"$:/language/Error/IsFilterOperator": {
"title": "$:/language/Error/IsFilterOperator",
"text": "Filter Error: Unknown operand for the 'is' filter operator"
},
"$:/language/Error/LoadingPluginLibrary": {
"title": "$:/language/Error/LoadingPluginLibrary",
"text": "Error loading plugin library"
},
"$:/language/Error/RecursiveTransclusion": {
"title": "$:/language/Error/RecursiveTransclusion",
"text": "Recursive transclusion error in transclude widget"
},
"$:/language/Error/RetrievingSkinny": {
"title": "$:/language/Error/RetrievingSkinny",
"text": "Error retrieving skinny tiddler list"
},
"$:/language/Error/SavingToTWEdit": {
"title": "$:/language/Error/SavingToTWEdit",
"text": "Error saving to TWEdit"
},
"$:/language/Error/WhileSaving": {
"title": "$:/language/Error/WhileSaving",
"text": "Error while saving"
},
"$:/language/Error/XMLHttpRequest": {
"title": "$:/language/Error/XMLHttpRequest",
"text": "XMLHttpRequest error code"
},
"$:/language/InternalJavaScriptError/Title": {
"title": "$:/language/InternalJavaScriptError/Title",
"text": "Internal JavaScript Error"
},
"$:/language/InternalJavaScriptError/Hint": {
"title": "$:/language/InternalJavaScriptError/Hint",
"text": "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser"
},
"$:/language/InvalidFieldName": {
"title": "$:/language/InvalidFieldName",
"text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
},
"$:/language/LazyLoadingWarning": {
"title": "$:/language/LazyLoadingWarning",
"text": "<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>"
},
"$:/language/LoginToTiddlySpace": {
"title": "$:/language/LoginToTiddlySpace",
"text": "Login to TiddlySpace"
},
"$:/language/Manager/Controls/FilterByTag/None": {
"title": "$:/language/Manager/Controls/FilterByTag/None",
"text": "(none)"
},
"$:/language/Manager/Controls/FilterByTag/Prompt": {
"title": "$:/language/Manager/Controls/FilterByTag/Prompt",
"text": "Filter by tag:"
},
"$:/language/Manager/Controls/Order/Prompt": {
"title": "$:/language/Manager/Controls/Order/Prompt",
"text": "Reverse order"
},
"$:/language/Manager/Controls/Search/Placeholder": {
"title": "$:/language/Manager/Controls/Search/Placeholder",
"text": "Search"
},
"$:/language/Manager/Controls/Search/Prompt": {
"title": "$:/language/Manager/Controls/Search/Prompt",
"text": "Search:"
},
"$:/language/Manager/Controls/Show/Option/Tags": {
"title": "$:/language/Manager/Controls/Show/Option/Tags",
"text": "tags"
},
"$:/language/Manager/Controls/Show/Option/Tiddlers": {
"title": "$:/language/Manager/Controls/Show/Option/Tiddlers",
"text": "tiddlers"
},
"$:/language/Manager/Controls/Show/Prompt": {
"title": "$:/language/Manager/Controls/Show/Prompt",
"text": "Show:"
},
"$:/language/Manager/Controls/Sort/Prompt": {
"title": "$:/language/Manager/Controls/Sort/Prompt",
"text": "Sort by:"
},
"$:/language/Manager/Item/Colour": {
"title": "$:/language/Manager/Item/Colour",
"text": "Colour"
},
"$:/language/Manager/Item/Fields": {
"title": "$:/language/Manager/Item/Fields",
"text": "Fields"
},
"$:/language/Manager/Item/Icon/None": {
"title": "$:/language/Manager/Item/Icon/None",
"text": "(none)"
},
"$:/language/Manager/Item/Icon": {
"title": "$:/language/Manager/Item/Icon",
"text": "Icon"
},
"$:/language/Manager/Item/RawText": {
"title": "$:/language/Manager/Item/RawText",
"text": "Raw text"
},
"$:/language/Manager/Item/Tags": {
"title": "$:/language/Manager/Item/Tags",
"text": "Tags"
},
"$:/language/Manager/Item/Tools": {
"title": "$:/language/Manager/Item/Tools",
"text": "Tools"
},
"$:/language/Manager/Item/WikifiedText": {
"title": "$:/language/Manager/Item/WikifiedText",
"text": "Wikified text"
},
"$:/language/MissingTiddler/Hint": {
"title": "$:/language/MissingTiddler/Hint",
"text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create"
},
"$:/language/No": {
"title": "$:/language/No",
"text": "No"
},
"$:/language/OfficialPluginLibrary": {
"title": "$:/language/OfficialPluginLibrary",
"text": "Official ~TiddlyWiki Plugin Library"
},
"$:/language/OfficialPluginLibrary/Hint": {
"title": "$:/language/OfficialPluginLibrary/Hint",
"text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team."
},
"$:/language/PluginReloadWarning": {
"title": "$:/language/PluginReloadWarning",
"text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to plugins to take effect"
},
"$:/language/RecentChanges/DateFormat": {
"title": "$:/language/RecentChanges/DateFormat",
"text": "DDth MMM YYYY"
},
"$:/language/SystemTiddler/Tooltip": {
"title": "$:/language/SystemTiddler/Tooltip",
"text": "This is a system tiddler"
},
"$:/language/SystemTiddlers/Include/Prompt": {
"title": "$:/language/SystemTiddlers/Include/Prompt",
"text": "Include system tiddlers"
},
"$:/language/TagManager/Colour/Heading": {
"title": "$:/language/TagManager/Colour/Heading",
"text": "Colour"
},
"$:/language/TagManager/Count/Heading": {
"title": "$:/language/TagManager/Count/Heading",
"text": "Count"
},
"$:/language/TagManager/Icon/Heading": {
"title": "$:/language/TagManager/Icon/Heading",
"text": "Icon"
},
"$:/language/TagManager/Info/Heading": {
"title": "$:/language/TagManager/Info/Heading",
"text": "Info"
},
"$:/language/TagManager/Tag/Heading": {
"title": "$:/language/TagManager/Tag/Heading",
"text": "Tag"
},
"$:/language/Tiddler/DateFormat": {
"title": "$:/language/Tiddler/DateFormat",
"text": "DDth MMM YYYY at hh12:0mmam"
},
"$:/language/UnsavedChangesWarning": {
"title": "$:/language/UnsavedChangesWarning",
"text": "You have unsaved changes in TiddlyWiki"
},
"$:/language/Yes": {
"title": "$:/language/Yes",
"text": "Yes"
},
"$:/language/Modals/Download": {
"title": "$:/language/Modals/Download",
"subtitle": "Download changes",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "https://tiddlywiki.com/static/DownloadingChanges.html",
"text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
},
"$:/language/Modals/SaveInstructions": {
"title": "$:/language/Modals/SaveInstructions",
"subtitle": "Save your work",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "https://tiddlywiki.com/static/SavingChanges.html",
"text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
},
"$:/config/NewJournal/Title": {
"title": "$:/config/NewJournal/Title",
"text": "DDth MMM YYYY"
},
"$:/config/NewJournal/Text": {
"title": "$:/config/NewJournal/Text",
"text": ""
},
"$:/config/NewJournal/Tags": {
"title": "$:/config/NewJournal/Tags",
"text": "Journal"
},
"$:/language/Notifications/Save/Done": {
"title": "$:/language/Notifications/Save/Done",
"text": "Saved wiki"
},
"$:/language/Notifications/Save/Starting": {
"title": "$:/language/Notifications/Save/Starting",
"text": "Starting to save wiki"
},
"$:/language/Notifications/CopiedToClipboard/Succeeded": {
"title": "$:/language/Notifications/CopiedToClipboard/Succeeded",
"text": "Copied to clipboard!"
},
"$:/language/Notifications/CopiedToClipboard/Failed": {
"title": "$:/language/Notifications/CopiedToClipboard/Failed",
"text": "Failed to copy to clipboard!"
},
"$:/language/Search/DefaultResults/Caption": {
"title": "$:/language/Search/DefaultResults/Caption",
"text": "List"
},
"$:/language/Search/Filter/Caption": {
"title": "$:/language/Search/Filter/Caption",
"text": "Filter"
},
"$:/language/Search/Filter/Hint": {
"title": "$:/language/Search/Filter/Hint",
"text": "Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]"
},
"$:/language/Search/Filter/Matches": {
"title": "$:/language/Search/Filter/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches": {
"title": "$:/language/Search/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches/All": {
"title": "$:/language/Search/Matches/All",
"text": "All matches:"
},
"$:/language/Search/Matches/Title": {
"title": "$:/language/Search/Matches/Title",
"text": "Title matches:"
},
"$:/language/Search/Search": {
"title": "$:/language/Search/Search",
"text": "Search"
},
"$:/language/Search/Search/TooShort": {
"title": "$:/language/Search/Search/TooShort",
"text": "Search text too short"
},
"$:/language/Search/Shadows/Caption": {
"title": "$:/language/Search/Shadows/Caption",
"text": "Shadows"
},
"$:/language/Search/Shadows/Hint": {
"title": "$:/language/Search/Shadows/Hint",
"text": "Search for shadow tiddlers"
},
"$:/language/Search/Shadows/Matches": {
"title": "$:/language/Search/Shadows/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Standard/Caption": {
"title": "$:/language/Search/Standard/Caption",
"text": "Standard"
},
"$:/language/Search/Standard/Hint": {
"title": "$:/language/Search/Standard/Hint",
"text": "Search for standard tiddlers"
},
"$:/language/Search/Standard/Matches": {
"title": "$:/language/Search/Standard/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/System/Caption": {
"title": "$:/language/Search/System/Caption",
"text": "System"
},
"$:/language/Search/System/Hint": {
"title": "$:/language/Search/System/Hint",
"text": "Search for system tiddlers"
},
"$:/language/Search/System/Matches": {
"title": "$:/language/Search/System/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/SideBar/All/Caption": {
"title": "$:/language/SideBar/All/Caption",
"text": "All"
},
"$:/language/SideBar/Contents/Caption": {
"title": "$:/language/SideBar/Contents/Caption",
"text": "Contents"
},
"$:/language/SideBar/Drafts/Caption": {
"title": "$:/language/SideBar/Drafts/Caption",
"text": "Drafts"
},
"$:/language/SideBar/Explorer/Caption": {
"title": "$:/language/SideBar/Explorer/Caption",
"text": "Explorer"
},
"$:/language/SideBar/Missing/Caption": {
"title": "$:/language/SideBar/Missing/Caption",
"text": "Missing"
},
"$:/language/SideBar/More/Caption": {
"title": "$:/language/SideBar/More/Caption",
"text": "More"
},
"$:/language/SideBar/Open/Caption": {
"title": "$:/language/SideBar/Open/Caption",
"text": "Open"
},
"$:/language/SideBar/Orphans/Caption": {
"title": "$:/language/SideBar/Orphans/Caption",
"text": "Orphans"
},
"$:/language/SideBar/Recent/Caption": {
"title": "$:/language/SideBar/Recent/Caption",
"text": "Recent"
},
"$:/language/SideBar/Shadows/Caption": {
"title": "$:/language/SideBar/Shadows/Caption",
"text": "Shadows"
},
"$:/language/SideBar/System/Caption": {
"title": "$:/language/SideBar/System/Caption",
"text": "System"
},
"$:/language/SideBar/Tags/Caption": {
"title": "$:/language/SideBar/Tags/Caption",
"text": "Tags"
},
"$:/language/SideBar/Tags/Untagged/Caption": {
"title": "$:/language/SideBar/Tags/Untagged/Caption",
"text": "untagged"
},
"$:/language/SideBar/Tools/Caption": {
"title": "$:/language/SideBar/Tools/Caption",
"text": "Tools"
},
"$:/language/SideBar/Types/Caption": {
"title": "$:/language/SideBar/Types/Caption",
"text": "Types"
},
"$:/SiteSubtitle": {
"title": "$:/SiteSubtitle",
"text": "a non-linear personal web notebook"
},
"$:/SiteTitle": {
"title": "$:/SiteTitle",
"text": "My ~TiddlyWiki"
},
"$:/language/Snippets/ListByTag": {
"title": "$:/language/Snippets/ListByTag",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "List of tiddlers by tag",
"text": "<<list-links \"[tag[task]sort[title]]\">>\n"
},
"$:/language/Snippets/MacroDefinition": {
"title": "$:/language/Snippets/MacroDefinition",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Macro definition",
"text": "\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n"
},
"$:/language/Snippets/Table4x3": {
"title": "$:/language/Snippets/Table4x3",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Table with 4 columns by 3 rows",
"text": "|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n"
},
"$:/language/Snippets/TableOfContents": {
"title": "$:/language/Snippets/TableOfContents",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Table of Contents",
"text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>"
},
"$:/language/ThemeTweaks/ThemeTweaks": {
"title": "$:/language/ThemeTweaks/ThemeTweaks",
"text": "Theme Tweaks"
},
"$:/language/ThemeTweaks/ThemeTweaks/Hint": {
"title": "$:/language/ThemeTweaks/ThemeTweaks/Hint",
"text": "You can tweak certain aspects of the ''Vanilla'' theme."
},
"$:/language/ThemeTweaks/Options": {
"title": "$:/language/ThemeTweaks/Options",
"text": "Options"
},
"$:/language/ThemeTweaks/Options/SidebarLayout": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout",
"text": "Sidebar layout"
},
"$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid",
"text": "Fixed story, fluid sidebar"
},
"$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed",
"text": "Fluid story, fixed sidebar"
},
"$:/language/ThemeTweaks/Options/StickyTitles": {
"title": "$:/language/ThemeTweaks/Options/StickyTitles",
"text": "Sticky titles"
},
"$:/language/ThemeTweaks/Options/StickyTitles/Hint": {
"title": "$:/language/ThemeTweaks/Options/StickyTitles/Hint",
"text": "Causes tiddler titles to \"stick\" to the top of the browser window"
},
"$:/language/ThemeTweaks/Options/CodeWrapping": {
"title": "$:/language/ThemeTweaks/Options/CodeWrapping",
"text": "Wrap long lines in code blocks"
},
"$:/language/ThemeTweaks/Settings": {
"title": "$:/language/ThemeTweaks/Settings",
"text": "Settings"
},
"$:/language/ThemeTweaks/Settings/FontFamily": {
"title": "$:/language/ThemeTweaks/Settings/FontFamily",
"text": "Font family"
},
"$:/language/ThemeTweaks/Settings/CodeFontFamily": {
"title": "$:/language/ThemeTweaks/Settings/CodeFontFamily",
"text": "Code font family"
},
"$:/language/ThemeTweaks/Settings/EditorFontFamily": {
"title": "$:/language/ThemeTweaks/Settings/EditorFontFamily",
"text": "Editor font family"
},
"$:/language/ThemeTweaks/Settings/BackgroundImage": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImage",
"text": "Page background image"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment",
"text": "Page background image attachment"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll",
"text": "Scroll with tiddlers"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed",
"text": "Fixed to window"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize",
"text": "Page background image size"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto",
"text": "Auto"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover",
"text": "Cover"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain",
"text": "Contain"
},
"$:/language/ThemeTweaks/Metrics": {
"title": "$:/language/ThemeTweaks/Metrics",
"text": "Sizes"
},
"$:/language/ThemeTweaks/Metrics/FontSize": {
"title": "$:/language/ThemeTweaks/Metrics/FontSize",
"text": "Font size"
},
"$:/language/ThemeTweaks/Metrics/LineHeight": {
"title": "$:/language/ThemeTweaks/Metrics/LineHeight",
"text": "Line height"
},
"$:/language/ThemeTweaks/Metrics/BodyFontSize": {
"title": "$:/language/ThemeTweaks/Metrics/BodyFontSize",
"text": "Font size for tiddler body"
},
"$:/language/ThemeTweaks/Metrics/BodyLineHeight": {
"title": "$:/language/ThemeTweaks/Metrics/BodyLineHeight",
"text": "Line height for tiddler body"
},
"$:/language/ThemeTweaks/Metrics/StoryLeft": {
"title": "$:/language/ThemeTweaks/Metrics/StoryLeft",
"text": "Story left position"
},
"$:/language/ThemeTweaks/Metrics/StoryLeft/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint",
"text": "how far the left margin of the story river<br>(tiddler area) is from the left of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryTop": {
"title": "$:/language/ThemeTweaks/Metrics/StoryTop",
"text": "Story top position"
},
"$:/language/ThemeTweaks/Metrics/StoryTop/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryTop/Hint",
"text": "how far the top margin of the story river<br>is from the top of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryRight": {
"title": "$:/language/ThemeTweaks/Metrics/StoryRight",
"text": "Story right"
},
"$:/language/ThemeTweaks/Metrics/StoryRight/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryRight/Hint",
"text": "how far the left margin of the sidebar <br>is from the left of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryWidth": {
"title": "$:/language/ThemeTweaks/Metrics/StoryWidth",
"text": "Story width"
},
"$:/language/ThemeTweaks/Metrics/StoryWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint",
"text": "the overall width of the story river"
},
"$:/language/ThemeTweaks/Metrics/TiddlerWidth": {
"title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth",
"text": "Tiddler width"
},
"$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint",
"text": "within the story river"
},
"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint",
"text": "Sidebar breakpoint"
},
"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint",
"text": "the minimum page width at which the story<br>river and sidebar will appear side by side"
},
"$:/language/ThemeTweaks/Metrics/SidebarWidth": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarWidth",
"text": "Sidebar width"
},
"$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint",
"text": "the width of the sidebar in fluid-fixed layout"
},
"$:/language/TiddlerInfo/Advanced/Caption": {
"title": "$:/language/TiddlerInfo/Advanced/Caption",
"text": "Advanced"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
"text": "none"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
"text": "Plugin Details"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
"text": "This plugin contains the following shadow tiddlers:"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
"text": "Shadow Status"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
"text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
"text": "It is overridden by an ordinary tiddler"
},
"$:/language/TiddlerInfo/Fields/Caption": {
"title": "$:/language/TiddlerInfo/Fields/Caption",
"text": "Fields"
},
"$:/language/TiddlerInfo/List/Caption": {
"title": "$:/language/TiddlerInfo/List/Caption",
"text": "List"
},
"$:/language/TiddlerInfo/List/Empty": {
"title": "$:/language/TiddlerInfo/List/Empty",
"text": "This tiddler does not have a list"
},
"$:/language/TiddlerInfo/Listed/Caption": {
"title": "$:/language/TiddlerInfo/Listed/Caption",
"text": "Listed"
},
"$:/language/TiddlerInfo/Listed/Empty": {
"title": "$:/language/TiddlerInfo/Listed/Empty",
"text": "This tiddler is not listed by any others"
},
"$:/language/TiddlerInfo/References/Caption": {
"title": "$:/language/TiddlerInfo/References/Caption",
"text": "References"
},
"$:/language/TiddlerInfo/References/Empty": {
"title": "$:/language/TiddlerInfo/References/Empty",
"text": "No tiddlers link to this one"
},
"$:/language/TiddlerInfo/Tagging/Caption": {
"title": "$:/language/TiddlerInfo/Tagging/Caption",
"text": "Tagging"
},
"$:/language/TiddlerInfo/Tagging/Empty": {
"title": "$:/language/TiddlerInfo/Tagging/Empty",
"text": "No tiddlers are tagged with this one"
},
"$:/language/TiddlerInfo/Tools/Caption": {
"title": "$:/language/TiddlerInfo/Tools/Caption",
"text": "Tools"
},
"$:/language/Docs/Types/application/javascript": {
"title": "$:/language/Docs/Types/application/javascript",
"description": "JavaScript code",
"name": "application/javascript",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/application/json": {
"title": "$:/language/Docs/Types/application/json",
"description": "JSON data",
"name": "application/json",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/application/x-tiddler-dictionary": {
"title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
"description": "Data dictionary",
"name": "application/x-tiddler-dictionary",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/image/gif": {
"title": "$:/language/Docs/Types/image/gif",
"description": "GIF image",
"name": "image/gif",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/jpeg": {
"title": "$:/language/Docs/Types/image/jpeg",
"description": "JPEG image",
"name": "image/jpeg",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/png": {
"title": "$:/language/Docs/Types/image/png",
"description": "PNG image",
"name": "image/png",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/svg+xml": {
"title": "$:/language/Docs/Types/image/svg+xml",
"description": "Structured Vector Graphics image",
"name": "image/svg+xml",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/x-icon": {
"title": "$:/language/Docs/Types/image/x-icon",
"description": "ICO format icon file",
"name": "image/x-icon",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/text/css": {
"title": "$:/language/Docs/Types/text/css",
"description": "Static stylesheet",
"name": "text/css",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/text/html": {
"title": "$:/language/Docs/Types/text/html",
"description": "HTML markup",
"name": "text/html",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/plain": {
"title": "$:/language/Docs/Types/text/plain",
"description": "Plain text",
"name": "text/plain",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/vnd.tiddlywiki": {
"title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
"description": "TiddlyWiki 5",
"name": "text/vnd.tiddlywiki",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/x-tiddlywiki": {
"title": "$:/language/Docs/Types/text/x-tiddlywiki",
"description": "TiddlyWiki Classic",
"name": "text/x-tiddlywiki",
"group": "Text",
"group-sort": "0"
},
"$:/languages/en-GB/icon": {
"title": "$:/languages/en-GB/icon",
"type": "image/svg+xml",
"text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
},
"$:/languages/en-GB": {
"title": "$:/languages/en-GB",
"name": "en-GB",
"description": "English (British)",
"author": "JeremyRuston",
"core-version": ">=5.0.0\"",
"text": "Stub pseudo-plugin for the default language"
},
"$:/core/modules/commander.js": {
"title": "$:/core/modules/commander.js",
"text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\t\t\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/commands/build.js": {
"title": "$:/core/modules/commands/build.js",
"text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/clearpassword.js": {
"title": "$:/core/modules/commands/clearpassword.js",
"text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/deletetiddlers.js": {
"title": "$:/core/modules/commands/deletetiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/editions.js": {
"title": "$:/core/modules/commands/editions.js",
"text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\" \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/fetch.js": {
"title": "$:/core/modules/commands/fetch.js",
"text": "/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = $tw.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t \tdata = [];\n\t self.commander.write(\"Reading \" + url + \": \");\n\t response.on(\"data\",function(chunk) {\n\t data.push(chunk);\n\t self.commander.write(\".\");\n\t });\n\t response.on(\"end\",function() {\n\t self.commander.write(\"\\n\");\n\t if(response.statusCode === 200) {\n\t\t self.processBody(Buffer.concat(data),type,options,url);\n\t\t callback(null);\n\t } else {\n\t \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t \t} else {\n\t\t \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\t \t\t\n\t \t}\n\t }\n\t \t});\n\t \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/help.js": {
"title": "$:/core/modules/commands/help.js",
"text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/import.js": {
"title": "$:/core/modules/commands/import.js",
"text": "/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/init.js": {
"title": "$:/core/modules/commands/init.js",
"text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/listen.js": {
"title": "$:/core/modules/commands/listen.js",
"text": "/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: [],\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/load.js": {
"title": "$:/core/modules/commands/load.js",
"text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file or directory\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/makelibrary.js": {
"title": "$:/core/modules/commands/makelibrary.js",
"text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = fs.readdirSync(folder);\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = fs.readdirSync(folder);\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcollectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.pluginsPath));\n\tcollectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.themesPath));\n\tcollectPlugins(path.resolve($tw.boot.corePath,$tw.config.languagesPath));\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers},null,$tw.config.preferences.jsonSpaces)\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/output.js": {
"title": "$:/core/modules/commands/output.js",
"text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/password.js": {
"title": "$:/core/modules/commands/password.js",
"text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/render.js": {
"title": "$:/core/modules/commands/render.js",
"text": "/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"render\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing tiddler filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tvarName = this.params[4],\n\t\tvarValue = this.params[5],\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\tvariables = {currentTiddler: title};\n\t\tif(varName) {\n\t\t\tvariables[varName] = varValue || \"\";\n\t\t}\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: variables}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddler.js": {
"title": "$:/core/modules/commands/rendertiddler.js",
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddlers.js": {
"title": "$:/core/modules/commands/rendertiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/save.js": {
"title": "$:/core/modules/commands/save.js",
"text": "/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"save\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savelibrarytiddlers.js": {
"title": "$:/core/modules/commands/savelibrarytiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler,null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{text: undefined, readme: readmeContent, icon: iconContent}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddler.js": {
"title": "$:/core/modules/commands/savetiddler.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddlers.js": {
"title": "$:/core/modules/commands/savetiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savewikifolder.js": {
"title": "$:/core/modules/commands/savewikifolder.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [<filter>]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\n}\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing wiki folder path\";\n\t}\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter || \"[all[tiddlers]]\";\n\tthis.commander = commander;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type] || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler) {\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki\n\t});\n\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/server.js": {
"title": "$:/core/modules/commands/server.js",
"text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/setfield.js": {
"title": "$:/core/modules/commands/setfield.js",
"text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/unpackplugin.js": {
"title": "$:/core/modules/commands/unpackplugin.js",
"text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/verbose.js": {
"title": "$:/core/modules/commands/verbose.js",
"text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n \" + $tw.boot.logMessages.join(\"\\n \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/version.js": {
"title": "$:/core/modules/commands/version.js",
"text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/config.js": {
"title": "$:/core/modules/config.js",
"text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
"type": "application/javascript",
"module-type": "config"
},
"$:/core/modules/deserializers.js": {
"title": "$:/core/modules/deserializers.js",
"text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming,\n\t\tresults = [];\n\ttry {\n\t\tincoming = JSON.parse(text);\n\t} catch(e) {\n\t\tincoming = [{\n\t\t\ttitle: \"JSON error: \" + e,\n\t\t\ttext: \"\"\n\t\t}]\n\t}\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlerdeserializer"
},
"$:/core/modules/editor/engines/framed.js": {
"title": "$:/core/modules/editor/engines/framed.js",
"text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeNode.style[\"background-color\"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText(\"$:/palette\"),\"tiddler-editor-background\");\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"focus\",handlerObject: this,handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\tthis.domNode.style[\"background-color\"] = this.widget.wiki.extractTiddlerDataItem(this.widget.wiki.getTiddlerText(\"$:/palette\"),\"tiddler-editor-background\");\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\t\n/*\nHandle the focus event\n*/\nFramedEngine.prototype.handleFocusEvent = function(event) {\n\tthis.widget.cancelPopups();\n\treturn true;\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/engines/simple.js": {
"title": "$:/core/modules/editor/engines/simple.js",
"text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.domNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tthis.widget.cancelPopups();\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/factory.js": {
"title": "$:/core/modules/editor/factory.js",
"text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE]) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tCancel Popups\n\t*/\n\tEditTextWidget.prototype.cancelPopups = function() {\n\t\t$tw.popup.cancel(0,this.engine.domNode);\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/operations/bitmap/clear.js": {
"title": "$:/core/modules/editor/operations/bitmap/clear.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/bitmap/resize.js": {
"title": "$:/core/modules/editor/operations/bitmap/resize.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/bitmap/rotate-left.js": {
"title": "$:/core/modules/editor/operations/bitmap/rotate-left.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/text/excise.js": {
"title": "$:/core/modules/editor/operations/text/excise.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle;\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\"New Excision\");\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ? [editTiddlerTitle] : []\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = \"[[\" + operation.replacement+ \"]]\";\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/make-link.js": {
"title": "$:/core/modules/editor/operations/text/make-link.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/prefix-lines.js": {
"title": "$:/core/modules/editor/operations/text/prefix-lines.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,event.paramObject.count);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile(line.charAt(0) === event.paramObject.character) {\n\t\t\tline = line.substring(1);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== event.paramObject.count) {\n\t\t\t// Apply the prefix\n\t\t\tline = prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/replace-all.js": {
"title": "$:/core/modules/editor/operations/text/replace-all.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/replace-selection.js": {
"title": "$:/core/modules/editor/operations/text/replace-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/save-selection.js": {
"title": "$:/core/modules/editor/operations/text/save-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/wrap-lines.js": {
"title": "$:/core/modules/editor/operations/text/wrap-lines.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Add the prefix and suffix\n\toperation.replacement = event.paramObject.prefix + \"\\n\" +\n\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\tevent.paramObject.suffix + \"\\n\";\n\toperation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;\n\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/wrap-selection.js": {
"title": "$:/core/modules/editor/operations/text/wrap-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tif(operation.selStart === operation.selEnd) {\n\t\t// No selection; check if we're within the prefix/suffix\n\t\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\n\t\t\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\n\t\t\toperation.replacement = \"\";\n\t\t\toperation.newSelStart = operation.cutStart;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\toperation.cutStart = operation.selStart;\n\t\t\toperation.cutEnd = operation.selEnd;\n\t\t\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\n\t\t\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t}\n\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t} else {\n\t\t// Add the prefix and suffix\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/filters/addprefix.js": {
"title": "$:/core/modules/filters/addprefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/addsuffix.js": {
"title": "$:/core/modules/filters/addsuffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/after.js": {
"title": "$:/core/modules/filters/after.js",
"text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/all/current.js": {
"title": "$:/core/modules/filters/all/current.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/missing.js": {
"title": "$:/core/modules/filters/all/missing.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/orphans.js": {
"title": "$:/core/modules/filters/all/orphans.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/shadows.js": {
"title": "$:/core/modules/filters/all/shadows.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tags.js": {
"title": "$:/core/modules/filters/all/tags.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tiddlers.js": {
"title": "$:/core/modules/filters/all/tiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all.js": {
"title": "$:/core/modules/filters/all.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/backlinks.js": {
"title": "$:/core/modules/filters/backlinks.js",
"text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/before.js": {
"title": "$:/core/modules/filters/before.js",
"text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/commands.js": {
"title": "$:/core/modules/filters/commands.js",
"text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/contains.js": {
"title": "$:/core/modules/filters/contains.js",
"text": "/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"list\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/count.js": {
"title": "$:/core/modules/filters/count.js",
"text": "/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current list.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/days.js": {
"title": "$:/core/modules/filters/days.js",
"text": "/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/each.js": {
"title": "$:/core/modules/filters/each.js",
"text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field.\nWith suffix \"list\", selects all tiddlers that are values in a specified list field.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results =[] ,\n\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/eachday.js": {
"title": "$:/core/modules/filters/eachday.js",
"text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editiondescription.js": {
"title": "$:/core/modules/filters/editiondescription.js",
"text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editions.js": {
"title": "$:/core/modules/filters/editions.js",
"text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\tresults.push(name);\n\t\t});\n\t}\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/else.js": {
"title": "$:/core/modules/filters/else.js",
"text": "/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/decodeuricomponent.js": {
"title": "$:/core/modules/filters/decodeuricomponent.js",
"text": "/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURIComponent(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURIComponent(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURI(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/enlist.js": {
"title": "$:/core/modules/filters/enlist.js",
"text": "/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/field.js": {
"title": "$:/core/modules/filters/field.js",
"text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],indexedResults,\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/fields.js": {
"title": "$:/core/modules/filters/fields.js",
"text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/get.js": {
"title": "$:/core/modules/filters/get.js",
"text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getindex.js": {
"title": "$:/core/modules/filters/getindex.js",
"text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getvariable.js": {
"title": "$:/core/modules/filters/getvariable.js",
"text": "/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/has.js": {
"title": "$:/core/modules/filters/has.js",
"text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [],\n\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand] === \"\")) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && !(tiddler.fields[operator.operand] === \"\" || tiddler.fields[operator.operand].length === 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\t\t\t\t\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/haschanged.js": {
"title": "$:/core/modules/filters/haschanged.js",
"text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/indexes.js": {
"title": "$:/core/modules/filters/indexes.js",
"text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerDataCached(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/insertbefore.js": {
"title": "$:/core/modules/filters/insertbefore.js",
"text": "/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\");\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tresults.push(operator.operand);\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/is/blank.js": {
"title": "$:/core/modules/filters/is/blank.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/current.js": {
"title": "$:/core/modules/filters/is/current.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/image.js": {
"title": "$:/core/modules/filters/is/image.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/missing.js": {
"title": "$:/core/modules/filters/is/missing.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/orphan.js": {
"title": "$:/core/modules/filters/is/orphan.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/shadow.js": {
"title": "$:/core/modules/filters/is/shadow.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/system.js": {
"title": "$:/core/modules/filters/is/system.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tag.js": {
"title": "$:/core/modules/filters/is/tag.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tiddler.js": {
"title": "$:/core/modules/filters/is/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/variable.js": {
"title": "$:/core/modules/filters/is/variable.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!(title in options.widget.variables)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title in options.widget.variables) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is.js": {
"title": "$:/core/modules/filters/is.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/limit.js": {
"title": "$:/core/modules/filters/limit.js",
"text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/links.js": {
"title": "$:/core/modules/filters/links.js",
"text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/list.js": {
"title": "$:/core/modules/filters/list.js",
"text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listed.js": {
"title": "$:/core/modules/filters/listed.js",
"text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listops.js": {
"title": "$:/core/modules/filters/listops.js",
"text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/lookup.js": {
"title": "$:/core/modules/filters/lookup.js",
"text": "/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<field>[<prefix>]]\n\nPrepends the prefix to the selected items and returns the specified field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.lookup = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.getTiddlerText(operator.operand + title) || options.wiki.getTiddlerText(operator.operand + operator.suffix));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/match.js": {
"title": "$:/core/modules/filters/match.js",
"text": "/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/math.js": {
"title": "$:/core/modules/filters/math.js",
"text": "/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(stringifyNumber(fnCalc(parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeNumericReducingOperator(fnCalc,initialValue) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [stringifyNumber(result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,parseNumber(currentValue));\n\t\t},initialValue))];\n\t};\n}\n\nfunction parseNumber(str) {\n\treturn parseFloat(str) || 0;\n}\n\nfunction stringifyNumber(num) {\n\treturn num + \"\";\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/minlength.js": {
"title": "$:/core/modules/filters/minlength.js",
"text": "/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/modules.js": {
"title": "$:/core/modules/filters/modules.js",
"text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/moduletypes.js": {
"title": "$:/core/modules/filters/moduletypes.js",
"text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/next.js": {
"title": "$:/core/modules/filters/next.js",
"text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/plugintiddlers.js": {
"title": "$:/core/modules/filters/plugintiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/prefix.js": {
"title": "$:/core/modules/filters/prefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/previous.js": {
"title": "$:/core/modules/filters/previous.js",
"text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/range.js": {
"title": "$:/core/modules/filters/range.js",
"text": "/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g),\n\t\tbeg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/regexp.js": {
"title": "$:/core/modules/filters/regexp.js",
"text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removeprefix.js": {
"title": "$:/core/modules/filters/removeprefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removesuffix.js": {
"title": "$:/core/modules/filters/removesuffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sameday.js": {
"title": "$:/core/modules/filters/sameday.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/search.js": {
"title": "$:/core/modules/filters/search.js",
"text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/shadowsource.js": {
"title": "$:/core/modules/filters/shadowsource.js",
"text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sort.js": {
"title": "$:/core/modules/filters/sort.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/splitbefore.js": {
"title": "$:/core/modules/filters/splitbefore.js",
"text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/storyviews.js": {
"title": "$:/core/modules/filters/storyviews.js",
"text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/strings.js": {
"title": "$:/core/modules/filters/strings.js",
"text": "/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.trim(a)];}\n);\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue)];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\t\t\n\t} catch([[ex]]) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,title.split(regExp));\n\t});\t\t\n\treturn result;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/subfilter.js": {
"title": "$:/core/modules/filters/subfilter.js",
"text": "/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/subtiddlerfields.js": {
"title": "$:/core/modules/filters/subtiddlerfields.js",
"text": "/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/suffix.js": {
"title": "$:/core/modules/filters/suffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tag.js": {
"title": "$:/core/modules/filters/tag.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tagging.js": {
"title": "$:/core/modules/filters/tagging.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tags.js": {
"title": "$:/core/modules/filters/tags.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/then.js": {
"title": "$:/core/modules/filters/then.js",
"text": "/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/title.js": {
"title": "$:/core/modules/filters/title.js",
"text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/untagged.js": {
"title": "$:/core/modules/filters/untagged.js",
"text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/variables.js": {
"title": "$:/core/modules/filters/variables.js",
"text": "/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variables = function(source,operator,options) {\n\tvar names = [];\n\tfor(var variable in options.widget.variables) {\n\t\tnames.push(variable);\n\t}\n\treturn names.sort();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/wikiparserrules.js": {
"title": "$:/core/modules/filters/wikiparserrules.js",
"text": "/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.wikiparserrules = function(source,operator,options) {\n\tvar results = [],\n\t\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/x-listops.js": {
"title": "$:/core/modules/filters/x-listops.js",
"text": "/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n /*jslint node: true, browser: true */\n /*global $tw: false */\n \"use strict\";\n\n /*\n Fetch titles from the current list\n */\n var prepare_results = function (source) {\n var results = [];\n source(function (tiddler, title) {\n results.push(title);\n });\n return results;\n };\n\n /*\n Moves a number of items from the tail of the current list before the item named in the operand\n */\n exports.putbefore = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -1) :\n results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n };\n\n /*\n Moves a number of items from the tail of the current list after the item named in the operand\n */\n exports.putafter = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -1) :\n results.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n };\n\n /*\n Replaces the item named in the operand with a number of items from the tail of the current list\n */\n exports.replace = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1);\n return (index === -1) ?\n results.slice(0, -count) :\n results.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n };\n\n /*\n Moves a number of items from the tail of the current list to the head of the list\n */\n exports.putfirst = function (source, operator) {\n var results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,1);\n return results.slice(-count).concat(results.slice(0, -count));\n };\n\n /*\n Moves a number of items from the head of the current list to the tail of the list\n */\n exports.putlast = function (source, operator) {\n var results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,1);\n return results.slice(count).concat(results.slice(0, count));\n };\n\n /*\n Moves the item named in the operand a number of places forward or backward in the list\n */\n exports.move = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand),\n count = $tw.utils.getInt(operator.suffix,1),\n marker = results.splice(index, 1),\n offset = (index + count) > 0 ? index + count : 0;\n return results.slice(0, offset).concat(marker).concat(results.slice(offset));\n };\n\n /*\n Returns the items from the current list that are after the item named in the operand\n */\n exports.allafter = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand);\n return (index === -1) ? [] :\n (operator.suffix) ? results.slice(index) :\n results.slice(index + 1);\n };\n\n /*\n Returns the items from the current list that are before the item named in the operand\n */\n exports.allbefore = function (source, operator) {\n var results = prepare_results(source),\n index = results.indexOf(operator.operand);\n return (index === -1) ? [] :\n (operator.suffix) ? results.slice(0, index + 1) :\n results.slice(0, index);\n };\n\n /*\n Appends the items listed in the operand array to the tail of the current list\n */\n exports.append = function (source, operator) {\n var append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = parseInt(operator.suffix) || append.length;\n return (append.length === 0) ? results :\n (operator.prefix) ? results.concat(append.slice(-count)) :\n results.concat(append.slice(0, count));\n };\n\n /*\n Prepends the items listed in the operand array to the head of the current list\n */\n exports.prepend = function (source, operator) {\n var prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = $tw.utils.getInt(operator.suffix,prepend.length);\n return (prepend.length === 0) ? results :\n (operator.prefix) ? prepend.slice(-count).concat(results) :\n prepend.slice(0, count).concat(results);\n };\n\n /*\n Returns all items from the current list except the items listed in the operand array\n */\n exports.remove = function (source, operator) {\n var array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n results = prepare_results(source),\n count = parseInt(operator.suffix) || array.length,\n p,\n len,\n index;\n len = array.length - 1;\n for (p = 0; p < count; ++p) {\n if (operator.prefix) {\n index = results.indexOf(array[len - p]);\n } else {\n index = results.indexOf(array[p]);\n }\n if (index !== -1) {\n results.splice(index, 1);\n }\n }\n return results;\n };\n\n /*\n Returns all items from the current list sorted in the order of the items in the operand array\n */\n exports.sortby = function (source, operator) {\n var results = prepare_results(source);\n if (!results || results.length < 2) {\n return results;\n }\n var lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n results.sort(function (a, b) {\n return lookup.indexOf(a) - lookup.indexOf(b);\n });\n return results;\n };\n\n /*\n Removes all duplicate items from the current list\n */\n exports.unique = function (source, operator) {\n var results = prepare_results(source);\n var set = results.reduce(function (a, b) {\n if (a.indexOf(b) < 0) {\n a.push(b);\n }\n return a;\n }, []);\n return set;\n };\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters.js": {
"title": "$:/core/modules/filters.js",
"text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\n\t\tp = nextBracketPos + 1;\n\t\tswitch (bracket) {\n\t\t\tcase \"{\": // Curly brackets\n\t\t\t\toperator.indirect = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"[\": // Square brackets\n\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"<\": // Angle brackets\n\t\t\t\toperator.variable = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"/\": // regexp brackets\n\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\tif(rexMatch) {\n\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n// DEPRECATION WARNING\nconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t}\n\t\tif(!operator.regexp) {\n\t\t\toperator.operand = filterString.substring(p,nextBracketPos);\n\t\t}\n\t\tp = nextBracketPos + 1;\n\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=)?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $tw.language.getString(\"Error/FilterSyntax\");\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tif(match[2]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operand: match[3] || match[4] || match[5]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [$tw.language.getString(\"Error/Filter\") + \": \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operand = operator.operand,\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\tif(operator.indirect) {\n\t\t\t\t\toperand = self.getTextReference(operator.operand,\"\",currTiddlerTitle);\n\t\t\t\t}\n\t\t\t\tif(operator.variable) {\n\t\t\t\t\toperand = widget.getVariable(operator.operand,{defaultValue: \"\"});\n\t\t\t\t}\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operand,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tsuffixes: operator.suffixes,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\tArray.prototype.push.apply(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\t\t\t\t\tsource = self.makeTiddlerIterator(results);\n\t\t\t\t\t\tresults.splice(0,results.length);\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\tif(results.length === 0) {\n\t\t\t\t\t\t\t// Main result so far is empty\n\t\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter: \" + filterString,function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = [];\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results;\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/indexers/field-indexer.js": {
"title": "$:/core/modules/indexers/field-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar titles = self.wiki.allTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar titles = self.wiki.allShadowTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/indexers/tag-indexer.js": {
"title": "$:/core/modules/indexers/tag-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\t\t\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\t\t\t\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/info/platform.js": {
"title": "$:/core/modules/info/platform.js",
"text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function() {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\t\t\t\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "info"
},
"$:/core/modules/keyboard.js": {
"title": "$:/core/modules/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(/\\+|\\-/),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t}\n};\n\nKeyboardManager.prototype.handleKeydownEvent = function(event) {\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/language.js": {
"title": "$:/core/modules/language.js",
"text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a wikified translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\n};\n\nexports.Language = Language;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/macros/changecount.js": {
"title": "$:/core/modules/macros/changecount.js",
"text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/contrastcolour.js": {
"title": "$:/core/modules/macros/contrastcolour.js",
"text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/csvtiddlers.js": {
"title": "$:/core/modules/macros/csvtiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/displayshortcuts.js": {
"title": "$:/core/modules/macros/displayshortcuts.js",
"text": "/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddler.js": {
"title": "$:/core/modules/macros/jsontiddler.js",
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddlers.js": {
"title": "$:/core/modules/macros/jsontiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter) {\n\treturn this.wiki.getTiddlersAsJson(filter);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/makedatauri.js": {
"title": "$:/core/modules/macros/makedatauri.js",
"text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type) {\n\treturn $tw.utils.makeDataUri(text,type);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/now.js": {
"title": "$:/core/modules/macros/now.js",
"text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/qualify.js": {
"title": "$:/core/modules/macros/qualify.js",
"text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/resolvepath.js": {
"title": "$:/core/modules/macros/resolvepath.js",
"text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/unusedtitle.js": {
"title": "$:/core/modules/macros/unusedtitle.js",
"text": "/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"options\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName, options) {\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\treturn this.wiki.generateNewTitle(baseName, options);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/version.js": {
"title": "$:/core/modules/macros/version.js",
"text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/parsers/audioparser.js": {
"title": "$:/core/modules/parsers/audioparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/binaryparser.js": {
"title": "$:/core/modules/parsers/binaryparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\n\nvar BinaryParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"transclude\",\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t}\n\t}];\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/csvparser.js": {
"title": "$:/core/modules/parsers/csvparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/htmlparser.js": {
"title": "$:/core/modules/parsers/htmlparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/imageparser.js": {
"title": "$:/core/modules/parsers/imageparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t};\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/utils/parseutils.js": {
"title": "$:/core/modules/utils/parseutils.js",
"text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treFilteredValue = /\\{\\{\\{(.+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/parsers/pdfparser.js": {
"title": "$:/core/modules/parsers/pdfparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"embed\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/textparser.js": {
"title": "$:/core/modules/parsers/textparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/videoparser.js": {
"title": "$:/core/modules/parsers/videoparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar VideoParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"video\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/dash.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"–\" : \"—\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/entity.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: ©\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/extlink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: https://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/heading.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/html.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/html.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.slice(1).indexOf(\"$\") !== -1) {\n\t\treturn null;\n\t}\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/image.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/image.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/import.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/import.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(\\r?\\n)|$/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1]}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/list.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/list.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"p\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"set\",\n\t\tattributes: {\n\t\t\tname: {type: \"string\", value: this.match[1]},\n\t\t\tvalue: {type: \"string\", value: text}\n\t\t},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/rules.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/syslink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/syslink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/table.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/table.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/whitespace.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/whitespace.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/wikiparser.js": {
"title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex));\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index));\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex));\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text});\t\t\n\t}\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar keepFilter;\n\tif(type === \"only\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) !== -1;\n\t\t};\n\t} else if(type === \"except\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) === -1;\n\t\t};\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif(!keepFilter(ruleArray[t].rule.name)) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/pluginswitcher.js": {
"title": "$:/core/modules/pluginswitcher.js",
"text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\tthis.onSwitch = options.onSwitch;\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/saver-handler.js": {
"title": "$:/core/modules/saver-handler.js",
"text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.preloadDirty = options.preloadDirty || [];\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\") {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert($tw.language.getString(\"Error/WhileSaving\") + \":\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/savers/andtidwiki.js": {
"title": "$:/core/modules/savers/andtidwiki.js",
"text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t// Strip the file://\n\tif(pathname.indexOf(\"file://\") === 0) {\n\t\tpathname = pathname.substr(7);\n\t}\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Save the file\n\twindow.twi.saveFile(pathname,text);\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/beaker.js": {
"title": "$:/core/modules/savers/beaker.js",
"text": "/*\\\ntitle: $:/core/modules/savers/beaker.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Beaker browser's (https://beakerbrowser.com) Dat protocol (https://datproject.org/)\nCompatible with beaker >= V0.7.2\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar BeakerSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nBeakerSaver.prototype.save = function(text,method,callback) {\n\tvar dat = new DatArchive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Beaker Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Beaker Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nBeakerSaver.prototype.info = {\n\tname: \"beaker\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.DatArchive && location.protocol===\"dat:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new BeakerSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/download.js": {
"title": "$:/core/modules/savers/download.js",
"text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = decodeURIComponent(document.location.pathname.substr(p+1));\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100\n};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\n});\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/fsosaver.js": {
"title": "$:/core/modules/savers/fsosaver.js",
"text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/github.js": {
"title": "$:/core/modules/savers/github.js",
"text": "/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password)\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitHubSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/gitlab.js": {
"title": "$:/core/modules/savers/gitlab.js",
"text": "/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !path || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitLabSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/manualdownload.js": {
"title": "$:/core/modules/savers/manualdownload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/msdownload.js": {
"title": "$:/core/modules/savers/msdownload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/put.js": {
"title": "$:/core/modules/savers/put.js",
"text": "/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*;charset=UTF-8\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\t// response is textual: \"XMLHttpRequest error code: 412\"\n\t\t\t\tvar status = Number(err.substring(err.indexOf(':') + 2, err.length))\n\t\t\t\tif(status === 412) { // edit conflict\n\t\t\t\t\tvar message = $tw.language.getString(\"Error/EditConflict\");\n\t\t\t\t\tcallback(message);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(err); // fail\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\n\tpriority: 2000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyfox.js": {
"title": "$:/core/modules/savers/tiddlyfox.js",
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyie.js": {
"title": "$:/core/modules/savers/tiddlyie.js",
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/twedit.js": {
"title": "$:/core/modules/savers/twedit.js",
"text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/upload.js": {
"title": "$:/core/modules/savers/upload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch([[ex]]) {\n\t\treturn callback($tw.language.getString(\"Error/Caption\") + \":\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/server/authenticators/basic.js": {
"title": "$:/core/modules/server/authenticators/basic.js",
"text": "/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve($tw.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n",
"type": "application/javascript",
"module-type": "authenticator"
},
"$:/core/modules/server/authenticators/header.js": {
"title": "$:/core/modules/server/authenticators/header.js",
"text": "/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\");\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tstate.authenticatedUsername = username;\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n",
"type": "application/javascript",
"module-type": "authenticator"
},
"$:/core/modules/server/routes/delete-tiddler.js": {
"title": "$:/core/modules/server/routes/delete-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-favicon.js": {
"title": "$:/core/modules/server/routes/get-favicon.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tresponse.end(buffer,\"base64\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-file.js": {
"title": "$:/core/modules/server/routes/get-file.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\");\n\tvar filename = path.resolve($tw.boot.wikiPath,\"files\",decodeURIComponent(state.params[0])),\n\t\textension = path.extname(filename);\n\tfs.readFile(filename,function(err,content) {\n\t\tvar status,content,type = \"text/plain\";\n\t\tif(err) {\n\t\t\tif(err.code === \"ENOENT\") {\n\t\t\t\tstatus = 404;\n\t\t\t\tcontent = \"File '\" + filename + \"' not found\";\n\t\t\t} else if(err.code === \"EACCES\") {\n\t\t\t\tstatus = 403;\n\t\t\t\tcontent = \"You do not have permission to access the file '\" + filename + \"'\";\n\t\t\t} else {\n\t\t\t\tstatus = 500;\n\t\t\t\tcontent = err.toString();\n\t\t\t}\n\t\t} else {\n\t\t\tstatus = 200;\n\t\t\tcontent = content;\n\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t}\n\t\tresponse.writeHead(status,{\n\t\t\t\"Content-Type\": type\n\t\t});\n\t\tresponse.end(content);\n\t});\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-index.js": {
"title": "$:/core/modules/server/routes/get-index.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar zlib = require(\"zlib\");\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar acceptEncoding = request.headers[\"accept-encoding\"];\n\tif(!acceptEncoding) {\n\t\tacceptEncoding = \"\";\n\t}\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\t/*\n\tIf the gzip=yes flag for `listen` is set, check if the user agent permits\n\tcompression. If so, compress our response. Note that we use the synchronous\n\tfunctions from zlib to stay in the imperative style. The current `Server`\n\tdoesn't depend on this, and we may just as well use the async versions.\n\t*/\n\tif(state.server.enableGzip) {\n\t\tif (/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\ttext = zlib.deflateSync(text);\n\t\t} else if (/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\ttext = zlib.gzipSync(text);\n\t\t}\n\t}\n\tresponse.writeHead(200,responseHeaders);\n\tresponse.end(text);\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-login-basic.js": {
"title": "$:/core/modules/server/routes/get-login-basic.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\t\t\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: \"/\"\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-status.js": {
"title": "$:/core/modules/server/routes/get-status.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddler-html.js": {
"title": "$:/core/modules/server/routes/get-tiddler-html.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tresponse.writeHead(200);\n\t\tresponse.end(text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddler.js": {
"title": "$:/core/modules/server/routes/get-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddlers-json.js": {
"title": "$:/core/modules/server/routes/get-tiddlers-json.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/tiddlers.json\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar tiddlers = [];\n\tstate.wiki.forEachTiddler({sortField: \"title\"},function(title,tiddler) {\n\t\tvar tiddlerFields = {};\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tif(name !== \"text\") {\n\t\t\t\ttiddlerFields[name] = tiddler.getFieldString(name);\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\ttiddlers.push(tiddlerFields);\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/put-tiddler.js": {
"title": "$:/core/modules/server/routes/put-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\tfields = JSON.parse(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/server.js": {
"title": "$:/core/modules/server/server.js",
"text": "/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\t\t\n\t}\n\t$tw.utils.extend({},this.defaultVariables,options.variables);\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName = (this.get(\"username\") && this.get(\"password\")) ? this.get(\"username\") : \"(anon)\";\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve($tw.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve($tw.boot.wikiPath,tlsCertFilepath),\"utf8\")\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\n\tvar pathprefix = this.get(\"path-prefix\") || \"\";\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(pathprefix) {\n\t\t\tif(pathname.substr(0,pathprefix.length) === pathprefix) {\n\t\t\t\tpathname = pathname.substr(pathprefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response) {\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = self.wiki;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\t// Get the principals authorized to access this resource\n\tvar authorizationType = this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\t\t\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t$tw.utils.log(\"Serving on \" + this.protocol + \"://\" + host + \":\" + port + prefix,\"brown/orange\");\n\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t// Warn if required plugins are missing\n\tif(!$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !$tw.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\t// Listen\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/browser-messaging.js": {
"title": "$:/core/modules/browser-messaging.js",
"text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tiframe.setAttribute(\"library\",\"true\");\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch([[ex]]) {\n\t\t\tcallback([[ex]]);\n\t\t}\n\t}\n}\n\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\t$tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t}\n\t});\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/commands.js": {
"title": "$:/core/modules/startup/commands.js",
"text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/CSSescape.js": {
"title": "$:/core/modules/startup/CSSescape.js",
"text": "/*\\\ntitle: $:/core/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape()\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = factory(root);\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there's no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\n}));\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/favicon.js": {
"title": "$:/core/modules/startup/favicon.js",
"text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",\"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text);\n\t}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/info.js": {
"title": "$:/core/modules/startup/info.js",
"text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Collect up the info tiddlers\n\tvar infoTiddlerFields = {};\n\t// Give each info module a chance to fill in as many info tiddlers as they want\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tvar tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields);\n\t\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\t\tif(fields) {\n\t\t\t\t\tinfoTiddlerFields[fields.title] = fields;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Bake the info tiddlers into a plugin\n\tvar fields = {\n\t\ttitle: \"$:/temp/info-plugin\",\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"info\",\n\t\ttext: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces)\n\t};\n\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\t$tw.wiki.readPluginInfo();\n\t$tw.wiki.registerPluginTiddlers(\"info\");\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/load-modules.js": {
"title": "$:/core/modules/startup/load-modules.js",
"text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.wiki.addIndexersToWiki();\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/password.js": {
"title": "$:/core/modules/startup/password.js",
"text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/render.js": {
"title": "$:/core/modules/startup/render.js",
"text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/PageTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar DRAFT_TIDDLER_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n \t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\n\t});\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only drafts have changed\n\t\tvar onlyDraftsHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !tiddler.hasField(\"draft.of\")) {\n\t\t\t\tonlyDraftsHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyDraftsHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = DRAFT_TIDDLER_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/rootwidget.js": {
"title": "$:/core/modules/startup/rootwidget.js",
"text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject, event: event});\n\t});\n\t// Install the notification mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param);\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement;\n\t\ttry {\n\t\t\telement = document.querySelector(selector);\n\t\t} catch(e) {\n\t\t\tconsole.log(\"Error in selector: \",selector)\n\t\t}\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup.js": {
"title": "$:/core/modules/startup.js",
"text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\tvar executeStartupTiddlers = function(tag) {\n\t\t$tw.utils.each($tw.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\t\t$tw.rootWidget.invokeActionString($tw.wiki.getTiddlerText(title),$tw.rootWidget);\n\t\t});\n\t};\n\texecuteStartupTiddlers(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\texecuteStartupTiddlers(\"$:/tags/StartupAction/Browser\");\t\t\n\t}\n\tif($tw.node) {\n\t\texecuteStartupTiddlers(\"$:/tags/StartupAction/Node\");\t\t\n\t}\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t}\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t} \n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/story.js": {
"title": "$:/core/modules/startup/story.js",
"text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// Update history\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\t$tw.wiki.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t}\t\t\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/windows.js": {
"title": "$:/core/modules/startup/windows.js",
"text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\nvar windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\twindowTitle = paramObject.windowTitle || title,\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t srcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\twindows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t},{\n\t\t\tname: \"click\",\n\t\t\thandlerObject: $tw.popup,\n\t\t\thandlerMethod: \"handleEvent\"\n\t\t}]);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each(windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/story.js": {
"title": "$:/core/modules/story.js",
"text": "/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/storyviews/classic.js": {
"title": "$:/core/modules/storyviews/classic.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration()\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\tif(duration) {\n\t\t// Scroll the node into view\n\t\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\t\n\t} else {\n\t\ttargetElement.scrollIntoView();\n\t}\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/pop.js": {
"title": "$:/core/modules/storyviews/pop.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement && targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/zoomin.js": {
"title": "$:/core/modules/storyviews/zoomin.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/syncer.js": {
"title": "$:/core/modules/syncer.js",
"text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store. If a syncadaptor is used then individual tiddlers are synchronised through it. If there is no syncadaptor then the entire wiki is saved via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || this.throttleInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\t\tcolour: \"cyan\",\n\t\t\tenable: this.logging\n\t\t});\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\t// Tasks are {type: \"load\"/\"save\"/\"delete\", title:, queueTime:, lastModificationTime:}\n\tthis.taskQueue = {}; // Hashmap of tasks yet to be performed\n\tthis.taskInProgress = {}; // Hash of tasks in progress\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.syncToServer(changes);\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function() {\n\t\t\tself.handleLoginEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI) {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\t\t\n\t}\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.filterFn.call(this.wiki);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tself.tiddlerInfo[title] = {\n\t\t\trevision: tiddler.fields.revision,\n\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\tchangeCount: self.wiki.getChangeCount(title),\n\t\t\thasBeenLazyLoaded: false\n\t\t};\n\t});\n};\n\n/*\nCreate an tiddlerInfo structure if it doesn't already exist\n*/\nSyncer.prototype.createTiddlerInfo = function(title) {\n\tif(!$tw.utils.hop(this.tiddlerInfo,title)) {\n\t\tthis.tiddlerInfo[title] = {\n\t\t\trevision: null,\n\t\t\tadaptorInfo: {},\n\t\t\tchangeCount: -1,\n\t\t\thasBeenLazyLoaded: false\n\t\t};\n\t}\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\treturn (this.numTasksInQueue() > 0) || (this.numTasksInProgress() > 0);\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser && !this.disableUI) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields,hasBeenLazyLoaded) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: tiddlerFields.revision,\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title),\n\t\thasBeenLazyLoaded: hasBeenLazyLoaded !== undefined ? hasBeenLazyLoaded : true\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Set the various status tiddlers\n\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\tif(isLoggedIn) {\n\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tif(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tvar self = this;\n\t\tif(this.pollTimerId) {\n\t\t\tclearTimeout(this.pollTimerId);\n\t\t\tthis.pollTimerId = null;\n\t\t}\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\t// Trigger the next sync\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert($tw.language.getString(\"Error/RetrievingSkinny\") + \":\",err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null;\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Do a full load if we've already got a fat version of the tiddler\n\t\t\t\t\tif(tiddler && tiddler.fields.text !== undefined) {\n\t\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\t\tself.enqueueSyncTask({\n\t\t\t\t\t\t\ttype: \"load\",\n\t\t\t\t\t\t\ttitle: tiddlerFields.title\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Load the skinny version of the tiddler\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields,false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nSynchronise a set of changes to the server\n*/\nSyncer.prototype.syncToServer = function(changes) {\n\tvar self = this,\n\t\tnow = Date.now(),\n\t\tfilteredChanges = this.filterFn.call(this.wiki,function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t$tw.utils.each(changes,function(change,title,object) {\n\t\t// Process the change if it is a deletion of a tiddler we're already syncing, or is on the filtered change list\n\t\tif((change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) || filteredChanges.indexOf(title) !== -1) {\n\t\t\t// Queue a task to sync this tiddler\n\t\t\tself.enqueueSyncTask({\n\t\t\t\ttype: change.deleted ? \"delete\" : \"save\",\n\t\t\t\ttitle: title\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Don't lazy load the same tiddler twice\n\tvar info = this.tiddlerInfo[title];\n\tif(!info || !info.hasBeenLazyLoaded) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.filterFn.call(this.wiki).indexOf(title) !== -1) {\n\t\t\tthis.createTiddlerInfo(title);\n\t\t\tthis.tiddlerInfo[title].hasBeenLazyLoaded = true;\n\t\t\t// Queue up a sync task to load this tiddler\n\t\t\tthis.enqueueSyncTask({\n\t\t\t\ttype: \"load\",\n\t\t\t\ttitle: title\n\t\t\t});\n\t\t}\n\t}\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!isLoggedIn) {\n\t\t\t$tw.passwordPrompt.createPrompt({\n\t\t\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\t\t\tcallback: function(data) {\n\t\t\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\t\t\tself.syncFromServer();\n\t\t\t\t\t});\n\t\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(null,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nQueue up a sync task. If there is already a pending task for the tiddler, just update the last modification time\n*/\nSyncer.prototype.enqueueSyncTask = function(task) {\n\tvar self = this,\n\t\tnow = Date.now();\n\t// Set the timestamps on this task\n\ttask.queueTime = now;\n\ttask.lastModificationTime = now;\n\t// Fill in some tiddlerInfo if the tiddler is one we haven't seen before\n\tthis.createTiddlerInfo(task.title);\n\t// Bail if this is a save and the tiddler is already at the changeCount that the server has\n\tif(task.type === \"save\" && this.wiki.getChangeCount(task.title) <= this.tiddlerInfo[task.title].changeCount) {\n\t\treturn;\n\t}\n\t// Check if this tiddler is already in the queue\n\tif($tw.utils.hop(this.taskQueue,task.title)) {\n\t\t// this.logger.log(\"Re-queueing up sync task with type:\",task.type,\"title:\",task.title);\n\t\tvar existingTask = this.taskQueue[task.title];\n\t\t// If so, just update the last modification time\n\t\texistingTask.lastModificationTime = task.lastModificationTime;\n\t\t// If the new task is a save then we upgrade the existing task to a save. Thus a pending load is turned into a save if the tiddler changes locally in the meantime. But a pending save is not modified to become a load\n\t\tif(task.type === \"save\" || task.type === \"delete\") {\n\t\t\texistingTask.type = task.type;\n\t\t}\n\t} else {\n\t\t// this.logger.log(\"Queuing up sync task with type:\",task.type,\"title:\",task.title);\n\t\t// If it is not in the queue, insert it\n\t\tthis.taskQueue[task.title] = task;\n\t\tthis.updateDirtyStatus();\n\t}\n\t// Process the queue\n\t$tw.utils.nextTick(function() {self.processTaskQueue.call(self);});\n};\n\n/*\nReturn the number of tasks in progress\n*/\nSyncer.prototype.numTasksInProgress = function() {\n\treturn $tw.utils.count(this.taskInProgress);\n};\n\n/*\nReturn the number of tasks in the queue\n*/\nSyncer.prototype.numTasksInQueue = function() {\n\treturn $tw.utils.count(this.taskQueue);\n};\n\n/*\nTrigger a timeout if one isn't already outstanding\n*/\nSyncer.prototype.triggerTimeout = function() {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},self.taskTimerInterval);\n\t}\n};\n\n/*\nProcess the task queue, performing the next task if appropriate\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress() === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(task) {\n\t\t\t// Remove the task from the queue and add it to the in progress list\n\t\t\tdelete this.taskQueue[task.title];\n\t\t\tthis.taskInProgress[task.title] = task;\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// Dispatch the task\n\t\t\tthis.dispatchTask(task,function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\tself.logger.alert(\"Sync error while processing '\" + task.title + \"':\\n\" + err);\n\t\t\t\t}\n\t\t\t\t// Mark that this task is no longer in progress\n\t\t\t\tdelete self.taskInProgress[task.title];\n\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t// Process the next task\n\t\t\t\tself.processTaskQueue.call(self);\n\t\t\t});\n\t\t} else {\n\t\t\t// Make sure we've set a time if there wasn't a task to perform, but we've still got tasks in the queue\n\t\t\tif(this.numTasksInQueue() > 0) {\n\t\t\t\tthis.triggerTimeout();\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nChoose the next applicable task\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar self = this,\n\t\tcandidateTask = null,\n\t\tnow = Date.now();\n\t// Select the best candidate task\n\t$tw.utils.each(this.taskQueue,function(task,title) {\n\t\t// Exclude the task if there's one of the same name in progress\n\t\tif($tw.utils.hop(self.taskInProgress,title)) {\n\t\t\treturn;\n\t\t}\n\t\t// Exclude the task if it is a save and the tiddler has been modified recently, but not hit the fallback time\n\t\tif(task.type === \"save\" && (now - task.lastModificationTime) < self.throttleInterval &&\n\t\t\t(now - task.queueTime) < self.fallbackInterval) {\n\t\t\treturn;\n\t\t}\n\t\t// Exclude the task if it is newer than the current best candidate\n\t\tif(candidateTask && candidateTask.queueTime < task.queueTime) {\n\t\t\treturn;\n\t\t}\n\t\t// Now this is our best candidate\n\t\tcandidateTask = task;\n\t});\n\treturn candidateTask;\n};\n\n/*\nDispatch a task and invoke the callback\n*/\nSyncer.prototype.dispatchTask = function(task,callback) {\n\tvar self = this;\n\tif(task.type === \"save\") {\n\t\tvar changeCount = this.wiki.getChangeCount(task.title),\n\t\t\ttiddler = this.wiki.getTiddler(task.title);\n\t\tthis.logger.log(\"Dispatching 'save' task:\",task.title);\n\t\tif(tiddler) {\n\t\t\tthis.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\t// Adjust the info stored about this tiddler\n\t\t\t\tself.tiddlerInfo[task.title] = {\n\t\t\t\t\tchangeCount: changeCount,\n\t\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\t\trevision: revision\n\t\t\t\t};\n\t\t\t\t// Invoke the callback\n\t\t\t\tcallback(null);\n\t\t\t},{\n\t\t\t\ttiddlerInfo: self.tiddlerInfo[task.title]\n\t\t\t});\n\t\t} else {\n\t\t\tthis.logger.log(\" Not Dispatching 'save' task:\",task.title,\"tiddler does not exist\");\n\t\t\treturn callback(null);\n\t\t}\n\t} else if(task.type === \"load\") {\n\t\t// Load the tiddler\n\t\tthis.logger.log(\"Dispatching 'load' task:\",task.title);\n\t\tthis.syncadaptor.loadTiddler(task.title,function(err,tiddlerFields) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Store the tiddler\n\t\t\tif(tiddlerFields) {\n\t\t\t\tself.storeTiddler(tiddlerFields,true);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t});\n\t} else if(task.type === \"delete\") {\n\t\t// Delete the tiddler\n\t\tthis.logger.log(\"Dispatching 'delete' task:\",task.title);\n\t\tthis.syncadaptor.deleteTiddler(task.title,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tdelete self.tiddlerInfo[task.title];\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.tiddlerInfo[task.title]\n\t\t});\n\t}\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/tiddler.js": {
"title": "$:/core/modules/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet the value of a field as a list\n*/\nexports.getFieldList = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn [];\n\t}\n\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = {};\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [],\n\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlermethod"
},
"$:/core/modules/upgraders/plugins.js": {
"title": "$:/core/modules/upgraders/plugins.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"] && incomingTiddler.version) {\n\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/system.js": {
"title": "$:/core/modules/upgraders/system.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/Import\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/themetweaks.js": {
"title": "$:/core/modules/upgraders/themetweaks.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/utils/base64-utf8/base64-utf8.module.js": {
"text": "(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)(e=r.charCodeAt(t))<128?o+=String.fromCharCode(e):e>127&&e<2048?(o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128)):(o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128));return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)(t=r.charCodeAt(o))<128?(e+=String.fromCharCode(t),o++):t>191&&t<224?(e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2):(e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3);return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var n=0;n<t.length;n++)o[t[n]]=o.require(t[n]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,n,i,d,f,a,h,c=\"\",u=0;u<r.length;)d=(t=r.charCodeAt(u++))>>2,f=(3&t)<<4|(n=r.charCodeAt(u++))>>4,a=(15&n)<<2|(i=r.charCodeAt(u++))>>6,h=63&i,isNaN(n)?a=h=64:isNaN(i)&&(h=64),c+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return c},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,n,i,d,f,a,h=\"\",c=0;c<r.length;)t=o.indexOf(r.charAt(c++))<<2|(d=o.indexOf(r.charAt(c++)))>>4,n=(15&d)<<4|(f=o.indexOf(r.charAt(c++)))>>2,i=(3&f)<<6|(a=o.indexOf(r.charAt(c++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(n)),64!=a&&(h+=String.fromCharCode(i));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);",
"type": "application/javascript",
"title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js",
"module-type": "library"
},
"$:/core/modules/utils/crypto.js": {
"title": "$:/core/modules/utils/crypto.js",
"text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/csv.js": {
"title": "$:/core/modules/utils/csv.js",
"text": "/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\toptions = options || {};\n\tvar separator = options.separator || \",\",\n\t\trows = text.split(/\\r?\\n/mg).map(function(row) {\n\t\t\treturn $tw.utils.trim(row);\n\t\t}).filter(function(row) {\n\t\t\treturn row !== \"\";\n\t\t});\n\tif(rows.length < 1) {\n\t\treturn \"Missing header row\";\n\t}\n\tvar headings = rows[0].split(separator),\n\t\tresults = [];\n\tfor(var row=1; row<rows.length; row++) {\n\t\tvar columns = rows[row].split(separator),\n\t\t\tcolumnResult = Object.create(null);\n\t\tif(columns.length !== headings.length) {\n\t\t\treturn \"Malformed CSV row '\" + rows[row] + \"'\";\n\t\t}\n\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\tvar columnName = headings[column];\n\t\t\tcolumnResult[columnName] = $tw.utils.trim(columns[column] || \"\");\n\t\t}\n\t\tresults.push(columnResult);\t\t\t\n\t}\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/diff-match-patch/diff_match_patch.js": {
"text": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&\").replace(d,\"<\").replace(e,\">\").replace(f,\"¶<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);",
"type": "application/javascript",
"title": "$:/core/modules/utils/diff-match-patch/diff_match_patch.js",
"module-type": "library"
},
"$:/core/modules/utils/dom/animations/slide.js": {
"title": "$:/core/modules/utils/dom/animations/slide.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "animation"
},
"$:/core/modules/utils/dom/animator.js": {
"title": "$:/core/modules/utils/dom/animator.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/browser.js": {
"title": "$:/core/modules/utils/dom/browser.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif($tw.browser && document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/csscolorparser.js": {
"title": "$:/core/modules/utils/dom/csscolorparser.js",
"text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom.js": {
"title": "$:/core/modules/utils/dom.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.className && el.className.toString().split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = el.className.split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t}\n\tel.className = c.join(\" \");\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = el.className.split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\n\twhile(el.parentNode) {\t\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn doc.body;\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch (err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\t$tw.notifier.display(succeeded ? \"$:/language/Notifications/CopiedToClipboard/Succeeded\" : \"$:/language/Notifications/CopiedToClipboard/Failed\");\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/dragndrop.js": {
"title": "$:/core/modules/utils/dom/dragndrop.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\ndragImageType: \"pill\" or \"dom\"\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the contect for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif((domNode.tagName || \"\").toLowerCase() !== \"a\") {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\t\t\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \tstartActions = options.startActions;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && event.target === domNode) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(event.target,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif(event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \t\tendActions = options.endActions;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(event.target,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = JSON.parse(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/http.js": {
"title": "$:/core/modules/utils/dom/http.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\treturnProp: string name of the property to return as first argument of callback\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\treturnProp = options.returnProp || \"responseText\",\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tdata = results.join(\"&\");\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,null,this);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,options.url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !$tw.utils.hop(headers,\"Content-type\")) {\n\t\trequest.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!$tw.utils.hop(headers,\"X-Requested-With\")) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/keyboard.js": {
"title": "$:/core/modules/utils/dom/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/modal.js": {
"title": "$:/core/modules/utils/dom/modal.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler && tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/notifier.js": {
"title": "$:/core/modules/utils/dom/notifier.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/popup.js": {
"title": "$:/core/modules/utils/dom/popup.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = this.findPopup(options.title);\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\n\t// Store the popup details if not already there\n\tif(!options.floating && this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode,\n\t\t\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\t\trect.width + \",\" + rect.height + \")\";\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nDetect if a Popup contains an input field that has focus\nReturns true or false\n*/\nPopup.prototype.detectInputWithinPopup = function(node) {\n\tvar withinPopup = false,\n\t currNode = node;\n\tfor(var i=0; i<this.popups.length; i++) {\n\t\tvar popup = (this.popups[i] && this.popups[i].domNode) ? this.popups[i].domNode : null;\n\t\twhile(node && popup) {\n\t\t\tif(node === popup || (node.classList && (node.classList.contains(\"tc-popup-keep\") || (node !== currNode && node.classList.contains(\"tc-popup-handle\"))))) {\n\t\t\t\twithinPopup = true;\n\t\t\t}\n\t\t\tnode = node.parentNode;\n\t\t}\n\t}\n\treturn withinPopup;\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level,focusedInputNode) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar inputWithinPopup;\n\t\tif(focusedInputNode) {\n\t\t\tinputWithinPopup = this.detectInputWithinPopup(focusedInputNode);\n\t\t}\n\t\tif(!inputWithinPopup) {\n\t\t\tvar popup = this.popups.pop();\n\t\t \tif(popup.title) {\n\t\t\t\tif(popup.noStateReference) {\n\t\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t\t} else {\n\t\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n \t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/scroller.js": {
"title": "$:/core/modules/utils/dom/scroller.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\treturn this.scrollIntoView(event.target);\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback) {\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t srcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tdrawFrame = function drawFrame() {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/edition-info.js": {
"title": "$:/core/modules/utils/edition-info.js",
"text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch([[ex]]) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/fakedom.js": {
"title": "$:/core/modules/utils/fakedom.js",
"text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nObject.defineProperty(TW_Element.prototype, \"style\", {\n\tget: function() {\n\t\treturn this._style;\n\t},\n\tset: function(str) {\n\t\tvar self = this;\n\t\tstr = str || \"\";\n\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\tif(name && value) {\n\t\t\t\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t}\n\t\t});\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value + \"\";\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \":\" + this._style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\");\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/filesystem.js": {
"title": "$:/core/modules/utils/filesystem.js",
"text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = $tw.utils.removeTrailingSeparator(srcPath);\n\tdstPath = $tw.utils.removeTrailingSeparator(dstPath);\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {};\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\") {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\tfilepath;\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// If not, generate a base pathname\n\tif(!filepath) {\n\t\tfilepath = title;\n\t\t// If the filepath already ends in the extension then remove it\n\t\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t\t}\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t// Don't let the filename start with a dot because such files are invisible on *nix\n\tfilepath = filepath.replace(/^\\./g,\"_\");\n\t// Remove any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation characters)\n\tif(!filepath) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\t\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists\n\tvar fullPath,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// Return the full path to the file\n\treturn fullPath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",callback);\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",callback);\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",callback);\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/logger.js": {
"title": "$:/core/modules/utils/logger.js",
"text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n}\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tif(this.enable && console !== undefined && console.log !== undefined) {\n\t\treturn Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));\n\t}\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\t\t\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/parsetree.js": {
"title": "$:/core/modules/utils/parsetree.js",
"text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/performance.js": {
"title": "$:/core/modules/utils/performance.js",
"text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\t\t\n\t}\n};\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime).toFixed(2) + \"ms\");\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\n\t\t\t\treturn + 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/pluginmaker.js": {
"title": "$:/core/modules/utils/pluginmaker.js",
"text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/transliterate.js": {
"title": "$:/core/modules/utils/transliterate.js",
"text": "/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x00-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/utils.js": {
"title": "$:/core/modules/utils/utils.js",
"text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\n};\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\t\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\treturn Object.keys(object || {}).length;\n};\n\n/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.getYearForWeekNo(date);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn date.getFullYear();\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds());\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\t}\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call();\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\", duration: 365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\", duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\", duration: 24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\", duration: 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration: 60 * 1000},\n\t\t{name: \"Seconds\", duration: 1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&\", < to \"<\", > to \">\", \" to \""\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/[\\x00-\\x1f\\x80-\\uFFFF]/g, exports.escape); // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s) {\n\t// See http://www.json.org/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/\\x08/g, '\\\\b') // backspace\n\t\t.replace(/\\x0c/g, '\\\\f') // formfeed\n\t\t.replace(/\\t/g, '\\\\t') // tab\n\t\t.replace(/[\\x00-\\x1f\\x80-\\uFFFF]/g,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 0;\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\treturn base64utf8.base64.decode.call(base64utf8,string64);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64) {\n\treturn base64utf8.base64.encode.call(base64utf8,string64);\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\n\t\tm = r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tparts.push(\"data:\");\n\tparts.push(type);\n\tparts.push(isBase64 ? \";base64\" : \"\");\n\tparts.push(\",\");\n\tparts.push(isBase64 ? text : encodeURIComponent(text));\n\treturn parts.join(\"\");\n};\n\n/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif (x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\n\n/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/widgets/action-createtiddler.js": {
"title": "$:/core/modules/widgets/action-createtiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.generateNewTitle(this.actionBaseTitle),\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tvar tiddler = this.wiki.addTiddler(new $tw.Tiddler(creationFields,fields,modificationFields,{title: title}));\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable(\"currentTiddler\"));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletefield.js": {
"title": "$:/core/modules/widgets/action-deletefield.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {},\n\t\thasChanged = false;\n\tif(this.actionField && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletetiddler.js": {
"title": "$:/core/modules/widgets/action-deletetiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-listops.js": {
"title": "$:/core/modules/widgets/action-listops.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.$tiddler || changedAttributes.$filter ||\n\t\tchangedAttributes.$subfilter || changedAttributes.$field ||\n\t\tchangedAttributes.$index || changedAttributes.$tags) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\ttype = \"!!\",\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\ttype = \"##\";\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar subfilter = \"[list[\" + this.target + type + list + \"]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(subfilter, this)));\n\t}\n\tif(this.filtertags) {\n\t\tvar tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-navigate.js": {
"title": "$:/core/modules/widgets/action-navigate.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tevent = event || {};\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-sendmessage.js": {
"title": "$:/core/modules/widgets/action-sendmessage.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-setfield.js": {
"title": "$:/core/modules/widgets/action-setfield.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\toptions = {};\n\toptions.suppressTimestamp = !this.actionTimestamp;\n\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\") || (typeof this.actionValue == \"string\")) {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/browse.js": {
"title": "$:/core/modules/widgets/browse.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,{\n\t\t\t\tcallback: function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t},\n\t\t\t\tdeserializer: self.deserializer\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.deserializer = this.getAttribute(\"deserializer\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/button.js": {
"title": "$:/core/modules/widgets/button.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = \"button\";\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes[\"class\"] || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/checkbox.js": {
"title": "$:/core/modules/widgets/checkbox.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value;\n\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t}\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxIndex) {\n\t\t\tvar value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \"\");\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\n\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/codeblock.js": {
"title": "$:/core/modules/widgets/codeblock.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/count.js": {
"title": "$:/core/modules/widgets/count.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = undefined;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/diff-text.js": {
"title": "$:/core/modules/widgets/diff-text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\"),this.getAttribute(\"dest\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/draggable.js": {
"title": "$:/core/modules/widgets/draggable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Sanitise the specified tag\n\tvar tag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [\"tc-draggable\"];\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Add event handlers\n\t$tw.utils.makeDraggable({\n\t\tdomNode: domNode,\n\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\tstartActions: self.startActions,\n\t\tendActions: self.endActions,\n\t\twidget: this\n\t});\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedTiddlers.tag || changedTiddlers[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/droppable.js": {
"title": "$:/core/modules/widgets/droppable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tvar domNode = this.document.createElement(tag),\n\t\tclasses = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tdomNode.className = classes.join(\" \");\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t]);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent = function(event) {\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\tfieldsArray.forEach(function(fields) {\n\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t});\n\t});\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = event.ctrlKey && ! event.shiftKey ? \"ctrl\" : event.shiftKey && !event.ctrlKey ? \"shift\" : \n\t\t\t\tevent.ctrlKey && event.shiftKey ? \"ctrl-shift\" : \"normal\" ;\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableClass = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/dropzone.js": {
"title": "$:/core/modules/widgets/dropzone.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = \"tc-dropzone\";\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t]);\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t};\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\tif(dataTransfer.files) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle(\"Untitled\"),readFileCallback);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t};\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-binary.js": {
"title": "$:/core/modules/widgets/edit-binary.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Construct the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"transclude\",\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t}\n\t}]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-bitmap.js": {
"title": "$:/core/modules/widgets/edit-bitmap.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\t// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\t\t\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-shortcut.js": {
"title": "$:/core/modules/widgets/edit-shortcut.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\t\t\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\t\t\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-text.js": {
"title": "$:/core/modules/widgets/edit-text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit.js": {
"title": "$:/core/modules/widgets/edit.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: this.editTitle},\n\t\t\tfield: {type: \"string\", value: this.editField},\n\t\t\tindex: {type: \"string\", value: this.editIndex},\n\t\t\t\"class\": {type: \"string\", value: this.editClass},\n\t\t\t\"placeholder\": {type: \"string\", value: this.editPlaceholder},\n\t\t\t\"tabindex\": {type: \"string\", value: this.editTabIndex}\n\t\t},\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/element.js": {
"title": "$:/core/modules/widgets/element.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Neuter blacklisted elements\n\tvar tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"safe-\" + tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\ttag = \"h\" + headingLevel;\n\t}\n\t// Create the DOM node\n\tvar domNode = this.document.createElementNS(this.namespace,tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nElementWidget.prototype.execute = function() {\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.parseTreeNode.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\t// Update our attributes\n\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/encrypt.js": {
"title": "$:/core/modules/widgets/encrypt.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/entity.js": {
"title": "$:/core/modules/widgets/entity.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fieldmangler.js": {
"title": "$:/core/modules/widgets/fieldmangler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fields.js": {
"title": "$:/core/modules/widgets/fields.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\t// Get the exclusion list\n\tvar exclude;\n\tif(this.exclude) {\n\t\texclude = this.exclude.split(\" \");\n\t} else {\n\t\texclude = [\"text\"]; \n\t}\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tfor(var fieldName in tiddler.fields) {\n\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\tfields.push(fieldName);\n\t\t\t}\n\t\t}\n\t\tfields.sort();\n\t\tfor(var f=0; f<fields.length; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\tvar row = this.template,\n\t\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\t\tif(reMatch) {\n\t\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\t\ttext.push(row);\n\t\t\t}\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude || changedAttributes.stripTitlePrefix || changedTiddlers[this.tiddlerTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/image.js": {
"title": "$:/core/modules/widgets/image.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/importvariables.js": {
"title": "$:/core/modules/widgets/importvariables.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar self = this;\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\tvar widgetStackStart,widgetStackEnd;\n\tfunction addWidgetNode(widgetNode) {\n\t\tif(widgetNode) {\n\t\t\tif(!widgetStackStart && !widgetStackEnd) {\n\t\t\t\twidgetStackStart = widgetNode;\n\t\t\t\twidgetStackEnd = widgetNode;\n\t\t\t} else {\n\t\t\t\twidgetStackEnd.children = [widgetNode];\n\t\t\t\twidgetStackEnd = widgetNode;\n\t\t\t}\n\t\t}\n\t}\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = self.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\taddWidgetNode({\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params,\n\t\t\t\t\tisMacroDefinition: parseTreeNode.isMacroDefinition\n\t\t\t\t});\n\t\t\t\tparseTreeNode = parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\t// Add our own children to the end of the pile\n\tvar parseTreeNodes;\n\tif(widgetStackStart && widgetStackEnd) {\n\t\tparseTreeNodes = [widgetStackStart];\n\t\twidgetStackEnd.children = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/keyboard.js": {
"title": "$:/core/modules/widgets/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) {\n\t\t\tself.invokeActions(self,event);\n\t\t\tif(self.actions) {\n\t\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t\t}\n\t\t\tself.dispatchMessage(event);\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\tthis.shortcutTiddlers = [];\n\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t});\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/link.js": {
"title": "$:/core/modules/widgets/link.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true,\n\t\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\t\t\t\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",encodeURIComponent(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tdomNode.setAttribute(\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.overrideClasses = this.getAttribute(\"overrideClass\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/linkcatcher.js": {
"title": "$:/core/modules/widgets/linkcatcher.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(!this.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t// This is a navigate event generated by the actions of this linkcatcher, so we don't trap it again, but just pass it to the parent\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: \"tm-navigate\",\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/list.js": {
"title": "$:/core/modules/widgets/list.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar emptyMessage = this.getAttribute(\"emptyMessage\",\"\"),\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/macrocall.js": {
"title": "$:/core/modules/widgets/macrocall.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\t\tvariableInfo = this.getVariableInfo(macroName,{params: params}),\n\t\ttext = variableInfo.text,\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\tvar parser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\tparseTreeNodes = parser ? parser.tree : [];\n\t\t// Wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\tvar attributes = {};\n\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\tvar name = \"__\" + param.name + \"__\";\n\t\t\tattributes[name] = {\n\t\t\t\tname: name,\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: param.value\n\t\t\t};\n\t\t});\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"vars\",\n\t\t\tattributes: attributes,\n\t\t\tchildren: parseTreeNodes\n\t\t}];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/navigator.js": {
"title": "$:/core/modules/widgets/navigator.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\t\t\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.wiki.addToStory(title,fromTitle,this.storyTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.wiki.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler(\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\treturn this.wiki.generateDraftTitle(title);\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\nconsole.log(\"Relinking '\" + draftOf + \"' to '\" + draftTitle + \"'\");\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix || \"$:/state/folded/\";\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\t$tw.wiki.renameTiddler(from,to);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/password.js": {
"title": "$:/core/modules/widgets/password.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/qualify.js": {
"title": "$:/core/modules/widgets/qualify.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/radio.js": {
"title": "$:/core/modules/widgets/radio.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n \t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n \t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif (this.radioIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t} else {\n\t\tvalue = tiddler && tiddler.getFieldString(this.radioField);\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.radioTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/range.js": {
"title": "$:/core/modules/widgets/range.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\n\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif($tw.utils.hop(tiddler.fields,this.tiddlerField)) {\n\t\t\tvalue = tiddler.fields[this.tiddlerField] || \"\";\n\t\t} else {\n\t\t\tvalue = this.defaultValue || \"\";\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.handleChangeEvent = function(event) {\n\tthis.wiki.setText(this.tiddlerTitle ,this.tiddlerField, null,this.inputDomNode.value);\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes['min'] || changedAttributes['max'] || changedAttributes['increment'] || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/raw.js": {
"title": "$:/core/modules/widgets/raw.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/reveal.js": {
"title": "$:/core/modules/widgets/reveal.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tvar classes = this[\"class\"].split(\" \") || [];\n\tclasses.push(\"tc-reveal\");\n\tdomNode.className = classes.join(\" \");\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state,\n\t defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/scrollable.js": {
"title": "$:/core/modules/widgets/scrollable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tthis.scrollIntoView(event.target);\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/select.js": {
"title": "$:/core/modules/widgets/select.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\t// Get the new value and assign it to the tiddler\n\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tif(values.indexOf(select.children[i].value) != -1) {\n\t\t\t\tselect.children[i].selected = true;\n\t\t\t}\n\t\t}\n\t\t\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectActions = this.getAttribute(\"actions\");\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tif(this.selectMultiple) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"size\",this.selectSize);\n\t}\n\tif(this.selectTooltip) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"title\",this.selectTooltip);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/set.js": {
"title": "$:/core/modules/widgets/set.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,!!this.parseTreeNode.isMacroDefinition);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\n\tvar value = this.setValue;\n\tif(this.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\t\t\t\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\t\t\t\n\t\t\t}\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value || \"\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\n\t (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/text.js": {
"title": "$:/core/modules/widgets/text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/tiddler.js": {
"title": "$:/core/modules/widgets/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/transclude.js": {
"title": "$:/core/modules/widgets/transclude.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/vars.js": {
"title": "$:/core/modules/widgets/vars.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/view.js": {
"title": "$:/core/modules/widgets/view.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/widget.js": {
"title": "$:/core/modules/widgets/widget.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition) {\n\tthis.variables[name] = {value: value, params: params, isMacroDefinition: !!isMacroDefinition};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} of parameters passed to wikitext variables\ntext: text of variable, with parameters properly substituted\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\tvalue = variable.value,\n\t\t\tparams = this.resolveVariableParameters(variable.params,actualParams);\n\t\t// Substitute any parameters specified in the definition\n\t\t$tw.utils.each(params,function(param) {\n\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t});\n\t\t// Only substitute variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tvalue = this.substituteVariableReferences(value);\t\t\t\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn {\n\t\ttext: this.evaluateMacroModule(name,actualParams,options.defaultValue)\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"filtered\") {\n\t\t\tvalue = self.wiki.filterTiddlers(attribute.filter,self)[0] || \"\";\n\t\t} else if(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].render(parent,nextSibling);\n\t};\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\n\t}\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction) {\n\t\t\tchild.refreshSelf();\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/wikify.js": {
"title": "$:/core/modules/widgets/wikify.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/wiki-bulkops.js": {
"title": "$:/core/modules/wiki-bulkops.js",
"text": "/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false;\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming tag '\" + tags[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming list item '\" + list[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/wiki.js": {
"title": "$:/core/modules/wiki.js",
"text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\",\n\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,modificationFields);\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type] || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a sorted array of tiddler titles. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t\t\t\t\t\t\t(isDescending ? y - x : x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if(isAlphaNumeric) {\n\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\t// Count up the links\n\t\tvar links = [],\n\t\t\tcheckParseTree = function(parseTree) {\n\t\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\tif(parser) {\n\t\t\tcheckParseTree(parser.tree);\n\t\t}\n\t\treturn links;\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinks = [];\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\tbacklinks.push(title);\n\t\t}\n\t});\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar self = this,\n\t\treplacedTitles = Object.create(null);\n\tfunction replaceItem(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\treplaceItem(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\treplaceItem(afterTitle);\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// We get the currPos //after// figuring out the newPos, because recursive replaceItem calls might alter title's currPos\n\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\tif(newPos === -1) {\n\t\t\t\t\tnewPos = currPos;\n\t\t\t\t}\n\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t}\n\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\treplaceItem(title);\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\nexports.getTiddlersAsJson = function(filter) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch([[ex]]) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\tthis.caches = this.caches || Object.create(null);\n\tvar caches = this.caches[title];\n\tif(caches && caches[cacheName]) {\n\t\treturn caches[cacheName];\n\t} else {\n\t\tif(!caches) {\n\t\t\tcaches = Object.create(null);\n\t\t\tthis.caches[title] = caches;\n\t\t}\n\t\tcaches[cacheName] = initializer();\n\t\treturn caches[cacheName];\n\t}\n};\n\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.parseText = function(type,text,options) {\n\ttext = text || \"\";\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type,tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title}},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\";\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn $tw.wiki.makeWidget(parseTreeDiv,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, regardless of adjacency or ordering\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\",\n\t\tanchor = options.anchored ? \"^\" : \"\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\t\t\t\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar notYetFound = searchTermsRegExps.slice();\n\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn notYetFound.length == 0;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(tiddler.fields.text !== undefined) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text;\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t};\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\", type: type};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified.\nIf the original tiddler doesn't exist, create a vanilla tiddler variable,\nto check if additional fields have been added.\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\tif(historyTitle) {\n\t\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\t\tstory.addToHistory(title,fromPageRect);\t\t\n\t}\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tif(storyTitle) {\n\t\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\t\tstory.addToStory(title,fromTitle,options);\t\t\n\t}\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n})();\n\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/palettes/Blanca": {
"title": "$:/palettes/Blanca",
"name": "Blanca",
"description": "A clean white palette to let you focus",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Blue": {
"title": "$:/palettes/Blue",
"name": "Blue",
"description": "A blue theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Muted": {
"title": "$:/palettes/Muted",
"name": "Muted",
"description": "Bright tiddlers on a muted background",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/ContrastLight": {
"title": "$:/palettes/ContrastLight",
"name": "Contrast (Light)",
"description": "High contrast and unambiguous (light version)",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
},
"$:/palettes/ContrastDark": {
"title": "$:/palettes/ContrastDark",
"name": "Contrast (Dark)",
"description": "High contrast and unambiguous (dark version)",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
},
"$:/palettes/DarkPhotos": {
"title": "$:/palettes/DarkPhotos",
"created": "20150402111612188",
"description": "Good with dark photo backgrounds",
"modified": "20150402112344080",
"name": "DarkPhotos",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Nord": {
"title": "$:/palettes/Nord",
"name": "Nord",
"description": "An arctic, north-bluish color palette.",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"license": "MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md",
"text": "alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #4C566A\nbutton-foreground: #D8DEE9\nbutton-border: transparent\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nforeground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #4C566A\nsidebar-controls-foreground: #3B4252\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #2e3440\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #2d3038\nvery-muted-foreground: #2d3038\n"
},
"$:/palettes/Rocker": {
"title": "$:/palettes/Rocker",
"name": "Rocker",
"description": "A dark theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/SolarFlare": {
"title": "$:/palettes/SolarFlare",
"name": "Solar Flare",
"description": "Warm, relaxing earth colours",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n download-foreground: <<colour background>>\n dragger-foreground: <<colour background>>\n dropdown-background: <<colour background>>\n modal-background: <<colour background>>\n sidebar-foreground-shadow: <<colour background>>\n tiddler-background: <<colour background>>\n tiddler-border: <<colour background>>\n tiddler-link-background: <<colour background>>\n tab-background-selected: <<colour background>>\n dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n dragger-background: <<colour foreground>>\n tab-foreground: <<colour foreground>>\n tab-foreground-selected: <<colour tab-foreground>>\n sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n sidebar-tab-foreground: <<colour tab-foreground>>\n sidebar-button-foreground: <<colour foreground>>\n sidebar-controls-foreground: <<colour foreground>>\n sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n alert-muted-foreground: <<colour base01>>\n: base00\n code-foreground: <<colour base00>>\n message-foreground: <<colour base00>>\n tag-foreground: <<colour base00>>\n: base0\n sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n muted-foreground: <<colour base1>>\n blockquote-bar: <<colour muted-foreground>>\n dropdown-border: <<colour muted-foreground>>\n sidebar-muted-foreground: <<colour muted-foreground>>\n tiddler-title-foreground: <<colour muted-foreground>>\n site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n modal-footer-background: <<colour base2>>\n page-background: <<colour base2>>\n modal-backdrop: <<colour page-background>>\n notification-background: <<colour page-background>>\n code-background: <<colour page-background>>\n code-border: <<colour code-background>>\n pre-background: <<colour page-background>>\n pre-border: <<colour pre-background>>\n sidebar-tab-background-selected: <<colour page-background>>\n table-header-background: <<colour base2>>\n tag-background: <<colour base2>>\n tiddler-editor-background: <<colour base2>>\n tiddler-info-background: <<colour base2>>\n tiddler-info-tab-background: <<colour base2>>\n tab-background: <<colour base2>>\n dropdown-tab-background: <<colour tab-background>>\n: base3\n alert-background: <<colour base3>>\n message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n alert-highlight: <<colour magenta>>\n: violet\n external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n primary: <<colour blue-muted>>\n download-background: <<colour primary>>\n tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nmessage-border: #cfd6e6\nmodal-border: #999999\nselect-tag-background:\nselect-tag-foreground:\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n modal-footer-border: <<colour tab-border>>\n modal-header-border: <<colour tab-border>>\n notification-border: <<colour tab-border>>\n sidebar-tab-border: <<colour tab-border>>\n tab-border-selected: <<colour tab-border>>\n sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/SolarizedLight": {
"title": "$:/palettes/SolarizedLight",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Precision colors for machines and people",
"license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
"name": "SolarizedLight",
"text": "alert-background: #eee8d5\nalert-border: #073642\nalert-highlight: #cb4b16\nalert-muted-foreground: #586e75\nbackground: #fdf6e3\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: #cb4b16\nbutton-foreground: #fdf6e3\nbutton-border: transparent\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #d33682\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #859900\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #D08770\ndownload-background: #859900\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #fdf6e3\ndropdown-tab-background: #93a1a1\ndropzone-background: #859900\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: #d33682\nexternal-link-foreground-visited: #b58900\nexternal-link-foreground: #cb4b16\nforeground: #839496\nmessage-background: #586e75\nmessage-border: #586e75\nmessage-foreground: #eee8d5\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #eee8d5\nmodal-footer-background: #eee8d5\nmodal-footer-border: #eee8d5\nmodal-header-border: #eee8d5\nmuted-foreground: #93a1a1\nnotification-background: #EBCB8B\nnotification-border: #D08770\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #93a1a1\nprimary: #2aa198\nselect-tag-background: #eee8d5\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: #eee8d5\nsidebar-controls-foreground-hover: #268bd2\nsidebar-controls-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #839496\nsidebar-muted-foreground-hover: #657b83\nsidebar-muted-foreground: #93a1a1\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-background: #839496\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #657b83\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #839496\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #859900\nsidebar-tiddler-link-foreground: #268bd2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #dc322f\ntab-background-selected: #fdf6e3\ntab-background: #839496\ntab-border-selected: #93a1a1\ntab-border: #93a1a1\ntab-divider: #fdf6e3\ntab-foreground-selected: #839496\ntab-foreground: #eee8d5\ntable-border: #657b83\ntable-footer-background: #657b83\ntable-header-background: #93a1a1\ntag-background: #6c71c4\ntag-foreground: #eee8d5\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #b58900\ntiddler-controls-foreground-selected: #b58900\ntiddler-controls-foreground: #073642\ntiddler-editor-background: #eee8d5\ntiddler-editor-border-image: #eee8d5\ntiddler-editor-border: #eee8d5\ntiddler-editor-fields-even: #eee8d5\ntiddler-editor-fields-odd: #fdf6e3\ntiddler-info-background: #eee8d5\ntiddler-info-border: #eee8d5\ntiddler-info-tab-background: #586e75\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #586e75\ntiddler-title-foreground: #073642\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #839496\nvery-muted-foreground: #93a1a1\n"
},
"$:/palettes/SpartanDay": {
"title": "$:/palettes/SpartanDay",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Cold, spartan day colors",
"name": "Spartan Day",
"text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nforeground: rgba(0, 0, 0, 0.87)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n"
},
"$:/palettes/SpartanNight": {
"title": "$:/palettes/SpartanNight",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Dark spartan colors",
"name": "Spartan Night",
"text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nforeground: rgba(255, 255, 255, 0.7)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n"
},
"$:/palettes/Twilight": {
"title": "$:/palettes/Twilight",
"tags": "$:/tags/Palette",
"author": "Thomas Elmiger",
"type": "application/x-tiddler-dictionary",
"name": "Twilight",
"description": "Delightful, soft darkness.",
"text": "alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nforeground: rgb(179, 179, 179)\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\n"
},
"$:/palettes/Vanilla": {
"title": "$:/palettes/Vanilla",
"name": "Vanilla",
"description": "Pale and unobtrusive",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/core/readme": {
"title": "$:/core/readme",
"text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
},
"$:/library/sjcl.js/license": {
"title": "$:/library/sjcl.js/license",
"type": "text/plain",
"text": "SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
},
"$:/core/templates/MOTW.html": {
"title": "$:/core/templates/MOTW.html",
"text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)https://tiddlywiki.com --> "
},
"$:/core/templates/alltiddlers.template.html": {
"title": "$:/core/templates/alltiddlers.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
},
"$:/core/templates/canonical-uri-external-image": {
"title": "$:/core/templates/canonical-uri-external-image",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/canonical-uri-external-raw": {
"title": "$:/core/templates/canonical-uri-external-raw",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/canonical-uri-external-text": {
"title": "$:/core/templates/canonical-uri-external-text",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid"
},
"$:/core/templates/css-tiddler": {
"title": "$:/core/templates/css-tiddler",
"text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
},
"$:/core/templates/exporters/CsvFile": {
"title": "$:/core/templates/exporters/CsvFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/CsvFile}}",
"extension": ".csv",
"text": "\\define renderContent()\n<$text text=<<csvtiddlers filter:\"\"\"$(exportFilter)$\"\"\" format:\"quoted-comma-sep\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/JsonFile": {
"title": "$:/core/templates/exporters/JsonFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/JsonFile}}",
"extension": ".json",
"text": "\\define renderContent()\n<$text text=<<jsontiddlers filter:\"\"\"$(exportFilter)$\"\"\">>/>\n\\end\n<<renderContent>>\n"
},
"$:/core/templates/exporters/StaticRiver": {
"title": "$:/core/templates/exporters/StaticRiver",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/StaticRiver}}",
"extension": ".html",
"text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
},
"$:/core/templates/exporters/StaticRiver/Content": {
"title": "$:/core/templates/exporters/StaticRiver/Content",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>\n"
},
"$:/core/templates/exporters/TidFile": {
"title": "$:/core/templates/exporters/TidFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/TidFile}}",
"extension": ".tid",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>"
},
"$:/core/save/all-external-js": {
"title": "$:/core/save/all-external-js",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n"
},
"$:/core/templates/tiddlywiki5.js": {
"title": "$:/core/templates/tiddlywiki5.js",
"text": "\\rules only filteredtranscludeinline transcludeinline codeinline\n\n/*\n{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}\n`*/\n`<!--~~ Library modules ~~-->\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/plain-text-tiddler}}}\n<!--~~ Boot prefix ~~-->\n{{ $:/boot/bootprefix.js ||$:/core/templates/plain-text-tiddler}}\n<!--~~ Core plugin ~~-->\n{{$:/core/templates/tiddlywiki5.js/tiddlers}}\n<!--~~ Boot kernel ~~-->\n{{ $:/boot/boot.js ||$:/core/templates/plain-text-tiddler}}\n"
},
"$:/core/templates/tiddlywiki5.js/tiddlers": {
"title": "$:/core/templates/tiddlywiki5.js/tiddlers",
"text": "`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n$tw.preloadTiddlerArray([{\n\ttitle: \"$:/config/SaveWikiButton/Template\",\n\ttext: \"$:/core/save/all-external-js\"\n}]);\n`\n"
},
"$:/core/templates/tiddlywiki5-external-js.html": {
"title": "$:/core/templates/tiddlywiki5-external-js.html",
"text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n</body>\n<script src=\"%24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\"></script>\n</html>\n"
},
"$:/core/templates/html-div-tiddler": {
"title": "$:/core/templates/html-div-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
},
"$:/core/templates/html-tiddler": {
"title": "$:/core/templates/html-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
},
"$:/core/templates/javascript-tiddler": {
"title": "$:/core/templates/javascript-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
},
"$:/core/templates/json-tiddler": {
"title": "$:/core/templates/json-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>"
},
"$:/core/templates/module-tiddler": {
"title": "$:/core/templates/module-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
},
"$:/core/templates/plain-text-tiddler": {
"title": "$:/core/templates/plain-text-tiddler",
"text": "<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/raw-static-tiddler": {
"title": "$:/core/templates/raw-static-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />"
},
"$:/core/save/all": {
"title": "$:/core/save/all",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/empty": {
"title": "$:/core/save/empty",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-all": {
"title": "$:/core/save/lazy-all",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-images": {
"title": "$:/core/save/lazy-images",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/templates/server/static.sidebar.wikitext": {
"title": "$:/core/templates/server/static.sidebar.wikitext",
"text": "\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\">\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n"
},
"$:/core/templates/server/static.tiddler.html": {
"title": "$:/core/templates/server/static.tiddler.html",
"text": "\\whitespace trim\n\\define tv-wikilink-template() $uri_encoded$\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content={{$:/core/templates/version}} />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\">\n<div class=\"tc-tiddler-frame\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>"
},
"$:/core/templates/server/static.tiddler.wikitext": {
"title": "$:/core/templates/server/static.tiddler.wikitext",
"text": "\\whitespace trim\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n<div class=\"tc-tags-wrapper\">\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body\">\n<$transclude mode=\"block\"/>\n</div>\n"
},
"$:/core/templates/single.tiddler.window": {
"title": "$:/core/templates/single.tiddler.window",
"text": "<$set name=\"themeTitle\" value={{$:/view}}>\n\n<$set name=\"tempCurrentTiddler\" value=<<currentTiddler>>>\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$set name=\"currentTiddler\" value=<<tempCurrentTiddler>>>\n\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</$importvariables>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n"
},
"$:/core/templates/split-recipe": {
"title": "$:/core/templates/split-recipe",
"text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
},
"$:/core/templates/static-tiddler": {
"title": "$:/core/templates/static-tiddler",
"text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
},
"$:/core/templates/static.area": {
"title": "$:/core/templates/static.area",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n"
},
"$:/core/templates/static.content": {
"title": "$:/core/templates/static.content",
"text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
},
"$:/core/templates/static.template.css": {
"title": "$:/core/templates/static.template.css",
"text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
},
"$:/core/templates/static.template.html": {
"title": "$:/core/templates/static.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
},
"$:/core/templates/static.tiddler.html": {
"title": "$:/core/templates/static.tiddler.html",
"text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`"
},
"$:/core/templates/store.area.template.html": {
"title": "$:/core/templates/store.area.template.html",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
},
"$:/core/templates/tid-tiddler": {
"title": "$:/core/templates/tid-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/tiddler-metadata": {
"title": "$:/core/templates/tiddler-metadata",
"text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
},
"$:/core/templates/tiddlywiki5.html": {
"title": "$:/core/templates/tiddlywiki5.html",
"text": "<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n"
},
"$:/core/templates/version": {
"title": "$:/core/templates/version",
"text": "<<version>>"
},
"$:/core/templates/wikified-tiddler": {
"title": "$:/core/templates/wikified-tiddler",
"text": "<$transclude />"
},
"$:/core/ui/AboveStory/tw2-plugin-check": {
"title": "$:/core/ui/AboveStory/tw2-plugin-check",
"tags": "$:/tags/AboveStory",
"text": "\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/Actions/new-image": {
"title": "$:/core/ui/Actions/new-image",
"tags": "$:/tags/Actions",
"description": "create a new image tiddler",
"text": "\\define get-type()\nimage/$(imageType)$\n\\end\n<$vars imageType={{$:/config/NewImageType}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>>/>\n</$vars>\n"
},
"$:/core/ui/Actions/new-journal": {
"title": "$:/core/ui/Actions/new-journal",
"tags": "$:/tags/Actions",
"description": "create a new journal tiddler",
"text": "<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} journalTags={{$:/config/NewJournal/Tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalTags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalTags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$vars>\n"
},
"$:/core/ui/Actions/new-tiddler": {
"title": "$:/core/ui/Actions/new-tiddler",
"tags": "$:/tags/Actions",
"description": "create a new empty tiddler",
"text": "<$action-sendmessage $message=\"tm-new-tiddler\"/>\n"
},
"$:/core/ui/AdvancedSearch/Filter": {
"title": "$:/core/ui/AdvancedSearch/Filter",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Filter/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}} template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nAre you sure you wish to delete <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\nDelete these tiddlers\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/export": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Shadows": {
"title": "$:/core/ui/AdvancedSearch/Shadows",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Shadows/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Standard": {
"title": "$:/core/ui/AdvancedSearch/Standard",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Standard/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/System": {
"title": "$:/core/ui/AdvancedSearch/System",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/System/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/AdvancedSearch": {
"title": "$:/AdvancedSearch",
"icon": "$:/core/images/advanced-search-button",
"color": "#bbb",
"text": "<div class=\"tc-advanced-search\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" \"$:/core/ui/AdvancedSearch/System\">>\n</div>\n"
},
"$:/core/ui/AlertTemplate": {
"title": "$:/core/ui/AlertTemplate",
"text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/delete-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=\"0hh:0mm:0ss DD MM YYYY\"/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">({{$:/language/Count}}: <$view field=\"count\"/>)</span></$reveal>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
},
"$:/core/ui/BinaryWarning": {
"title": "$:/core/ui/BinaryWarning",
"text": "\\define lingo-base() $:/language/BinaryWarning/\n<div class=\"tc-binary-warning\">\n\n<<lingo Prompt>>\n\n</div>\n"
},
"$:/core/ui/Components/plugin-info": {
"title": "$:/core/ui/Components/plugin-info",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage,default-popup-state)\n<div class=\"tc-plugin-info-chunk tc-small-icon\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<h1>\n''<$view field=\"description\"><$view field=\"title\"/></$view>'' $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-body\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n</$set>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\n"
},
"$:/core/ui/Components/tag-link": {
"title": "$:/core/ui/Components/tag-link",
"text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"
},
"$:/core/ui/ControlPanel/Advanced": {
"title": "$:/core/ui/ControlPanel/Advanced",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
"text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" \"$:/core/ui/ControlPanel/TiddlerFields\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Appearance": {
"title": "$:/core/ui/ControlPanel/Appearance",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
"text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Theme\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/Basics": {
"title": "$:/core/ui/ControlPanel/Basics",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Basics/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\" class=\"tc-edit-texteditor\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" tag=\"textarea\" class=\"tc-edit-texteditor\" default=\"\"/> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Tags\" default=\"\" tag=\"input\"/> |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
},
"$:/core/ui/ControlPanel/EditorTypes": {
"title": "$:/core/ui/ControlPanel/EditorTypes",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/Info": {
"title": "$:/core/ui/ControlPanel/Info",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Info/Caption}}",
"text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Basics\">>\n</div>\n"
},
"$:/core/ui/ControlPanel/KeyboardShortcuts": {
"title": "$:/core/ui/ControlPanel/KeyboardShortcuts",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/> <$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list filter=\"[list[$(shortcutTitle)$!!text]sort[title]]\" variable=\"shortcut\" emptyMessage=\"\"\"\n<div class=\"tc-dropdown-item-plain\">\n//<<lingo NoShortcuts/Caption>>//\n</div>\n\"\"\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip=<<lingo Remove/Hint>>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n×\n</$button>\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">>\n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/LoadedModules": {
"title": "$:/core/ui/ControlPanel/LoadedModules",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
},
"$:/core/ui/ControlPanel/Modals/AddPlugins": {
"title": "$:/core/ui/ControlPanel/Modals/AddPlugins",
"subtitle": "{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}",
"text": "\\define install-plugin-button()\n<$button>\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\" emptyMessage=\"\"\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\"\"\">\n{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}\n</$list>\n</$button>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-small-icon\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<h1><$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<<install-plugin-button>>\n</div>\n</div>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\" emptyMessage=\"\"\"{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\"\"\">\n<em>\n{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}\n</em>\n</$list>\n</div>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[description]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$list>\n\\end\n\n\\define close-library-button()\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}} {{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<div class=\"tc-plugin-library\">\n\n!! <$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link>\n\n//<$view field=\"url\"/>//\n\n<$transclude/>\n\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n\n<<display-server-connection>>\n</div>\n</$list>\n\\end\n\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<div>\n<<plugin-library-listing>>\n</div>\n"
},
"$:/core/ui/ControlPanel/Palette": {
"title": "$:/core/ui/ControlPanel/Palette",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Palette/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/PaletteManager}}\n\n</$reveal>\n\n"
},
"$:/core/ui/ControlPanel/Parsing": {
"title": "$:/core/ui/ControlPanel/Parsing",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/Parsing/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define toggle(Type)\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<<rule>>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>"
},
"$:/core/ui/ControlPanel/Plugins/Add/Languages": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Languages",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)",
"text": "<<display-server-assets language>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)",
"text": "<<display-server-assets plugin>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Themes": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Themes",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)",
"text": "<<display-server-assets theme>>\n"
},
"$:/core/ui/ControlPanel/Plugins/AddPlugins": {
"title": "$:/core/ui/ControlPanel/Plugins/AddPlugins",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green tc-primary-btn\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Languages": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)",
"text": "<<plugin-table language>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)",
"text": "<<plugin-table plugin>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Themes": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)",
"text": "<<plugin-table theme>>\n"
},
"$:/core/ui/ControlPanel/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[description]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\">>\n"
},
"$:/core/ui/ControlPanel/Saving/DownloadSaver": {
"title": "$:/core/ui/ControlPanel/Saving/DownloadSaver",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<<lingo Hint>>\n\n!! <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <<lingo AutoSave/Description>> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Saving/General": {
"title": "$:/core/ui/ControlPanel/Saving/General",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/General/Caption}}",
"list-before": "",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!! <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo AutoSave/Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo AutoSave/Disabled/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Saving/GitHub": {
"title": "$:/core/ui/ControlPanel/Saving/GitHub",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\"/> |"
},
"$:/core/ui/ControlPanel/Saving/GitLab": {
"title": "$:/core/ui/ControlPanel/Saving/GitLab",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\"/> |"
},
"$:/core/ui/ControlPanel/Saving/TiddlySpot": {
"title": "$:/core/ui/ControlPanel/Saving/TiddlySpot",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define backupURL()\nhttp://$(userName)$.tiddlyspot.com/backup/\n\\end\n\\define backupLink()\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<backupURL>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<backupLink>> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>"
},
"$:/core/ui/ControlPanel/Saving": {
"title": "$:/core/ui/ControlPanel/Saving",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Saving/Caption}}",
"text": "{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Saving/General\">>\n</div>\n"
},
"$:/core/buttonstyles/Borderless": {
"title": "$:/core/buttonstyles/Borderless",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}",
"text": "tc-btn-invisible"
},
"$:/core/buttonstyles/Boxed": {
"title": "$:/core/buttonstyles/Boxed",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}",
"text": "tc-btn-boxed"
},
"$:/core/buttonstyles/Rounded": {
"title": "$:/core/buttonstyles/Rounded",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}",
"text": "tc-btn-rounded"
},
"$:/core/ui/ControlPanel/Settings/CamelCase": {
"title": "$:/core/ui/ControlPanel/Settings/CamelCase",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/CamelCase/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> <$link to=\"$:/config/WikiParserRules/Inline/wikilink\"><<lingo Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab": {
"title": "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab",
"caption": "{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": {
"title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab",
"caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/EditorToolbar": {
"title": "$:/core/ui/ControlPanel/Settings/EditorToolbar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/TextEditor/EnableToolbar\"><<lingo Description>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/InfoPanelMode": {
"title": "$:/core/ui/ControlPanel/Settings/InfoPanelMode",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n<$link to=\"$:/config/TiddlerInfo/Mode\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\"> <<lingo Popup/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\"> <<lingo Sticky/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/LinkToBehaviour": {
"title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n <option value=\"above\"><<lingo \"OpenAbove\">></option>\n <option value=\"below\"><<lingo \"OpenBelow\">></option>\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/MissingLinks": {
"title": "$:/core/ui/ControlPanel/Settings/MissingLinks",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/MissingLinks\"><<lingo Description>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationAddressBar": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationHistory": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationHistory",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"><<lingo CopyToClipboard/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"><<lingo UpdateAddressBar/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation": {
"title": "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Performance/Instrumentation\"><<lingo Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/TitleLinks": {
"title": "$:/core/ui/ControlPanel/Settings/TitleLinks",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtons": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/StoryView": {
"title": "$:/core/ui/ControlPanel/StoryView",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
"text": "{{$:/snippets/viewswitcher}}\n"
},
"$:/core/ui/ControlPanel/Stylesheets": {
"title": "$:/core/ui/ControlPanel/Stylesheets",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/Stylesheets/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\n"
},
"$:/core/ui/ControlPanel/Theme": {
"title": "$:/core/ui/ControlPanel/Theme",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Theme/Caption}}",
"text": "{{$:/snippets/themeswitcher}}\n"
},
"$:/core/ui/ControlPanel/TiddlerFields": {
"title": "$:/core/ui/ControlPanel/TiddlerFields",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
},
"$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>"
},
"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate",
"text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span> <$transclude field=\"caption\"/> -- <i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n"
},
"$:/core/ui/ControlPanel/Toolbars/EditorToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditorToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ItemTemplate": {
"title": "$:/core/ui/ControlPanel/Toolbars/ItemTemplate",
"text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"> <$transclude field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude field=\"description\"/></i></span>\n</$draggable>\n"
},
"$:/core/ui/ControlPanel/Toolbars/PageControls": {
"title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/PageControlButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars": {
"title": "$:/core/ui/ControlPanel/Toolbars",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
"text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" \"$:/state/tabs/controlpanel/toolbars\" \"tc-vertical\">>\n</div>\n"
},
"$:/ControlPanel": {
"title": "$:/ControlPanel",
"icon": "$:/core/images/options-button",
"color": "#bbb",
"text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Info\">>\n</div>\n"
},
"$:/core/ui/DefaultSearchResultList": {
"title": "$:/core/ui/DefaultSearchResultList",
"tags": "$:/tags/SearchResults",
"caption": "{{$:/language/Search/DefaultResults/Caption}}",
"text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n\\end\n<<searchResultList>>\n"
},
"$:/core/ui/EditTemplate/body/preview/diffs-current": {
"title": "$:/core/ui/EditTemplate/body/preview/diffs-current",
"tags": "$:/tags/EditPreview",
"caption": "differences from current",
"list-after": "$:/core/ui/EditTemplate/body/preview/output",
"text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
},
"$:/core/ui/EditTemplate/body/preview/diffs-shadow": {
"title": "$:/core/ui/EditTemplate/body/preview/diffs-shadow",
"tags": "$:/tags/EditPreview",
"caption": "differences from shadow (if any)",
"list-after": "$:/core/ui/EditTemplate/body/preview/output",
"text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
},
"$:/core/ui/EditTemplate/body/preview/output": {
"title": "$:/core/ui/EditTemplate/body/preview/output",
"tags": "$:/tags/EditPreview",
"caption": "{{$:/language/EditTemplate/Body/Preview/Type/Output}}",
"text": "<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n"
},
"$:/state/showeditpreview": {
"title": "$:/state/showeditpreview",
"text": "no"
},
"$:/core/ui/EditTemplate/body/editor": {
"title": "$:/core/ui/EditTemplate/body/editor",
"text": "<$edit\n\n field=\"text\"\n class=\"tc-edit-texteditor\"\n placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n tabindex={{$:/config/EditTabIndex}}\n\n><$set\n\n name=\"targetTiddler\"\n value=<<currentTiddler>>\n\n><$list\n\n filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n type=\"nomatch\"\n state=<<config-visibility-title>>\n text=\"hide\"\n class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n"
},
"$:/core/ui/EditTemplate/body/toolbar/button": {
"title": "$:/core/ui/EditTemplate/body/toolbar/button",
"text": "\\define toolbar-button-icon()\n<$list\n\n filter=\"[all[current]!has[custom-icon]]\"\n variable=\"no-custom-icon\"\n\n><$transclude\n\n tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n filter={{!!condition}}\n variable=\"list-condition\"\n\n><$wikify\n\n name=\"tooltip-text\"\n text=<<toolbar-button-tooltip>>\n mode=\"inline\"\n output=\"text\"\n\n><$list\n\n filter=\"[all[current]!has[dropdown]]\"\n variable=\"no-dropdown\"\n\n><$button\n\n class=\"tc-btn-invisible $(buttonClasses)$\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button></$list><$list\n\n filter=\"[all[current]has[dropdown]]\"\n variable=\"dropdown\"\n\n><$set\n\n name=\"dropdown-state\"\n value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$button\n\n popup=<<dropdown-state>>\n class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n selectedClass=\"tc-selected\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button><$reveal\n\n state=<<dropdown-state>>\n type=\"popup\"\n position=\"below\"\n animate=\"yes\"\n tag=\"span\"\n\n><div\n\n class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n tiddler={{!!dropdown}}\n mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n name=\"buttonClasses\"\n value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>"
},
"$:/core/ui/EditTemplate/body": {
"title": "$:/core/ui/EditTemplate/body",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabIndex}}></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/EditTemplate/controls": {
"title": "$:/core/ui/EditTemplate/controls",
"tags": "$:/tags/EditTemplate",
"text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
},
"$:/core/ui/EditTemplate/fields": {
"title": "$:/core/ui/EditTemplate/fields",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define new-field()\n<$vars name={{$:/temp/newfieldname}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{$:/temp/newfieldvalue}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldname\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldvalue\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\\whitespace trim\n\n<div class=\"tc-edit-fields\">\n<table class=\"tc-edit-fields\">\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}}/>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit\">\n<<lingo Fields/Add/Prompt>> \n</em>\n<span class=\"tc-edit-field-add-name\">\n<$edit-text tiddler=\"$:/temp/newfieldname\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}}/>\n</span> \n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> \n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=\"$:/temp/newfieldname\">\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title{$:/temp/newfieldname}sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title{$:/temp/newfieldname}sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n<span class=\"tc-edit-field-add-value\">\n<$edit-text tiddler=\"$:/temp/newfieldvalue\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabIndex}}/>\n</span> \n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</div>\n</$fieldmangler>\n"
},
"$:/core/ui/EditTemplate/shadow": {
"title": "$:/core/ui/EditTemplate/shadow",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>"
},
"$:/core/ui/EditTemplate/tags": {
"title": "$:/core/ui/EditTemplate/tags",
"tags": "$:/tags/EditTemplate",
"text": "\\whitespace trim\n\n\\define lingo-base() $:/language/EditTemplate/\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon)\n\\whitespace trim\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<span style=<<tag-styles>> class=\"tc-tag-label tc-tag-list-item\">\n<$transclude tiddler=\"\"\"$icon$\"\"\"/> <$view field=\"title\" format=\"text\" />\n<$button message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon)\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\"/>\n\\end\n\n\\define tag-picker-actions()\n<$action-listops\n\t$tiddler=<<currentTiddler>>\n\t$field=\"tags\"\n\t$subfilter=\"[<tag>] [all[current]tags[]]\"\n/>\n\\end\n\n<div class=\"tc-edit-tags\">\n<$fieldmangler>\n<$list filter=\"[all[current]tags[]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}}/>\n</$list>\n</$fieldmangler>\n<$set name=\"tabIndex\" value={{$:/config/EditTabIndex}}>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</$set>\n</div>\n"
},
"$:/core/ui/EditTemplate/title": {
"title": "$:/core/ui/EditTemplate/title",
"tags": "$:/tags/EditTemplate",
"text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus=\"true\" tabindex={{$:/config/EditTabIndex}}/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"
},
"$:/core/ui/EditTemplate/type": {
"title": "$:/core/ui/EditTemplate/type",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n<div class=\"tc-type-selector\"><$fieldmangler>\n<em class=\"tc-edit\"><<lingo Type/Prompt>></em> <$edit-text field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}}/> <$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]\"><$link to={{!!name}}><$view field=\"description\"/> (<$view field=\"name\"/>)</$link>\n</$list>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n"
},
"$:/core/ui/EditTemplate": {
"title": "$:/core/ui/EditTemplate",
"text": "\\define actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{$:/temp/NewTagName}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/NewTagName\"/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{$:/temp/newfieldname}} $value={{$:/temp/newfieldvalue}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldname\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldvalue\"/>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n\\define frame-classes()\ntc-tiddler-frame tc-tiddler-edit-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$\n\\end\n<div class=<<frame-classes>> data-tiddler-title=<<currentTiddler>>>\n<$fieldmangler>\n<$set name=\"storyTiddler\" value=<<currentTiddler>>>\n<$keyboard key=\"((cancel-edit-tiddler))\" message=\"tm-cancel-tiddler\">\n<$keyboard key=\"((save-tiddler))\" actions=<<actions>>>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>>/>\n</$set>\n</$list>\n</$keyboard>\n</$keyboard>\n</$set>\n</$fieldmangler>\n</div>\n"
},
"$:/core/ui/Buttons/cancel": {
"title": "$:/core/ui/Buttons/cancel",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
"description": "{{$:/language/Buttons/Cancel/Hint}}",
"text": "<$button message=\"tm-cancel-tiddler\" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/delete": {
"title": "$:/core/ui/Buttons/delete",
"tags": "$:/tags/EditToolbar $:/tags/ViewToolbar",
"caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
"description": "{{$:/language/Buttons/Delete/Hint}}",
"text": "<$button message=\"tm-delete-tiddler\" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save": {
"title": "$:/core/ui/Buttons/save",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
"description": "{{$:/language/Buttons/Save/Hint}}",
"text": "<$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param={{$:/temp/NewTagName}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/NewTagName\"/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{$:/temp/newfieldname}} $value={{$:/temp/newfieldvalue}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldname\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldvalue\"/>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button></$fieldmangler>\n"
},
"$:/core/ui/EditorToolbar/bold": {
"title": "$:/core/ui/EditorToolbar/bold",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/bold",
"caption": "{{$:/language/Buttons/Bold/Caption}}",
"description": "{{$:/language/Buttons/Bold/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((bold))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n/>\n"
},
"$:/core/ui/EditorToolbar/clear-dropdown": {
"title": "$:/core/ui/EditorToolbar/clear-dropdown",
"text": "''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n"
},
"$:/core/ui/EditorToolbar/clear": {
"title": "$:/core/ui/EditorToolbar/clear",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/erase",
"caption": "{{$:/language/Buttons/Clear/Caption}}",
"description": "{{$:/language/Buttons/Clear/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/clear-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/editor-height-dropdown": {
"title": "$:/core/ui/EditorToolbar/editor-height-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n"
},
"$:/core/ui/EditorToolbar/editor-height": {
"title": "$:/core/ui/EditorToolbar/editor-height",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/fixed-height",
"custom-icon": "yes",
"caption": "{{$:/language/Buttons/EditorHeight/Caption}}",
"description": "{{$:/language/Buttons/EditorHeight/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] +[first[]]",
"dropdown": "$:/core/ui/EditorToolbar/editor-height-dropdown",
"text": "<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n"
},
"$:/core/ui/EditorToolbar/excise-dropdown": {
"title": "$:/core/ui/EditorToolbar/excise-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>> <$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\"> <<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>> <$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n"
},
"$:/core/ui/EditorToolbar/excise": {
"title": "$:/core/ui/EditorToolbar/excise",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/excise",
"caption": "{{$:/language/Buttons/Excise/Caption}}",
"description": "{{$:/language/Buttons/Excise/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]",
"shortcuts": "((excise))",
"dropdown": "$:/core/ui/EditorToolbar/excise-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/heading-1": {
"title": "$:/core/ui/EditorToolbar/heading-1",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-1",
"caption": "{{$:/language/Buttons/Heading1/Caption}}",
"description": "{{$:/language/Buttons/Heading1/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((heading-1))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-2": {
"title": "$:/core/ui/EditorToolbar/heading-2",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-2",
"caption": "{{$:/language/Buttons/Heading2/Caption}}",
"description": "{{$:/language/Buttons/Heading2/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-2))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-3": {
"title": "$:/core/ui/EditorToolbar/heading-3",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-3",
"caption": "{{$:/language/Buttons/Heading3/Caption}}",
"description": "{{$:/language/Buttons/Heading3/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-3))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/core/ui/EditorToolbar/heading-4",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-4",
"caption": "{{$:/language/Buttons/Heading4/Caption}}",
"description": "{{$:/language/Buttons/Heading4/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-4))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/core/ui/EditorToolbar/heading-5",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-5",
"caption": "{{$:/language/Buttons/Heading5/Caption}}",
"description": "{{$:/language/Buttons/Heading5/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-5))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/core/ui/EditorToolbar/heading-6",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-6",
"caption": "{{$:/language/Buttons/Heading6/Caption}}",
"description": "{{$:/language/Buttons/Heading6/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-6))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n"
},
"$:/core/ui/EditorToolbar/italic": {
"title": "$:/core/ui/EditorToolbar/italic",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/italic",
"caption": "{{$:/language/Buttons/Italic/Caption}}",
"description": "{{$:/language/Buttons/Italic/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((italic))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n/>\n"
},
"$:/core/ui/EditorToolbar/line-width-dropdown": {
"title": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n"
},
"$:/core/ui/EditorToolbar/line-width": {
"title": "$:/core/ui/EditorToolbar/line-width",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/line-width",
"caption": "{{$:/language/Buttons/LineWidth/Caption}}",
"description": "{{$:/language/Buttons/LineWidth/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>"
},
"$:/core/ui/EditorToolbar/link-dropdown": {
"title": "$:/core/ui/EditorToolbar/link-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $tiddler=<<dropdown-state>> />\n<$action-deletetiddler $tiddler=<<searchTiddler>> />\n<$action-deletetiddler $tiddler=<<linkTiddler>> />\n\\end\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" >\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"ENTER\" actions=<<add-link-actions>>>\n<$edit-text tiddler=<<searchTiddler>> type=\"search\" tag=\"input\" focus=\"true\" placeholder={{$:/language/Search/Search}} default=\"\"/>\n<$reveal tag=\"span\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<$action-setfield $tiddler=<<searchTiddler>> text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$keyboard>\n</$vars>\n\n<$reveal tag=\"div\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>"
},
"$:/core/ui/EditorToolbar/link": {
"title": "$:/core/ui/EditorToolbar/link",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/link",
"caption": "{{$:/language/Buttons/Link/Caption}}",
"description": "{{$:/language/Buttons/Link/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((link))",
"dropdown": "$:/core/ui/EditorToolbar/link-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/linkify": {
"title": "$:/core/ui/EditorToolbar/linkify",
"caption": "{{$:/language/Buttons/Linkify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Buttons/Linkify/Hint}}",
"icon": "$:/core/images/linkify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"shortcuts": "((linkify))",
"tags": "$:/tags/EditorToolbar",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n/>\n"
},
"$:/core/ui/EditorToolbar/list-bullet": {
"title": "$:/core/ui/EditorToolbar/list-bullet",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-bullet",
"caption": "{{$:/language/Buttons/ListBullet/Caption}}",
"description": "{{$:/language/Buttons/ListBullet/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((list-bullet))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/list-number": {
"title": "$:/core/ui/EditorToolbar/list-number",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-number",
"caption": "{{$:/language/Buttons/ListNumber/Caption}}",
"description": "{{$:/language/Buttons/ListNumber/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((list-number))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/mono-block": {
"title": "$:/core/ui/EditorToolbar/mono-block",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-block",
"caption": "{{$:/language/Buttons/MonoBlock/Caption}}",
"description": "{{$:/language/Buttons/MonoBlock/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((mono-block))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n"
},
"$:/core/ui/EditorToolbar/mono-line": {
"title": "$:/core/ui/EditorToolbar/mono-line",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-line",
"caption": "{{$:/language/Buttons/MonoLine/Caption}}",
"description": "{{$:/language/Buttons/MonoLine/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((mono-line))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
},
"$:/core/ui/EditorToolbar/more-dropdown": {
"title": "$:/core/ui/EditorToolbar/more-dropdown",
"text": "\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/> <$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n"
},
"$:/core/ui/EditorToolbar/more": {
"title": "$:/core/ui/EditorToolbar/more",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/down-arrow",
"caption": "{{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"condition": "[<targetTiddler>]",
"dropdown": "$:/core/ui/EditorToolbar/more-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/opacity-dropdown": {
"title": "$:/core/ui/EditorToolbar/opacity-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/EditorToolbar/opacity": {
"title": "$:/core/ui/EditorToolbar/opacity",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/opacity",
"caption": "{{$:/language/Buttons/Opacity/Caption}}",
"description": "{{$:/language/Buttons/Opacity/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/opacity-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/Opacity}}/>\n"
},
"$:/core/ui/EditorToolbar/paint-dropdown": {
"title": "$:/core/ui/EditorToolbar/paint-dropdown",
"text": "''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
},
"$:/core/ui/EditorToolbar/paint": {
"title": "$:/core/ui/EditorToolbar/paint",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/paint",
"caption": "{{$:/language/Buttons/Paint/Caption}}",
"description": "{{$:/language/Buttons/Paint/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/paint-dropdown",
"text": "\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n"
},
"$:/core/ui/EditorToolbar/picture-dropdown": {
"title": "$:/core/ui/EditorToolbar/picture-dropdown",
"text": "\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
},
"$:/core/ui/EditorToolbar/picture": {
"title": "$:/core/ui/EditorToolbar/picture",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/picture",
"caption": "{{$:/language/Buttons/Picture/Caption}}",
"description": "{{$:/language/Buttons/Picture/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((picture))",
"dropdown": "$:/core/ui/EditorToolbar/picture-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/preview-type-dropdown": {
"title": "$:/core/ui/EditorToolbar/preview-type-dropdown",
"text": "\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n"
},
"$:/core/ui/EditorToolbar/preview-type": {
"title": "$:/core/ui/EditorToolbar/preview-type",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/chevron-down",
"caption": "{{$:/language/Buttons/PreviewType/Caption}}",
"description": "{{$:/language/Buttons/PreviewType/Hint}}",
"condition": "[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]",
"button-classes": "tc-text-editor-toolbar-item-adjunct",
"dropdown": "$:/core/ui/EditorToolbar/preview-type-dropdown"
},
"$:/core/ui/EditorToolbar/preview": {
"title": "$:/core/ui/EditorToolbar/preview",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/preview-open",
"custom-icon": "yes",
"caption": "{{$:/language/Buttons/Preview/Caption}}",
"description": "{{$:/language/Buttons/Preview/Hint}}",
"condition": "[<targetTiddler>]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((preview))",
"text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n"
},
"$:/core/ui/EditorToolbar/quote": {
"title": "$:/core/ui/EditorToolbar/quote",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/quote",
"caption": "{{$:/language/Buttons/Quote/Caption}}",
"description": "{{$:/language/Buttons/Quote/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((quote))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n"
},
"$:/core/ui/EditorToolbar/rotate-left": {
"title": "$:/core/ui/EditorToolbar/rotate-left",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/rotate-left",
"caption": "{{$:/language/Buttons/RotateLeft/Caption}}",
"description": "{{$:/language/Buttons/RotateLeft/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n"
},
"$:/core/ui/EditorToolbar/size-dropdown": {
"title": "$:/core/ui/EditorToolbar/size-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> × <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/> <<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/> <$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n"
},
"$:/core/ui/EditorToolbar/size": {
"title": "$:/core/ui/EditorToolbar/size",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/size",
"caption": "{{$:/language/Buttons/Size/Caption}}",
"description": "{{$:/language/Buttons/Size/Hint}}",
"condition": "[<targetTiddler>is[image]]",
"dropdown": "$:/core/ui/EditorToolbar/size-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/stamp-dropdown": {
"title": "$:/core/ui/EditorToolbar/stamp-dropdown",
"text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n</$list>\n\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}\nsuffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$view tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<snippetTitle>> field=\"title\" mode=\"inline\"/>\n\n</$view>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n"
},
"$:/core/ui/EditorToolbar/stamp": {
"title": "$:/core/ui/EditorToolbar/stamp",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/stamp",
"caption": "{{$:/language/Buttons/Stamp/Caption}}",
"description": "{{$:/language/Buttons/Stamp/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] +[first[]]",
"shortcuts": "((stamp))",
"dropdown": "$:/core/ui/EditorToolbar/stamp-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/strikethrough": {
"title": "$:/core/ui/EditorToolbar/strikethrough",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/strikethrough",
"caption": "{{$:/language/Buttons/Strikethrough/Caption}}",
"description": "{{$:/language/Buttons/Strikethrough/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((strikethrough))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n/>\n"
},
"$:/core/ui/EditorToolbar/subscript": {
"title": "$:/core/ui/EditorToolbar/subscript",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/subscript",
"caption": "{{$:/language/Buttons/Subscript/Caption}}",
"description": "{{$:/language/Buttons/Subscript/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((subscript))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n/>\n"
},
"$:/core/ui/EditorToolbar/superscript": {
"title": "$:/core/ui/EditorToolbar/superscript",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/superscript",
"caption": "{{$:/language/Buttons/Superscript/Caption}}",
"description": "{{$:/language/Buttons/Superscript/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((superscript))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n/>\n"
},
"$:/core/ui/EditorToolbar/transcludify": {
"title": "$:/core/ui/EditorToolbar/transcludify",
"caption": "{{$:/language/Buttons/Transcludify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Buttons/Transcludify/Hint}}",
"icon": "$:/core/images/transcludify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"shortcuts": "((transcludify))",
"tags": "$:/tags/EditorToolbar",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n/>\n"
},
"$:/core/ui/EditorToolbar/underline": {
"title": "$:/core/ui/EditorToolbar/underline",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/underline",
"caption": "{{$:/language/Buttons/Underline/Caption}}",
"description": "{{$:/language/Buttons/Underline/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((underline))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n/>\n"
},
"$:/core/Filters/AllTags": {
"title": "$:/core/Filters/AllTags",
"tags": "$:/tags/Filter",
"filter": "[tags[]!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTags}}",
"text": ""
},
"$:/core/Filters/AllTiddlers": {
"title": "$:/core/Filters/AllTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTiddlers}}",
"text": ""
},
"$:/core/Filters/Drafts": {
"title": "$:/core/Filters/Drafts",
"tags": "$:/tags/Filter",
"filter": "[has[draft.of]sort[title]]",
"description": "{{$:/language/Filters/Drafts}}",
"text": ""
},
"$:/core/Filters/Missing": {
"title": "$:/core/Filters/Missing",
"tags": "$:/tags/Filter",
"filter": "[all[missing]sort[title]]",
"description": "{{$:/language/Filters/Missing}}",
"text": ""
},
"$:/core/Filters/Orphans": {
"title": "$:/core/Filters/Orphans",
"tags": "$:/tags/Filter",
"filter": "[all[orphans]sort[title]]",
"description": "{{$:/language/Filters/Orphans}}",
"text": ""
},
"$:/core/Filters/OverriddenShadowTiddlers": {
"title": "$:/core/Filters/OverriddenShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[shadow]]",
"description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentSystemTiddlers": {
"title": "$:/core/Filters/RecentSystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentSystemTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentTiddlers": {
"title": "$:/core/Filters/RecentTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentTiddlers}}",
"text": ""
},
"$:/core/Filters/SessionTiddlers": {
"title": "$:/core/Filters/SessionTiddlers",
"tags": "$:/tags/Filter",
"filter": "[haschanged[]]",
"description": "{{$:/language/Filters/SessionTiddlers}}",
"text": ""
},
"$:/core/Filters/ShadowTiddlers": {
"title": "$:/core/Filters/ShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[all[shadows]sort[title]]",
"description": "{{$:/language/Filters/ShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/StoryList": {
"title": "$:/core/Filters/StoryList",
"tags": "$:/tags/Filter",
"filter": "[list[$:/StoryList]] -$:/AdvancedSearch",
"description": "{{$:/language/Filters/StoryList}}",
"text": ""
},
"$:/core/Filters/SystemTags": {
"title": "$:/core/Filters/SystemTags",
"tags": "$:/tags/Filter",
"filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTags}}",
"text": ""
},
"$:/core/Filters/SystemTiddlers": {
"title": "$:/core/Filters/SystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTiddlers}}",
"text": ""
},
"$:/core/Filters/TypedTiddlers": {
"title": "$:/core/Filters/TypedTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Filters/TypedTiddlers}}",
"text": ""
},
"$:/core/ui/ImportListing": {
"title": "$:/core/ui/ImportListing",
"text": "\\define lingo-base() $:/language/Import/\n\n\\define messageField()\nmessage-$(payloadTiddler)$\n\\end\n\n\\define selectionField()\nselection-$(payloadTiddler)$\n\\end\n\n\\define previewPopupState()\n$(currentTiddler)$!!popup-$(payloadTiddler)$\n\\end\n\n\\define select-all-actions()\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n<table>\n<tbody>\n<tr>\n<th>\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n<<lingo Listing/Select/Caption>>\n</$checkbox>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\"/>\n</td>\n<td>\n<$reveal type=\"nomatch\" stateTitle=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" setTitle=<<previewPopupState>> setTo=\"yes\">\n{{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" setTitle=<<previewPopupState>> setTo=\"no\">\n{{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n</td>\n</tr>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" stateTitle=<<previewPopupState>> tag=\"div\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n<$transclude tiddler={{$:/state/importpreviewtype}}/>\n</$list>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ImportPreviews/Diff": {
"title": "$:/core/ui/ImportPreviews/Diff",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Diff}}",
"text": "<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n"
},
"$:/core/ui/ImportPreviews/DiffFields": {
"title": "$:/core/ui/ImportPreviews/DiffFields",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/DiffFields}}",
"text": "<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n"
},
"$:/core/ui/ImportPreviews/Fields": {
"title": "$:/core/ui/ImportPreviews/Fields",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Fields}}",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ImportPreviews/Text": {
"title": "$:/core/ui/ImportPreviews/Text",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Text}}",
"text": "<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n"
},
"$:/core/ui/ImportPreviews/TextRaw": {
"title": "$:/core/ui/ImportPreviews/TextRaw",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/TextRaw}}",
"text": "<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>"
},
"$:/core/ui/KeyboardShortcuts/advanced-search": {
"title": "$:/core/ui/KeyboardShortcuts/advanced-search",
"tags": "$:/tags/KeyboardShortcut",
"key": "((advanced-search))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\"/>\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-image": {
"title": "$:/core/ui/KeyboardShortcuts/new-image",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-image))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-journal": {
"title": "$:/core/ui/KeyboardShortcuts/new-journal",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-journal))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-tiddler": {
"title": "$:/core/ui/KeyboardShortcuts/new-tiddler",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-tiddler))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/sidebar-search": {
"title": "$:/core/ui/KeyboardShortcuts/sidebar-search",
"tags": "$:/tags/KeyboardShortcut",
"key": "((sidebar-search))",
"text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n"
},
"$:/core/ui/KeyboardShortcut/toggle-sidebar": {
"title": "$:/core/ui/KeyboardShortcut/toggle-sidebar",
"tags": "$:/tags/KeyboardShortcut",
"key": "((toggle-sidebar))",
"text": "<$list filter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/>\n\"\"\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"
},
"$:/core/ui/ListItemTemplate": {
"title": "$:/core/ui/ListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</div>"
},
"$:/Manager/ItemMain/Fields": {
"title": "$:/Manager/ItemMain/Fields",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/Fields}}",
"text": "<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/Manager/ItemMain/RawText": {
"title": "$:/Manager/ItemMain/RawText",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/RawText}}",
"text": "<pre><code><$view/></code></pre>\n"
},
"$:/Manager/ItemMain/WikifiedText": {
"title": "$:/Manager/ItemMain/WikifiedText",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/WikifiedText}}",
"text": "<$transclude mode=\"block\"/>\n"
},
"$:/Manager/ItemSidebar/Colour": {
"title": "$:/Manager/ItemSidebar/Colour",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Colour}}",
"text": "\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/> / <$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n"
},
"$:/Manager/ItemSidebar/Icon": {
"title": "$:/Manager/ItemSidebar/Icon",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Icon}}",
"text": "<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall $name=\"image-picker-include-tagged-images\" actions=\"\"\"\n<$action-setfield $field=\"icon\" $value=<<imageTitle>>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/image-picker\">>/>\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n"
},
"$:/Manager/ItemSidebar/Tags": {
"title": "$:/Manager/ItemSidebar/Tags",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Tags}}",
"text": "\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n<$action-listops\n\t$tiddler=<<currentTiddler>>\n\t$field=\"tags\"\n\t$subfilter=\"[<tag>] [all[current]tags[]]\"\n/>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</p>\n"
},
"$:/Manager/ItemSidebar/Tools": {
"title": "$:/Manager/ItemSidebar/Tools",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Tools}}",
"text": "<p>\n<$button to=<<currentTiddler>>>{{$:/core/images/link}} open</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>{{$:/core/images/edit-button}} edit</$button>\n</p>\n"
},
"$:/Manager": {
"title": "$:/Manager",
"icon": "$:/core/images/list",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>> <$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>> <$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>> <$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>> <$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n"
},
"$:/core/ui/MissingTemplate": {
"title": "$:/core/ui/MissingTemplate",
"text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
},
"$:/core/ui/MoreSideBar/All": {
"title": "$:/core/ui/MoreSideBar/All",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/All/Caption}}",
"text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Drafts": {
"title": "$:/core/ui/MoreSideBar/Drafts",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Drafts/Caption}}",
"text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Explorer": {
"title": "$:/core/ui/MoreSideBar/Explorer",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Explorer/Caption}}",
"text": "<<tree \"$:/\">>\n"
},
"$:/core/ui/MoreSideBar/Missing": {
"title": "$:/core/ui/MoreSideBar/Missing",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Missing/Caption}}",
"text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Orphans": {
"title": "$:/core/ui/MoreSideBar/Orphans",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Orphans/Caption}}",
"text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Plugins": {
"title": "$:/core/ui/MoreSideBar/Plugins",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" \"$:/core/ui/MoreSideBar/Plugins/Plugins\">>\n"
},
"$:/core/ui/MoreSideBar/Recent": {
"title": "$:/core/ui/MoreSideBar/Recent",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/MoreSideBar/Shadows": {
"title": "$:/core/ui/MoreSideBar/Shadows",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Shadows/Caption}}",
"text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/System": {
"title": "$:/core/ui/MoreSideBar/System",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/System/Caption}}",
"text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Tags": {
"title": "$:/core/ui/MoreSideBar/Tags",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Tags/Caption}}",
"text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\n"
},
"$:/core/ui/MoreSideBar/Types": {
"title": "$:/core/ui/MoreSideBar/Types",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Types/Caption}}",
"text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Languages": {
"title": "$:/core/ui/MoreSideBar/Plugins/Languages",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[language]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Plugins": {
"title": "$:/core/ui/MoreSideBar/Plugins/Plugins",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Theme": {
"title": "$:/core/ui/MoreSideBar/Plugins/Theme",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[theme]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
},
"$:/core/ui/Buttons/advanced-search": {
"title": "$:/core/ui/Buttons/advanced-search",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
"description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
"text": "\\define control-panel-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/close-all": {
"title": "$:/core/ui/Buttons/close-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
"description": "{{$:/language/Buttons/CloseAll/Hint}}",
"text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/control-panel": {
"title": "$:/core/ui/Buttons/control-panel",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
"description": "{{$:/language/Buttons/ControlPanel/Hint}}",
"text": "\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/encryption": {
"title": "$:/core/ui/Buttons/encryption",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
"description": "{{$:/language/Buttons/Encryption/Hint}}",
"text": "<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>"
},
"$:/core/ui/Buttons/export-page": {
"title": "$:/core/ui/Buttons/export-page",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
"description": "{{$:/language/Buttons/ExportPage/Hint}}",
"text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
},
"$:/core/ui/Buttons/fold-all": {
"title": "$:/core/ui/Buttons/fold-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}",
"description": "{{$:/language/Buttons/FoldAll/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/full-screen": {
"title": "$:/core/ui/Buttons/full-screen",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
"description": "{{$:/language/Buttons/FullScreen/Hint}}",
"text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/home": {
"title": "$:/core/ui/Buttons/home",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
"description": "{{$:/language/Buttons/Home/Hint}}",
"text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/import": {
"title": "$:/core/ui/Buttons/import",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
"description": "{{$:/language/Buttons/Import/Hint}}",
"text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
},
"$:/core/ui/Buttons/language": {
"title": "$:/core/ui/Buttons/language",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
"description": "{{$:/language/Buttons/Language/Hint}}",
"text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/manager": {
"title": "$:/core/ui/Buttons/manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}",
"description": "{{$:/language/Buttons/Manager/Hint}}",
"text": "\\define manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/list}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Manager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/more-page-actions": {
"title": "$:/core/ui/Buttons/more-page-actions",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-image": {
"title": "$:/core/ui/Buttons/new-image",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}",
"description": "{{$:/language/Buttons/NewImage/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-image-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/new-journal": {
"title": "$:/core/ui/Buttons/new-journal",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
"description": "{{$:/language/Buttons/NewJournal/Hint}}",
"text": "\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<journalButton>>\n"
},
"$:/core/ui/Buttons/new-tiddler": {
"title": "$:/core/ui/Buttons/new-tiddler",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
"description": "{{$:/language/Buttons/NewTiddler/Hint}}",
"text": "<$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/palette": {
"title": "$:/core/ui/Buttons/palette",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}",
"description": "{{$:/language/Buttons/Palette/Hint}}",
"text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/print": {
"title": "$:/core/ui/Buttons/print",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}",
"description": "{{$:/language/Buttons/Print/Hint}}",
"text": "<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/print-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Print/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/refresh": {
"title": "$:/core/ui/Buttons/refresh",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
"description": "{{$:/language/Buttons/Refresh/Hint}}",
"text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save-wiki": {
"title": "$:/core/ui/Buttons/save-wiki",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
"description": "{{$:/language/Buttons/SaveWiki/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
},
"$:/core/ui/Buttons/storyview": {
"title": "$:/core/ui/Buttons/storyview",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
"description": "{{$:/language/Buttons/StoryView/Hint}}",
"text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/tag-manager": {
"title": "$:/core/ui/Buttons/tag-manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
"description": "{{$:/language/Buttons/TagManager/Hint}}",
"text": "\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/theme": {
"title": "$:/core/ui/Buttons/theme",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
"description": "{{$:/language/Buttons/Theme/Hint}}",
"text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>"
},
"$:/core/ui/Buttons/timestamp": {
"title": "$:/core/ui/Buttons/timestamp",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}",
"description": "{{$:/language/Buttons/Timestamp/Hint}}",
"text": "<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-on}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-off}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>"
},
"$:/core/ui/Buttons/unfold-all": {
"title": "$:/core/ui/Buttons/unfold-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}",
"description": "{{$:/language/Buttons/UnfoldAll/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/PageTemplate/pagecontrols": {
"title": "$:/core/ui/PageTemplate/pagecontrols",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n</div>\n"
},
"$:/core/ui/PageStylesheet": {
"title": "$:/core/ui/PageStylesheet",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/PageTemplate/alerts": {
"title": "$:/core/ui/PageTemplate/alerts",
"tags": "$:/tags/PageTemplate",
"text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
},
"$:/core/ui/PageTemplate/drafts": {
"title": "$:/core/ui/PageTemplate/drafts",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/PageTemplate/pluginreloadwarning": {
"title": "$:/core/ui/PageTemplate/pluginreloadwarning",
"tags": "$:/tags/PageTemplate",
"text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[has[plugin-type]haschanged[]!plugin-type[import]limit[1]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/PageTemplate/sidebar": {
"title": "$:/core/ui/PageTemplate/sidebar",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\" tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"
},
"$:/core/ui/PageTemplate/story": {
"title": "$:/core/ui/PageTemplate/story",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
},
"$:/core/ui/PageTemplate/topleftbar": {
"title": "$:/core/ui/PageTemplate/topleftbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate/toprightbar": {
"title": "$:/core/ui/PageTemplate/toprightbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate": {
"title": "$:/core/ui/PageTemplate",
"text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value={{$:/config/Toolbar/ButtonClass}}>\n\n<$set name=\"tv-show-missing-links\" value={{$:/config/MissingLinks}}>\n\n<$set name=\"storyviewTitle\" value={{$:/view}}>\n\n<$set name=\"languageTitle\" value={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/PaletteManager": {
"title": "$:/PaletteManager",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}} <$text text=<<newColourName>>/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}} <$text text=<<newColourName>>/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip=<<lingo Delete/Hint>> aria-label=<<lingo Delete/Hint>> class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" variable=\"colourName\">\n<$list filter=\"[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]\" variable=\"ignore\">\n<<palette-manager-colour-row>>\n</$list>\n\"\"\">\n<<palette-manager-colour-row>>\n</$list>\n</$list>\n</tbody>\n</table>\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"> <<lingo Names/External/Show>></$checkbox>\n\n<<palette-manager-table>>\n"
},
"$:/core/ui/PluginInfo": {
"title": "$:/core/ui/PluginInfo",
"text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n"
},
"$:/core/ui/PluginInfo/Default/contents": {
"title": "$:/core/ui/PluginInfo/Default/contents",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n"
},
"$:/core/ui/PluginListItemTemplate": {
"title": "$:/core/ui/PluginListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}>\n<$view field=\"description\">\n<$view field=\"title\"/>\n</$view>\n</$link>\n</div>"
},
"$:/core/ui/SearchResults": {
"title": "$:/core/ui/SearchResults",
"text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n\n</$list>\n\n</div>\n"
},
"$:/core/ui/SideBar/More": {
"title": "$:/core/ui/SideBar/More",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/More/Caption}}",
"text": "<div class=\"tc-more-sidebar\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class=\"tc-vertical\" />\n</div>"
},
"$:/core/ui/SideBar/Open": {
"title": "$:/core/ui/SideBar/Open",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Open/Caption}}",
"text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini\">{{$:/core/images/close-button}}</$button> <$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\n"
},
"$:/core/ui/SideBar/Recent": {
"title": "$:/core/ui/SideBar/Recent",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/SideBar/Tools": {
"title": "$:/core/ui/SideBar/Tools",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/SideBarLists": {
"title": "$:/core/ui/SideBarLists",
"text": "<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n"
},
"$:/core/ui/SideBarSegments/page-controls": {
"title": "$:/core/ui/SideBarSegments/page-controls",
"tags": "$:/tags/SideBarSegment",
"text": "{{||$:/core/ui/PageTemplate/pagecontrols}}\n"
},
"$:/core/ui/SideBarSegments/search": {
"title": "$:/core/ui/SideBarSegments/search",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-popup-handle\"/>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$set name=\"searchTerm\" value={{{ [<searchTiddler>get[text]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search<searchTerm>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$set>\n</$list>\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<$list filter=\"[{$:/temp/search}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n{{$:/core/ui/SearchResults}}\n\n</$list>\n\n</$reveal>\n\n</$reveal>\n\n</$set>\n\n</div>\n"
},
"$:/core/ui/SideBarSegments/site-subtitle": {
"title": "$:/core/ui/SideBarSegments/site-subtitle",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"
},
"$:/core/ui/SideBarSegments/site-title": {
"title": "$:/core/ui/SideBarSegments/site-title",
"tags": "$:/tags/SideBarSegment",
"text": "<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"
},
"$:/core/ui/SideBarSegments/tabs": {
"title": "$:/core/ui/SideBarSegments/tabs",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-sidebar-lists tc-sidebar-tabs\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" />\n\n</div>\n"
},
"$:/TagManager": {
"title": "$:/TagManager",
"icon": "$:/core/images/tag-button",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n<div class=\"tc-drop-down-wrapper\">\n<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define toggleButton(state)\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Count/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td>{{||$:/core/ui/TagTemplate}}</td>\n<td><$count filter=\"[all[current]tagging[]]\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n</tr>\n</$list>\n<tr>\n<td></td>\n<td style=\"position:relative;\">\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n"
},
"$:/core/ui/TagTemplate": {
"title": "$:/core/ui/TagTemplate",
"text": "\\whitespace trim\n<span class=\"tc-tag-list-item\">\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag=\"\"\"$button\"\"\" element-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter='[all[current]tagging[]]' tag='span'\"\"\"/>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n<$transclude tiddler=<<listItem>>/> \n</$list>\n<hr>\n<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n</$reveal>\n</$set>\n</span>\n"
},
"$:/core/ui/TiddlerFieldTemplate": {
"title": "$:/core/ui/TiddlerFieldTemplate",
"text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
},
"$:/core/ui/TiddlerFields": {
"title": "$:/core/ui/TiddlerFields",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
},
"$:/core/ui/TiddlerInfo/Advanced": {
"title": "$:/core/ui/TiddlerInfo/Advanced",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
"text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Fields": {
"title": "$:/core/ui/TiddlerInfo/Fields",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
"text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
},
"$:/core/ui/TiddlerInfo/List": {
"title": "$:/core/ui/TiddlerInfo/List",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/List/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Listed": {
"title": "$:/core/ui/TiddlerInfo/Listed",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/References": {
"title": "$:/core/ui/TiddlerInfo/References",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/References/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>"
},
"$:/core/ui/TiddlerInfo/Tagging": {
"title": "$:/core/ui/TiddlerInfo/Tagging",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Tools": {
"title": "$:/core/ui/TiddlerInfo/Tools",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/TiddlerInfo": {
"title": "$:/core/ui/TiddlerInfo",
"text": "<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>"
},
"$:/core/ui/TopBar/menu": {
"title": "$:/core/ui/TopBar/menu",
"tags": "$:/tags/TopRightBar",
"text": "<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$reveal>\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$reveal>\n"
},
"$:/core/ui/UntaggedTemplate": {
"title": "$:/core/ui/UntaggedTemplate",
"text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/body": {
"title": "$:/core/ui/ViewTemplate/body",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/classic": {
"title": "$:/core/ui/ViewTemplate/classic",
"tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/import": {
"title": "$:/core/ui/ViewTemplate/import",
"tags": "$:/tags/ViewTemplate",
"text": "\\define lingo-base() $:/language/Import/\n\n\\define buttons()\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n<<lingo Listing/Preview>> <$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/plugin": {
"title": "$:/core/ui/ViewTemplate/plugin",
"tags": "$:/tags/ViewTemplate",
"text": "<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n<$set name=\"plugin-type\" value={{!!plugin-type}}>\n<$set name=\"default-popup-state\" value=\"yes\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n{{||$:/core/ui/Components/plugin-info}}\n</$set>\n</$set>\n</$set>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/subtitle": {
"title": "$:/core/ui/ViewTemplate/subtitle",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/tags": {
"title": "$:/core/ui/ViewTemplate/tags",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/title": {
"title": "$:/core/ui/ViewTemplate/title",
"tags": "$:/tags/ViewTemplate",
"text": "\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}/>\n</span>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\n\n</$reveal>\n</div>"
},
"$:/core/ui/ViewTemplate/unfold": {
"title": "$:/core/ui/ViewTemplate/unfold",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" type=\"nomatch\" state=\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\" text=\"hide\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate": {
"title": "$:/core/ui/ViewTemplate",
"text": "\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$vars>\n"
},
"$:/core/ui/Buttons/clone": {
"title": "$:/core/ui/Buttons/clone",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
"description": "{{$:/language/Buttons/Clone/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Clone/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-others": {
"title": "$:/core/ui/Buttons/close-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
"description": "{{$:/language/Buttons/CloseOthers/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close": {
"title": "$:/core/ui/Buttons/close",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
"description": "{{$:/language/Buttons/Close/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Close/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/edit": {
"title": "$:/core/ui/Buttons/edit",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
"description": "{{$:/language/Buttons/Edit/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Edit/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/export-tiddler": {
"title": "$:/core/ui/Buttons/export-tiddler",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
"description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
"text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
},
"$:/core/ui/Buttons/fold-bar": {
"title": "$:/core/ui/Buttons/fold-bar",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}",
"description": "{{$:/language/Buttons/Fold/FoldBar/Hint}}",
"text": "<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->"
},
"$:/core/ui/Buttons/fold-others": {
"title": "$:/core/ui/Buttons/fold-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}",
"description": "{{$:/language/Buttons/FoldOthers/Hint}}",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/fold": {
"title": "$:/core/ui/Buttons/fold",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}",
"description": "{{$:/language/Buttons/Fold/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/info": {
"title": "$:/core/ui/Buttons/info",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
"description": "{{$:/language/Buttons/Info/Hint}}",
"text": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>"
},
"$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/core/ui/Buttons/more-tiddler-actions",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-here": {
"title": "$:/core/ui/Buttons/new-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
"description": "{{$:/language/Buttons/NewHere/Hint}}",
"text": "\\whitespace trim\n\\define newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\define newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>"
},
"$:/core/ui/Buttons/new-journal-here": {
"title": "$:/core/ui/Buttons/new-journal-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
"description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
"text": "\\whitespace trim\n\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n</$list>\n</$wikify>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set>\n</$set>\n</$set>"
},
"$:/core/ui/Buttons/open-window": {
"title": "$:/core/ui/Buttons/open-window",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}",
"description": "{{$:/language/Buttons/OpenWindow/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permalink": {
"title": "$:/core/ui/Buttons/permalink",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
"description": "{{$:/language/Buttons/Permalink/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permaview": {
"title": "$:/core/ui/Buttons/permaview",
"tags": "$:/tags/ViewToolbar $:/tags/PageControls",
"caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
"description": "{{$:/language/Buttons/Permaview/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/DefaultTiddlers": {
"title": "$:/DefaultTiddlers",
"text": "GettingStarted\n"
},
"$:/temp/advancedsearch": {
"title": "$:/temp/advancedsearch",
"text": ""
},
"$:/snippets/allfields": {
"title": "$:/snippets/allfields",
"text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
},
"$:/config/AnimationDuration": {
"title": "$:/config/AnimationDuration",
"text": "400"
},
"$:/config/AutoSave": {
"title": "$:/config/AutoSave",
"text": "yes"
},
"$:/config/BitmapEditor/Colour": {
"title": "$:/config/BitmapEditor/Colour",
"text": "#444"
},
"$:/config/BitmapEditor/ImageSizes": {
"title": "$:/config/BitmapEditor/ImageSizes",
"text": "[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]"
},
"$:/config/BitmapEditor/LineWidth": {
"title": "$:/config/BitmapEditor/LineWidth",
"text": "3px"
},
"$:/config/BitmapEditor/LineWidths": {
"title": "$:/config/BitmapEditor/LineWidths",
"text": "0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px"
},
"$:/config/BitmapEditor/Opacities": {
"title": "$:/config/BitmapEditor/Opacities",
"text": "0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0"
},
"$:/config/BitmapEditor/Opacity": {
"title": "$:/config/BitmapEditor/Opacity",
"text": "1.0"
},
"$:/config/DefaultMoreSidebarTab": {
"title": "$:/config/DefaultMoreSidebarTab",
"text": "$:/core/ui/MoreSideBar/Tags"
},
"$:/config/DefaultSidebarTab": {
"title": "$:/config/DefaultSidebarTab",
"text": "$:/core/ui/SideBar/Open"
},
"$:/config/DownloadSaver/AutoSave": {
"title": "$:/config/DownloadSaver/AutoSave",
"text": "no"
},
"$:/config/Drafts/TypingTimeout": {
"title": "$:/config/Drafts/TypingTimeout",
"text": "400"
},
"$:/config/EditTemplateFields/Visibility/title": {
"title": "$:/config/EditTemplateFields/Visibility/title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/tags": {
"title": "$:/config/EditTemplateFields/Visibility/tags",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/text": {
"title": "$:/config/EditTemplateFields/Visibility/text",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/creator": {
"title": "$:/config/EditTemplateFields/Visibility/creator",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/created": {
"title": "$:/config/EditTemplateFields/Visibility/created",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modified": {
"title": "$:/config/EditTemplateFields/Visibility/modified",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modifier": {
"title": "$:/config/EditTemplateFields/Visibility/modifier",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/type": {
"title": "$:/config/EditTemplateFields/Visibility/type",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.title": {
"title": "$:/config/EditTemplateFields/Visibility/draft.title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.of": {
"title": "$:/config/EditTemplateFields/Visibility/draft.of",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/revision": {
"title": "$:/config/EditTemplateFields/Visibility/revision",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/bag": {
"title": "$:/config/EditTemplateFields/Visibility/bag",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6",
"text": "hide"
},
"$:/config/EditorTypeMappings/image/gif": {
"title": "$:/config/EditorTypeMappings/image/gif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/webp": {
"title": "$:/config/EditorTypeMappings/image/webp",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/heic": {
"title": "$:/config/EditorTypeMappings/image/heic",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/heif": {
"title": "$:/config/EditorTypeMappings/image/heif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpeg": {
"title": "$:/config/EditorTypeMappings/image/jpeg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpg": {
"title": "$:/config/EditorTypeMappings/image/jpg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/png": {
"title": "$:/config/EditorTypeMappings/image/png",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/x-icon": {
"title": "$:/config/EditorTypeMappings/image/x-icon",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "text"
},
"$:/config/Manager/Show": {
"title": "$:/config/Manager/Show",
"text": "tiddlers"
},
"$:/config/Manager/Filter": {
"title": "$:/config/Manager/Filter",
"text": ""
},
"$:/config/Manager/Order": {
"title": "$:/config/Manager/Order",
"text": "forward"
},
"$:/config/Manager/Sort": {
"title": "$:/config/Manager/Sort",
"text": "title"
},
"$:/config/Manager/System": {
"title": "$:/config/Manager/System",
"text": "system"
},
"$:/config/Manager/Tag": {
"title": "$:/config/Manager/Tag",
"text": ""
},
"$:/state/popup/manager/item/$:/Manager/ItemMain/RawText": {
"title": "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText",
"text": "hide"
},
"$:/config/MissingLinks": {
"title": "$:/config/MissingLinks",
"text": "yes"
},
"$:/config/Navigation/UpdateAddressBar": {
"title": "$:/config/Navigation/UpdateAddressBar",
"text": "no"
},
"$:/config/Navigation/UpdateHistory": {
"title": "$:/config/Navigation/UpdateHistory",
"text": "no"
},
"$:/config/NewImageType": {
"title": "$:/config/NewImageType",
"text": "jpeg"
},
"$:/config/OfficialPluginLibrary": {
"title": "$:/config/OfficialPluginLibrary",
"tags": "$:/tags/PluginLibrary",
"url": "https://tiddlywiki.com/library/v5.1.21/index.html",
"caption": "{{$:/language/OfficialPluginLibrary}}",
"text": "{{$:/language/OfficialPluginLibrary/Hint}}\n"
},
"$:/config/Navigation/openLinkFromInsideRiver": {
"title": "$:/config/Navigation/openLinkFromInsideRiver",
"text": "below"
},
"$:/config/Navigation/openLinkFromOutsideRiver": {
"title": "$:/config/Navigation/openLinkFromOutsideRiver",
"text": "top"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all",
"text": "hide"
},
"$:/config/Performance/Instrumentation": {
"title": "$:/config/Performance/Instrumentation",
"text": "no"
},
"$:/config/SaveWikiButton/Template": {
"title": "$:/config/SaveWikiButton/Template",
"text": "$:/core/save/all"
},
"$:/config/SaverFilter": {
"title": "$:/config/SaverFilter",
"text": "[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"
},
"$:/config/Search/AutoFocus": {
"title": "$:/config/Search/AutoFocus",
"text": "true"
},
"$:/config/Search/MinLength": {
"title": "$:/config/Search/MinLength",
"text": "3"
},
"$:/config/SearchResults/Default": {
"title": "$:/config/SearchResults/Default",
"text": "$:/core/ui/DefaultSearchResultList"
},
"$:/config/ShortcutInfo/advanced-search": {
"title": "$:/config/ShortcutInfo/advanced-search",
"text": "{{$:/language/Buttons/AdvancedSearch/Hint}}"
},
"$:/config/ShortcutInfo/bold": {
"title": "$:/config/ShortcutInfo/bold",
"text": "{{$:/language/Buttons/Bold/Hint}}"
},
"$:/config/ShortcutInfo/cancel-edit-tiddler": {
"title": "$:/config/ShortcutInfo/cancel-edit-tiddler",
"text": "{{$:/language/Buttons/Cancel/Hint}}"
},
"$:/config/ShortcutInfo/excise": {
"title": "$:/config/ShortcutInfo/excise",
"text": "{{$:/language/Buttons/Excise/Hint}}"
},
"$:/config/ShortcutInfo/heading-1": {
"title": "$:/config/ShortcutInfo/heading-1",
"text": "{{$:/language/Buttons/Heading1/Hint}}"
},
"$:/config/ShortcutInfo/heading-2": {
"title": "$:/config/ShortcutInfo/heading-2",
"text": "{{$:/language/Buttons/Heading2/Hint}}"
},
"$:/config/ShortcutInfo/heading-3": {
"title": "$:/config/ShortcutInfo/heading-3",
"text": "{{$:/language/Buttons/Heading3/Hint}}"
},
"$:/config/ShortcutInfo/heading-4": {
"title": "$:/config/ShortcutInfo/heading-4",
"text": "{{$:/language/Buttons/Heading4/Hint}}"
},
"$:/config/ShortcutInfo/heading-5": {
"title": "$:/config/ShortcutInfo/heading-5",
"text": "{{$:/language/Buttons/Heading5/Hint}}"
},
"$:/config/ShortcutInfo/heading-6": {
"title": "$:/config/ShortcutInfo/heading-6",
"text": "{{$:/language/Buttons/Heading6/Hint}}"
},
"$:/config/ShortcutInfo/italic": {
"title": "$:/config/ShortcutInfo/italic",
"text": "{{$:/language/Buttons/Italic/Hint}}"
},
"$:/config/ShortcutInfo/link": {
"title": "$:/config/ShortcutInfo/link",
"text": "{{$:/language/Buttons/Link/Hint}}"
},
"$:/config/ShortcutInfo/list-bullet": {
"title": "$:/config/ShortcutInfo/list-bullet",
"text": "{{$:/language/Buttons/ListBullet/Hint}}"
},
"$:/config/ShortcutInfo/list-number": {
"title": "$:/config/ShortcutInfo/list-number",
"text": "{{$:/language/Buttons/ListNumber/Hint}}"
},
"$:/config/ShortcutInfo/mono-block": {
"title": "$:/config/ShortcutInfo/mono-block",
"text": "{{$:/language/Buttons/MonoBlock/Hint}}"
},
"$:/config/ShortcutInfo/mono-line": {
"title": "$:/config/ShortcutInfo/mono-line",
"text": "{{$:/language/Buttons/MonoLine/Hint}}"
},
"$:/config/ShortcutInfo/new-image": {
"title": "$:/config/ShortcutInfo/new-image",
"text": "{{$:/language/Buttons/NewImage/Hint}}"
},
"$:/config/ShortcutInfo/new-journal": {
"title": "$:/config/ShortcutInfo/new-journal",
"text": "{{$:/language/Buttons/NewJournal/Hint}}"
},
"$:/config/ShortcutInfo/new-tiddler": {
"title": "$:/config/ShortcutInfo/new-tiddler",
"text": "{{$:/language/Buttons/NewTiddler/Hint}}"
},
"$:/config/ShortcutInfo/picture": {
"title": "$:/config/ShortcutInfo/picture",
"text": "{{$:/language/Buttons/Picture/Hint}}"
},
"$:/config/ShortcutInfo/preview": {
"title": "$:/config/ShortcutInfo/preview",
"text": "{{$:/language/Buttons/Preview/Hint}}"
},
"$:/config/ShortcutInfo/quote": {
"title": "$:/config/ShortcutInfo/quote",
"text": "{{$:/language/Buttons/Quote/Hint}}"
},
"$:/config/ShortcutInfo/save-tiddler": {
"title": "$:/config/ShortcutInfo/save-tiddler",
"text": "{{$:/language/Buttons/Save/Hint}}"
},
"$:/config/ShortcutInfo/sidebar-search": {
"title": "$:/config/ShortcutInfo/sidebar-search",
"text": "{{$:/language/Buttons/SidebarSearch/Hint}}"
},
"$:/config/ShortcutInfo/stamp": {
"title": "$:/config/ShortcutInfo/stamp",
"text": "{{$:/language/Buttons/Stamp/Hint}}"
},
"$:/config/ShortcutInfo/strikethrough": {
"title": "$:/config/ShortcutInfo/strikethrough",
"text": "{{$:/language/Buttons/Strikethrough/Hint}}"
},
"$:/config/ShortcutInfo/subscript": {
"title": "$:/config/ShortcutInfo/subscript",
"text": "{{$:/language/Buttons/Subscript/Hint}}"
},
"$:/config/ShortcutInfo/superscript": {
"title": "$:/config/ShortcutInfo/superscript",
"text": "{{$:/language/Buttons/Superscript/Hint}}"
},
"$:/config/ShortcutInfo/toggle-sidebar": {
"title": "$:/config/ShortcutInfo/toggle-sidebar",
"text": "{{$:/language/Buttons/ToggleSidebar/Hint}}"
},
"$:/config/ShortcutInfo/underline": {
"title": "$:/config/ShortcutInfo/underline",
"text": "{{$:/language/Buttons/Underline/Hint}}"
},
"$:/config/SyncFilter": {
"title": "$:/config/SyncFilter",
"text": "[is[tiddler]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]"
},
"$:/config/Tags/MinLength": {
"title": "$:/config/Tags/MinLength",
"text": "0"
},
"$:/config/TextEditor/EditorHeight/Height": {
"title": "$:/config/TextEditor/EditorHeight/Height",
"text": "400px"
},
"$:/config/TextEditor/EditorHeight/Mode": {
"title": "$:/config/TextEditor/EditorHeight/Mode",
"text": "auto"
},
"$:/config/TiddlerInfo/Default": {
"title": "$:/config/TiddlerInfo/Default",
"text": "$:/core/ui/TiddlerInfo/Fields"
},
"$:/config/TiddlerInfo/Mode": {
"title": "$:/config/TiddlerInfo/Mode",
"text": "popup"
},
"$:/config/Tiddlers/TitleLinks": {
"title": "$:/config/Tiddlers/TitleLinks",
"text": "no"
},
"$:/config/Toolbar/ButtonClass": {
"title": "$:/config/Toolbar/ButtonClass",
"text": "tc-btn-invisible"
},
"$:/config/Toolbar/Icons": {
"title": "$:/config/Toolbar/Icons",
"text": "yes"
},
"$:/config/Toolbar/Text": {
"title": "$:/config/Toolbar/Text",
"text": "no"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions",
"text": "show"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others",
"text": "hide"
},
"$:/config/shortcuts-mac/bold": {
"title": "$:/config/shortcuts-mac/bold",
"text": "meta-B"
},
"$:/config/shortcuts-mac/italic": {
"title": "$:/config/shortcuts-mac/italic",
"text": "meta-I"
},
"$:/config/shortcuts-mac/underline": {
"title": "$:/config/shortcuts-mac/underline",
"text": "meta-U"
},
"$:/config/shortcuts-mac/new-image": {
"title": "$:/config/shortcuts-mac/new-image",
"text": "ctrl-I"
},
"$:/config/shortcuts-mac/new-journal": {
"title": "$:/config/shortcuts-mac/new-journal",
"text": "ctrl-J"
},
"$:/config/shortcuts-mac/new-tiddler": {
"title": "$:/config/shortcuts-mac/new-tiddler",
"text": "ctrl-N"
},
"$:/config/shortcuts-not-mac/bold": {
"title": "$:/config/shortcuts-not-mac/bold",
"text": "ctrl-B"
},
"$:/config/shortcuts-not-mac/italic": {
"title": "$:/config/shortcuts-not-mac/italic",
"text": "ctrl-I"
},
"$:/config/shortcuts-not-mac/underline": {
"title": "$:/config/shortcuts-not-mac/underline",
"text": "ctrl-U"
},
"$:/config/shortcuts-not-mac/new-image": {
"title": "$:/config/shortcuts-not-mac/new-image",
"text": "alt-I"
},
"$:/config/shortcuts-not-mac/new-journal": {
"title": "$:/config/shortcuts-not-mac/new-journal",
"text": "alt-J"
},
"$:/config/shortcuts-not-mac/new-tiddler": {
"title": "$:/config/shortcuts-not-mac/new-tiddler",
"text": "alt-N"
},
"$:/config/shortcuts/advanced-search": {
"title": "$:/config/shortcuts/advanced-search",
"text": "ctrl-shift-A"
},
"$:/config/shortcuts/cancel-edit-tiddler": {
"title": "$:/config/shortcuts/cancel-edit-tiddler",
"text": "escape"
},
"$:/config/shortcuts/excise": {
"title": "$:/config/shortcuts/excise",
"text": "ctrl-E"
},
"$:/config/shortcuts/sidebar-search": {
"title": "$:/config/shortcuts/sidebar-search",
"text": "ctrl-shift-F"
},
"$:/config/shortcuts/heading-1": {
"title": "$:/config/shortcuts/heading-1",
"text": "ctrl-1"
},
"$:/config/shortcuts/heading-2": {
"title": "$:/config/shortcuts/heading-2",
"text": "ctrl-2"
},
"$:/config/shortcuts/heading-3": {
"title": "$:/config/shortcuts/heading-3",
"text": "ctrl-3"
},
"$:/config/shortcuts/heading-4": {
"title": "$:/config/shortcuts/heading-4",
"text": "ctrl-4"
},
"$:/config/shortcuts/heading-5": {
"title": "$:/config/shortcuts/heading-5",
"text": "ctrl-5"
},
"$:/config/shortcuts/heading-6": {
"title": "$:/config/shortcuts/heading-6",
"text": "ctrl-6"
},
"$:/config/shortcuts/link": {
"title": "$:/config/shortcuts/link",
"text": "ctrl-L"
},
"$:/config/shortcuts/linkify": {
"title": "$:/config/shortcuts/linkify",
"text": "alt-shift-L"
},
"$:/config/shortcuts/list-bullet": {
"title": "$:/config/shortcuts/list-bullet",
"text": "ctrl-shift-L"
},
"$:/config/shortcuts/list-number": {
"title": "$:/config/shortcuts/list-number",
"text": "ctrl-shift-N"
},
"$:/config/shortcuts/mono-block": {
"title": "$:/config/shortcuts/mono-block",
"text": "ctrl-shift-M"
},
"$:/config/shortcuts/mono-line": {
"title": "$:/config/shortcuts/mono-line",
"text": "ctrl-M"
},
"$:/config/shortcuts/picture": {
"title": "$:/config/shortcuts/picture",
"text": "ctrl-shift-I"
},
"$:/config/shortcuts/preview": {
"title": "$:/config/shortcuts/preview",
"text": "alt-P"
},
"$:/config/shortcuts/quote": {
"title": "$:/config/shortcuts/quote",
"text": "ctrl-Q"
},
"$:/config/shortcuts/save-tiddler": {
"title": "$:/config/shortcuts/save-tiddler",
"text": "ctrl+enter"
},
"$:/config/shortcuts/stamp": {
"title": "$:/config/shortcuts/stamp",
"text": "ctrl-S"
},
"$:/config/shortcuts/strikethrough": {
"title": "$:/config/shortcuts/strikethrough",
"text": "ctrl-T"
},
"$:/config/shortcuts/subscript": {
"title": "$:/config/shortcuts/subscript",
"text": "ctrl-shift-B"
},
"$:/config/shortcuts/superscript": {
"title": "$:/config/shortcuts/superscript",
"text": "ctrl-shift-P"
},
"$:/config/shortcuts/toggle-sidebar": {
"title": "$:/config/shortcuts/toggle-sidebar",
"text": "alt-shift-S"
},
"$:/config/shortcuts/transcludify": {
"title": "$:/config/shortcuts/transcludify",
"text": "alt-shift-T"
},
"$:/config/ui/EditTemplate": {
"title": "$:/config/ui/EditTemplate",
"text": "$:/core/ui/EditTemplate"
},
"$:/config/ui/ViewTemplate": {
"title": "$:/config/ui/ViewTemplate",
"text": "$:/core/ui/ViewTemplate"
},
"$:/config/WikiParserRules/Inline/wikilink": {
"title": "$:/config/WikiParserRules/Inline/wikilink",
"text": "enable"
},
"$:/snippets/currpalettepreview": {
"title": "$:/snippets/currpalettepreview",
"text": "\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}\n><div class=\"tc-swatch\" style=<<swatchStyle>> title=<<colour>>/></$set>\n\\end\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></div>"
},
"$:/snippets/download-wiki-button": {
"title": "$:/snippets/download-wiki-button",
"text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
},
"$:/language": {
"title": "$:/language",
"text": "$:/languages/en-GB"
},
"$:/snippets/languageswitcher": {
"title": "$:/snippets/languageswitcher",
"text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/core/macros/CSS": {
"title": "$:/core/macros/CSS",
"tags": "$:/tags/Macro",
"text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"/></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n -webkit-box-shadow: $shadow$;\n -moz-box-shadow: $shadow$;\n box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n -webkit-filter: $filter$;\n -moz-filter: $filter$;\n filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n -webkit-transition: $transition$;\n -moz-transition: $transition$;\n transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n -webkit-transform-origin: $origin$;\n -moz-transform-origin: $origin$;\n transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\">$text$</$reveal>\n\\end\n"
},
"$:/core/macros/colour-picker": {
"title": "$:/core/macros/colour-picker",
"tags": "$:/tags/Macro",
"text": "\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n\n$(colour-picker-update-recent)$\n\n$actions$\n\n<div style=\"background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n{{$:/language/ColourPicker/Recent}} <$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n<$macrocall $name=\"colour-picker-recent-inner\" actions=\"\"\"$actions$\"\"\"/></$list>\n\\end\n\n\\define colour-picker(actions)\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=\"\"\"$actions$\"\"\"/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/> \n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\n</div>\n\n\\end\n"
},
"$:/core/macros/copy-to-clipboard": {
"title": "$:/core/macros/copy-to-clipboard",
"tags": "$:/tags/Macro",
"text": "\\define copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button class=<<__class__>> style=<<__style__>> message=\"tm-copy-to-clipboard\" param=<<__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\n{{$:/core/images/copy-clipboard}} <$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n</$button>\n\\end\n\n\\define copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n<div style=\"position: absolute; bottom: 0; right: 0;\">\n<$macrocall $name=\"copy-to-clipboard\" src=<<__src__>> class=<<__class__>> style=<<__style__>>/>\n</div>\n</div>\n\\end\n\n"
},
"$:/core/macros/diff": {
"title": "$:/core/macros/diff",
"tags": "$:/tags/Macro",
"text": "\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>>>\n<$diff-text source=<<source>> dest=<<dest>>/>\n</$set>\n</$set>\n\\end\n\n\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n<tbody>\n<$set name=\"sourceFields\" filter=\"[<__sourceTiddlerTitle__>fields[]sort[]]\">\n<$set name=\"destFields\" filter=\"[<__destSubTiddlerTitle__>subtiddlerfields<__destTiddlerTitle__>sort[]]\">\n<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<__exclude__>] +[sort[]]\" variable=\"fieldName\">\n<tr>\n<th>\n<$text text=<<fieldName>>/> \n</th>\n<td>\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>> field=<<fieldName>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>> field=<<fieldName>>>\n<$diff-text source=<<source>> dest=<<dest>>>\n</$diff-text>\n</$set>\n</$set>\n</td>\n</tr>\n</$list>\n</$set>\n</$set>\n</tbody>\n</table>\n\\end\n"
},
"$:/core/macros/dumpvariables": {
"title": "$:/core/macros/dumpvariables",
"tags": "$:/tags/Macro",
"text": "\\define dumpvariables()\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\n\\end\n"
},
"$:/core/macros/export": {
"title": "$:/core/macros/export",
"tags": "$:/tags/Macro",
"text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=\"\"\"$exportFilter$\"\"\" filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</div>\n</$reveal>\n\\end\n"
},
"$:/core/macros/image-picker": {
"title": "$:/core/macros/image-picker",
"created": "20170715180840889",
"modified": "20170715180914005",
"tags": "$:/tags/Macro",
"type": "text/vnd.tiddlywiki",
"text": "\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\">\n$actions$\n<$transclude tiddler=<<imageTitle>>/>\n</$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n"
},
"$:/core/macros/lingo": {
"title": "$:/core/macros/lingo",
"tags": "$:/tags/Macro",
"text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
},
"$:/core/macros/list": {
"title": "$:/core/macros/list",
"tags": "$:/tags/Macro",
"text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage)\n\\whitespace trim\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\" emptyMessage=<<__emptyMessage__>>>\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n<$type$ class=\"$class$\">\n<$list filter=\"[list[$tiddler$!!$field$]]\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"\"\"$subtype$\"\"\">\n<div class=\"tc-droppable-placeholder\"/>\n<div>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$transclude>\n</div>\n</$droppable>\n</$list>\n</$type$>\n<$tiddler tiddler=\"\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"div\">\n<div class=\"tc-droppable-placeholder\">\n \n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n<$list filter=\"[<__tag__>tagging[]]\">\n<$action-deletefield $field=\"list-before\"/>\n<$action-deletefield $field=\"list-after\"/>\n</$list>\n<!-- Save the new order to the Tag Tiddler -->\n<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore:currentTiddler<actionTiddler>]\"/>\n<!-- Make sure the newly added item has the right tag -->\n<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n</$fieldmangler>\n</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n<$set name=\"tag\" value=<<__tag__>>>\n<$list filter=\"[<__tag__>tagging[]$subFilter$]\" emptyMessage=<<__emptyMessage__>>>\n<$elementTag$ class=\"tc-menu-list-item\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\">\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</$transclude>\n</$elementTag$>\n</$droppable>\n</$elementTag$>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\">\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$ style=\"height:0.5em;\">\n</$elementTag$>\n</$droppable>\n</$tiddler>\n</$set>\n</span>\n\\end\n"
},
"$:/core/macros/tabs": {
"title": "$:/core/macros/tabs",
"tags": "$:/tags/Macro",
"text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain)\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\" storyview=\"pop\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<qualify \"$state$\">> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler></$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tag-picker": {
"title": "$:/core/macros/tag-picker",
"tags": "$:/tags/Macro",
"text": "\\define add-tag-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{$:/temp/NewTagName}}/>\n<$action-deletetiddler $tiddler=\"$:/temp/NewTagName\"/>\n\\end\n\n\\define tag-button()\n<$button class=\"tc-btn-invisible\" tag=\"a\">\n$(actions)$\n<$action-deletetiddler $tiddler=\"$:/temp/NewTagName\"/>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$button>\n\\end\n\n\\define tag-picker(actions)\n<$set name=\"actions\" value=\"\"\"$actions$\"\"\">\n<div class=\"tc-edit-add-tag\">\n<span class=\"tc-add-tag-name\">\n<$keyboard key=\"ENTER\" actions=<<add-tag-actions>>>\n<$edit-text tiddler=\"$:/temp/NewTagName\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>>/>\n</$keyboard>\n</span> <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class=\"tc-add-tag-button\">\n<$set name=\"tag\" value={{$:/temp/NewTagName}}>\n<$button set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n$actions$\n<$action-deletetiddler $tiddler=\"$:/temp/NewTagName\"/>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown\">\n<$list filter=\"[{$:/temp/NewTagName}minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]!is[system]search:title{$:/temp/NewTagName}sort[]]\" variable=\"tag\">\n<<tag-button>>\n</$list></$list>\n<hr>\n<$list filter=\"[{$:/temp/NewTagName}minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=\"[tags[]is[system]search:title{$:/temp/NewTagName}sort[]]\" variable=\"tag\">\n<<tag-button>>\n</$list></$list>\n</div>\n</$reveal>\n</div>\n</$set>\n\\end\n"
},
"$:/core/macros/tag": {
"title": "$:/core/macros/tag",
"tags": "$:/tags/Macro",
"text": "\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<$element-tag$ $element-attributes$ class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n$actions$<$transclude tiddler=\"\"\"$icon$\"\"\"/> <$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n</$element-tag$>\n</$vars>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n<$macrocall $name=\"tag-pill-inner\" tag=<<__tag__>> icon=\"\"\"$icon$\"\"\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-pill-body\" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
},
"$:/core/macros/thumbnails": {
"title": "$:/core/macros/thumbnails",
"tags": "$:/tags/Macro",
"text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div>\n</div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n"
},
"$:/core/macros/timeline": {
"title": "$:/core/macros/timeline",
"created": "20141212105914482",
"modified": "20141212110330815",
"tags": "$:/tags/Macro",
"text": "\\define timeline-title()\n<!-- Override this macro with a global macro \n of the same name if you need to change \n how titles are displayed on the timeline \n -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}>\n<<timeline-title>>\n</$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
},
"$:/core/macros/toc": {
"title": "$:/core/macros/toc",
"tags": "$:/tags/Macro",
"text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n <$transclude field=\"caption\">\n <$view field=\"title\"/>\n </$transclude>\n</$set>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<ol class=\"tc-toc\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link><$view field='caption'><$view field='title'/></$view></$link>\">\n <<toc-caption>>\n </$list>\n <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </li>\n </$set>\n </$set>\n </$vars>\n </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\")\n<$macrocall $name=\"toc-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$link>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n <li class=<<toc-item-class>>>\n <$link>\n <$list filter=\"[all[current]tagging[]limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n </$list>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]tagging[]limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n </$list>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-selective-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\n <div class=\"tc-tabbed-table-of-contents\">\n <$linkcatcher to=<<__selectedTiddler__>>>\n <div class=\"tc-table-of-contents\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"[all[current]] -[<__selectedTiddler__>get[text]]\"/>\n </div>\n </$linkcatcher>\n <div class=\"tc-tabbed-table-of-contents-content\">\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"nomatch\" text=\"\">\n <$transclude mode=\"block\" tiddler=<<__template__>>>\n <h1><<toc-caption>></h1>\n <$transclude mode=\"block\">$missingText$</$transclude>\n </$transclude>\n </$reveal>\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"match\" text=\"\">\n $unselectedText$\n </$reveal>\n </div>\n </div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=<<__selectedTiddler__>>>\n <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/>\n</$linkcatcher>\n\\end\n\n"
},
"$:/core/macros/translink": {
"title": "$:/core/macros/translink",
"tags": "$:/tags/Macro",
"text": "\\define translink(title,mode:\"block\")\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: black; foreground; white;\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: white; foreground; black;\">\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"$mode$\">\n\"<$text text=\"\"\"$title$\"\"\"/>\" is missing\n</$transclude>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tree": {
"title": "$:/core/macros/tree",
"tags": "$:/tags/Macro",
"text": "\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span> <$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/utils": {
"title": "$:/core/macros/utils",
"text": "\\define colour(colour)\n$colour$\n\\end\n"
},
"$:/snippets/minilanguageswitcher": {
"title": "$:/snippets/minilanguageswitcher",
"text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/minithemeswitcher": {
"title": "$:/snippets/minithemeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/modules": {
"title": "$:/snippets/modules",
"text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
},
"$:/palette": {
"title": "$:/palette",
"text": "$:/palettes/Vanilla"
},
"$:/snippets/paletteeditor": {
"title": "$:/snippets/paletteeditor",
"text": "<$transclude tiddler=\"$:/PaletteManager\"/>\n"
},
"$:/snippets/palettepreview": {
"title": "$:/snippets/palettepreview",
"text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"
},
"$:/snippets/paletteswitcher": {
"title": "$:/snippets/paletteswitcher",
"text": "<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\"><$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/>{{||$:/snippets/currpalettepreview}}</$link>\n</div></$set>\n</$list>\n</div>\n</$linkcatcher>\n"
},
"$:/snippets/peek-stylesheets": {
"title": "$:/snippets/peek-stylesheets",
"text": "\\define expandable-stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n"
},
"$:/temp/search": {
"title": "$:/temp/search",
"text": ""
},
"$:/tags/AdvancedSearch": {
"title": "$:/tags/AdvancedSearch",
"list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
},
"$:/tags/AdvancedSearch/FilterButton": {
"title": "$:/tags/AdvancedSearch/FilterButton",
"list": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete"
},
"$:/tags/ControlPanel": {
"title": "$:/tags/ControlPanel",
"list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
},
"$:/tags/ControlPanel/Info": {
"title": "$:/tags/ControlPanel/Info",
"list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
},
"$:/tags/ControlPanel/Plugins": {
"title": "$:/tags/ControlPanel/Plugins",
"list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]"
},
"$:/tags/EditTemplate": {
"title": "$:/tags/EditTemplate",
"list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
},
"$:/tags/EditToolbar": {
"title": "$:/tags/EditToolbar",
"list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
},
"$:/tags/EditorToolbar": {
"title": "$:/tags/EditorToolbar",
"list": "$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type"
},
"$:/tags/Manager/ItemMain": {
"title": "$:/tags/Manager/ItemMain",
"list": "$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields"
},
"$:/tags/Manager/ItemSidebar": {
"title": "$:/tags/Manager/ItemSidebar",
"list": "$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools"
},
"$:/tags/MoreSideBar": {
"title": "$:/tags/MoreSideBar",
"list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]",
"text": ""
},
"$:/tags/PageControls": {
"title": "$:/tags/PageControls",
"list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
},
"$:/tags/PageTemplate": {
"title": "$:/tags/PageTemplate",
"list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]",
"text": ""
},
"$:/tags/SideBar": {
"title": "$:/tags/SideBar",
"list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
"text": ""
},
"$:/tags/SideBarSegment": {
"title": "$:/tags/SideBarSegment",
"list": "[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]"
},
"$:/tags/TiddlerInfo": {
"title": "$:/tags/TiddlerInfo",
"list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
"text": ""
},
"$:/tags/TiddlerInfo/Advanced": {
"title": "$:/tags/TiddlerInfo/Advanced",
"list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
},
"$:/tags/ViewTemplate": {
"title": "$:/tags/ViewTemplate",
"list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
},
"$:/tags/ViewToolbar": {
"title": "$:/tags/ViewToolbar",
"list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]"
},
"$:/snippets/themeswitcher": {
"title": "$:/snippets/themeswitcher",
"text": "<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\"><$list filter=\"[plugin-type[theme]sort[title]]\"><$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/core/wiki/title": {
"title": "$:/core/wiki/title",
"text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
},
"$:/view": {
"title": "$:/view",
"text": "classic"
},
"$:/snippets/viewswitcher": {
"title": "$:/snippets/viewswitcher",
"text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>>\n<$transclude tiddler=<<icon>>/>\n<$text text=<<storyview>>/>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
}
}
}
\define lingo-base() $:/language/Search/
<<lingo Filter/Hint>>
<div class="tc-search tc-advanced-search">
<$edit-text tiddler="$:/temp/advancedsearch" type="search" tag="input"/>
<$list filter="[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]"><$transclude/></$list>
</div>
Regexp scratchpad:<br/>
<$edit-text tiddler="scratch" tag="input" placeholder="regexp" />
<$reveal state="$:/temp/advancedsearch" type="nomatch" text="">
<$set name="resultCount" value="""<$count filter={{$:/temp/advancedsearch}}/>""">
<div class="tc-search-results">
<<lingo Filter/Matches>>
<$list filter={{$:/temp/advancedsearch}} template="$:/core/ui/ListItemTemplate"/>
</div>
</$set>
</$reveal>
<$reveal state="$:/temp/advancedsearch" type="nomatch" text="">
<$button class="tc-btn-invisible">
<$action-setfield $tiddler="$:/temp/advancedsearch" $field="text" $value=""/>
<$action-setfield $tiddler="scratch" $field="text" $value=""/>
{{$:/core/images/close-button}}
</$button>
</$reveal>
\whitespace trim
<$button message="tm-new-tiddler" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/clone-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text">
<$text text=" "/>
<$text text={{$:/language/Buttons/Clone/Caption}}/>
</span>
</$list>
</$button>
\define makeExportFilter()
[[$(currentTiddler)$]]
\end
<$macrocall $name="exportButton" exportFilter=<<makeExportFilter>> lingoBase="$:/language/Buttons/ExportTiddler/" baseFilename=<<currentTiddler>>/>
\whitespace trim
<$fieldmangler>
<$button message="tm-add-tag" param="Favorites" tooltip={{$:/language/Buttons/Favorite/Hint}} aria-label={{$:/language/Buttons/Favorite/Caption}} class=<<tv-config-toolbar-class>>>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/star-filled}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text">
<$text text=" "/>
<$text text={{$:/language/Buttons/Favorite/Caption}}/>
</span>
</$list>
</$button>
</$fieldmangler>
\whitespace trim
\define journalButtonTags()
[[$(currentTiddlerTag)$]] $(journalTags)$
\end
\define journalButton()
<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>
<$action-sendmessage $message="tm-new-tiddler" title=<<now "$(journalTitleTemplate)$">> tags=<<journalButtonTags>>/>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/new-journal-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text">
<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>
</span>
</$list>
</$button>
\end
<$set name="journalTitleTemplate" value={{$:/config/NewJournal/Title}}>
<$set name="journalTags" value={{$:/config/NewJournal/Tags}}>
<$set name="currentTiddlerTag" value=<<currentTiddler>>>
<<journalButton>>
</$set>
</$set>
</$set>
<$button to="Favorites" tooltip="favorites" aria-label="Open favorites list" class=<<tv-config-toolbar-class>>>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/star-filled}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text"><$text text="favorites"/></span>
</$list>
</$button>
\whitespace trim
<$button message="tm-open-window" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/open-window}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text">
<$text text=" "/>
<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>
</span>
</$list>
</$button>
\whitespace trim
<$button message="tm-permaview" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/permaview-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text">
<$text text=" "/>
<$text text={{$:/language/Buttons/Permaview/Caption}}/>
</span>
</$list>
</$button>
<$edit-text field="draft.title" class="tc-titlebar tc-edit-texteditor" focus="true" tabindex={{$:/config/EditTabIndex}}/>
<$vars pattern="""[\|\[\]{}]""" bad-chars="""`| [ ] { }`""">
<$list filter="[all[current]regexp:draft.title<pattern>]" variable="listItem">
<div class="tc-message-box">
{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}
</div>
</$list>
</$vars>
<$reveal state="!!draft.title" type="nomatch" text={{!!draft.of}} tag="div">
<$list filter="[{!!draft.title}!is[missing]]" variable="listItem">
<div class="tc-message-box">
{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}} — <$link to={{!!draft.title}} >{{!!draft.title}}</$link>
</div>
</$list>
<$list filter="[{!!draft.of}!is[missing]]" variable="listItem">
<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>
<$checkbox tiddler="$:/config/RelinkOnRename" field="text" checked="yes" unchecked="no" default="no"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>
<$list filter="[title<fromTitle>backlinks[]limit[1]]" variable="listItem">
<$vars stateTiddler=<<qualify "$:/state/edit/references">> >
<$reveal type="nomatch" state=<<stateTiddler>> text="show">
<$button set=<<stateTiddler>> setTo="show" class="tc-btn-invisible">{{$:/core/images/right-arrow}}
<<lingo EditTemplate/Title/References/Prompt>></$button>
</$reveal>
<$reveal type="match" state=<<stateTiddler>> text="show">
<$button set=<<stateTiddler>> setTo="hide" class="tc-btn-invisible">{{$:/core/images/down-arrow}}
<<lingo EditTemplate/Title/References/Prompt>></$button>
</$reveal>
<$reveal type="match" state=<<stateTiddler>> text="show">
<$tiddler tiddler=<<fromTitle>> >
<$transclude tiddler="$:/core/ui/TiddlerInfo/References"/>
</$tiddler>
</$reveal>
</$vars>
</$list>
</$vars>
</$list>
</$reveal>
<$set name="myFilter" value="[all[missing]sort[title]] -[has[aliases]each:list-item[aliases]]">
<$list filter="[subfilter<myFilter>]" template="$:/core/ui/MissingTemplate"/>
</$set>
\whitespace trim
\define lingo-base() $:/language/CloseAll/
\define drop-actions()
<$action-listops $tiddler=<<tv-story-list>> $subfilter="+[insertbefore:currentTiddler<actionTiddler>]"/>
\end
\define placeholder()
<div class="tc-droppable-placeholder"/>
\end
\define droppable-item(button)
\whitespace trim
<$droppable actions=<<drop-actions>>>
<<placeholder>>
<div>
$button$
</div>
</$droppable>
\end
<div class="tc-sidebar-tab-open">
<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" storyview="pop">
<div class="tc-sidebar-tab-open-item">
<$macrocall $name="droppable-item" button="""<$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class="tc-btn-invisible tc-btn-mini">{{$:/core/images/close-button}}</$button> <$link to={{!!title}}><$view field="title"/></$link>"""/>
</div>
</$list>
<$tiddler tiddler="">
<div>
<$macrocall $name="droppable-item" button="""<$button message="tm-close-all-tiddlers" class="tc-btn-invisible tc-btn-mini"><<lingo Button>></$button>"""/>
</div>
</$tiddler>
</div>
\define lingo-base() $:/language/ControlPanel/
\define config-title()
$:/config/PageControlButtons/Visibility/$(listItem)$
\end
<<lingo Basics/Version/Prompt>> <<version>>
<$set name="tv-config-toolbar-icons" value="yes">
<$set name="tv-config-toolbar-text" value="yes">
<$set name="tv-config-toolbar-class" value="">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]" variable="listItem">
<div style="position:relative;" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>
<$checkbox tiddler=<<config-title>> field="text" checked="show" unchecked="hide" default="show"/> <$transclude tiddler=<<listItem>>/> <i class="tc-muted"><$transclude tiddler=<<listItem>> field="description"/></i>
</div>
</$list>
</$set>
</$set>
</$set>
<$action-sendmessage
$message="tm-edit-text-operation"
$param="wrap-selection"
prefix="[["
suffix="]]"
/>
\define lingo-base() $:/language/TiddlerInfo/
<$list filter="[list[!!aliases]]" emptyMessage="This tiddler does not have any aliases." template="$:/core/ui/ListItemTemplate"/>
\define lingo-base() $:/language/TiddlerInfo/
<$list filter="[all[current]backlinks[]] [all[current]each:list-item[aliases]backlinks[]] +[sort[title]]" emptyMessage=<<lingo References/Empty>> template="$:/core/ui/ListItemTemplate">
</$list>
\define lingo-base() $:/language/TiddlerInfo/
<$list filter="[all[current]listed[base-item]]" emptyMessage="This tiddler does not have any subitems." template="$:/core/ui/ListItemTemplate"/>
<$list filter="[all[current]has[source]]">
<div class="source">Source: <$list filter="[enlist{!!source}first[]]" /><$list filter="[enlist{!!source}rest[]]">, <$link>{{!!title}}</$link></$list></div>
</$list>
<$reveal type="nomatch" stateTitle=<<folded-state>> text="hide" tag="div" retain="yes" animate="yes">
<div class="tc-tags-wrapper">
<$list filter="[all[current]tags[]sort[title]]" template="$:/core/ui/TagTemplate" storyview="pop"/>
<$list filter="[all[current]has:field[level]]"><div class="level">LEVEL <$view tiddler=<<currentTiddler>> field="level" /></div></$list>
</div>
</$reveal>
\define title-styles()
fill:$(foregroundColor)$;
\end
\define config-title()
$:/config/ViewToolbarButtons/Visibility/$(listItem)$
\end
<div class="tc-tiddler-title">
<div class="tc-titlebar">
<span class="tc-tiddler-controls">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]" variable="listItem"><$reveal type="nomatch" state=<<config-title>> text="hide"><$set name="tv-config-toolbar-class" filter="[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>
</span>
<$set name="tv-wikilinks" value={{$:/config/Tiddlers/TitleLinks}}>
<$link>
<$set name="foregroundColor" value={{!!color}}>
<span class="tc-tiddler-title-icon" style=<<title-styles>>>
<$transclude tiddler={{!!icon}}/>
</span>
</$set>
<$list filter="[all[current]removeprefix[$:/]]">
<h2 class="tc-title" title={{$:/language/SystemTiddler/Tooltip}}>
<span class="tc-system-title-prefix">$:/</span><$text text=<<currentTiddler>>/>
</h2>
</$list>
<$list filter="[all[current]!prefix[$:/]]">
<h2 class="tc-title">
<$view field="caption"><$view field="title"/></$view><$list filter="[all[current]has[append]]"> (<$view field="append"/>)</$list>
</h2>
</$list>
</$link>
</$set>
</div>
<$reveal type="nomatch" text="" default="" state=<<tiddlerInfoState>> class="tc-tiddler-info tc-popup-handle" animate="yes" retain="yes">
<$transclude tiddler="$:/core/ui/TiddlerInfo"/>
</$reveal>
</div>
Mark this tiddler as a favorite
<<list-links "[tag[task]sort[title]]">>
\define macroName(param1:"default value",param2)
Text of the macro
\end
|! |!Alpha |!Beta |!Gamma |!Delta |
|!One | | | | |
|!Two | | | | |
|!Three | | | | |
<div class="tc-table-of-contents">
<<toc-selective-expandable 'TableOfContents'>>
</div>
alert-background: #ffe476
alert-border: #b99e2f
alert-highlight: #881122
alert-muted-foreground: #b99e2f
background: #ffffff
blockquote-bar: <<colour muted-foreground>>
button-background:
button-foreground:
button-border:
code-background: #f7f7f9
code-border: #e1e1e8
code-foreground: #dd1144
dirty-indicator: #ff0000
download-background: #34c734
download-foreground: <<colour background>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: <<colour background>>
dropdown-border: <<colour muted-foreground>>
dropdown-tab-background-selected: #ffffff
dropdown-tab-background: #ececec
dropzone-background: <<colour muted-foreground>>
external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: #0000aa
external-link-foreground: #0000ee
foreground: #333333
message-background: #ecf2ff
message-border: #cfd6e6
message-foreground: #547599
modal-backdrop: <<colour foreground>>
modal-background: <<colour background>>
modal-border: #999999
modal-footer-background: #f5f5f5
modal-footer-border: #dddddd
modal-header-border: #eeeeee
muted-foreground: #dddddd
notification-background: #ffffdd
notification-border: #999999
page-background: #061a30
pre-background: #f5f5f5
pre-border: #cccccc
primary: #5778d8
select-tag-background:
select-tag-foreground:
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: #ccccff
sidebar-controls-foreground: #ffffff
sidebar-foreground-shadow: rgba(0,0,0, 0.5)
sidebar-foreground: #ffffff
sidebar-muted-foreground-hover: #444444
sidebar-muted-foreground: #eeeeee
sidebar-tab-background-selected: rgba(255,255,255, 0.8)
sidebar-tab-background: rgba(255,255,255, 0.4)
sidebar-tab-border-selected: <<colour tab-border-selected>>
sidebar-tab-border: <<colour tab-border>>
sidebar-tab-divider: rgba(255,255,255, 0.2)
sidebar-tab-foreground-selected: #000000
sidebar-tab-foreground: #dddddd
sidebar-tiddler-link-foreground-hover: #aaaaff
sidebar-tiddler-link-foreground: #ddddff
site-title-foreground: #ffffff
static-alert-foreground: #aaaaaa
tab-background-selected: #ffffff
tab-background: #d8d8d8
tab-border-selected: #d8d8d8
tab-border: #cccccc
tab-divider: #d8d8d8
tab-foreground-selected: <<colour tab-foreground>>
tab-foreground: #666666
table-border: #dddddd
table-footer-background: #a8a8a8
table-header-background: #f0f0f0
tag-background: <<colour sidebar-tiddler-link-foreground>>
tag-foreground: #ffffff
tiddler-background: <<colour background>>
tiddler-border: <<colour background>>
tiddler-controls-foreground-hover: #888888
tiddler-controls-foreground-selected: #444444
tiddler-controls-foreground: #cccccc
tiddler-editor-background: #f8f8f8
tiddler-editor-border-image: #ffffff
tiddler-editor-border: #cccccc
tiddler-editor-fields-even: #e0e8e0
tiddler-editor-fields-odd: #f0f4f0
tiddler-info-background: #f8f8f8
tiddler-info-border: #dddddd
tiddler-info-tab-background: #f8f8f8
tiddler-link-background: <<colour background>>
tiddler-link-foreground: <<colour primary>>
tiddler-subtitle-foreground: #c0c0c0
tiddler-title-foreground: #182955
toolbar-new-button:
toolbar-options-button:
toolbar-save-button:
toolbar-info-button:
toolbar-edit-button:
toolbar-close-button:
toolbar-delete-button:
toolbar-cancel-button:
toolbar-done-button:
untagged-background: #999999
very-muted-foreground: #888888
{
"tiddlers": {
"$:/core/modules/widgets/navigator.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList}\n\t));\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tvar p = storyList.indexOf(title);\n\twhile(p !== -1) {\n\t\tstoryList.splice(p,1);\n\t\tp = storyList.indexOf(title);\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tvar pos = storyList.indexOf(oldTitle);\n\tif(pos !== -1) {\n\t\tstoryList[pos] = newTitle;\n\t\tdo {\n\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\tif(pos !== -1) {\n\t\t\t\tstoryList.splice(pos,1);\n\t\t\t}\n\t\t} while(pos !== -1);\n\t} else {\n\t\tstoryList.splice(0,0,newTitle);\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tvar storyList = this.getStoryList();\n\t// Quit if we cannot get hold of the story list\n\tif(!storyList) {\n\t\treturn;\n\t}\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(title);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(fromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(this.getAttribute(\"openLinkFromInsideRiver\",\"below\")) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,title);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.wiki.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tif(event.navigateTo) {\n if (!this.wiki.tiddlerExists(event.navigateTo) && event.followAliases == \"true\") {\n var aliases = this.wiki.filterTiddlers(\"[title[\"+event.navigateTo+\"]listed[aliases]]\")\n if (aliases.length === 1) {\n event.navigateTo = aliases[0]\n }\n }\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Delete this tiddler\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler(\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle;\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\";\n\t\tc++;\n\t} while(this.wiki.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags)\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\texistingTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\t\t\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\tvar self = this;\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\t\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\t\t\n\t}\n\treturn false;\n};\n\n// \nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(tiddlerFields));\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\t$tw.wiki.renameTiddler(from,to);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
"type": "application/javascript",
"title": "$:/core/modules/widgets/navigator.js",
"module-type": "widget",
"modified": "20160218192104537",
"created": "20160218190315501"
},
"$:/core/ui/ViewTemplate/body": {
"text": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" state=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n<$list filter=\"[title{!!title}listed[aliases]first[]]\" variable=\"\">\nYou may have meant one of the following pages\n<$list filter=\"[title{!!title}listed[aliases]]\">\n<li><$link>{{!!title}}</$link></li>\n</$list>\n\n</$list>\n</$transclude>\n\n</$list>\n\n</$reveal>\n",
"title": "$:/core/ui/ViewTemplate/body",
"tags": "$:/tags/ViewTemplate",
"modified": "20160218192615033",
"created": "20160218185029873"
},
"$:/core/modules/widgets/link.js": {
"text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true;\n\t// Render the link if required\n\tif(useWikiLinks) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.linkClasses) {\n\t\tclasses.push(this.linkClasses);\n\t}\n\tclasses.push(\"tc-tiddlylink\");\n\tif(this.isShadow) {\n\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t}\n\tif(this.isMissing && !this.isShadow) {\n\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t} else {\n\t\tif(!this.isMissing) {\n\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t}\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Set an href\n\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\",\n\t\twikiLinkText = wikiLinkTemplate.replace(\"$uri_encoded$\",encodeURIComponent(this.to));\n\twikiLinkText = wikiLinkText.replace(\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tdomNode.setAttribute(\"href\",wikiLinkText);\n\t}\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragstart\", handlerObject: this, handlerMethod: \"handleDragStartEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tfollowAliases: this.followAliases\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\nLinkWidget.prototype.handleDragStartEvent = function(event) {\n\tif(event.target === this.domNodes[0]) {\n\t\tif(this.to) {\n\t\t\t$tw.dragInProgress = true;\n\t\t\t// Set the dragging class on the element being dragged\n\t\t\t$tw.utils.addClass(event.target,\"tc-tiddlylink-dragging\");\n\t\t\t// Create the drag image elements\n\t\t\tthis.dragImage = this.document.createElement(\"div\");\n\t\t\tthis.dragImage.className = \"tc-tiddler-dragger\";\n\t\t\tvar inner = this.document.createElement(\"div\");\n\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\tinner.appendChild(this.document.createTextNode(this.to));\n\t\t\tthis.dragImage.appendChild(inner);\n\t\t\tthis.document.body.appendChild(this.dragImage);\n\t\t\t// Astoundingly, we need to cover the dragger up: http://www.kryogenix.org/code/browser/custom-drag-image.html\n\t\t\tvar cover = this.document.createElement(\"div\");\n\t\t\tcover.className = \"tc-tiddler-dragger-cover\";\n\t\t\tcover.style.left = (inner.offsetLeft - 16) + \"px\";\n\t\t\tcover.style.top = (inner.offsetTop - 16) + \"px\";\n\t\t\tcover.style.width = (inner.offsetWidth + 32) + \"px\";\n\t\t\tcover.style.height = (inner.offsetHeight + 32) + \"px\";\n\t\t\tthis.dragImage.appendChild(cover);\n\t\t\t// Set the data transfer properties\n\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t// First the image\n\t\t\tdataTransfer.effectAllowed = \"copy\";\n\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\tdataTransfer.setDragImage(this.dragImage.firstChild,-16,-16);\n\t\t\t}\n\t\t\t// Then the data\n\t\t\tdataTransfer.clearData();\n\t\t\tvar jsonData = this.wiki.getTiddlerAsJson(this.to),\n\t\t\t\ttextData = this.wiki.getTiddlerText(this.to,\"\"),\n\t\t\t\ttitle = (new RegExp(\"^\" + $tw.config.textPrimitives.wikiLink + \"$\",\"mg\")).exec(this.to) ? this.to : \"[[\" + this.to + \"]]\";\n\t\t\t// IE doesn't like these content types\n\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\tdataTransfer.setData(\"text/plain\",title);\n\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t}\n\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\tdataTransfer.setData(\"Text\",title);\n\t\t\tevent.stopPropagation();\n\t\t} else {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\nLinkWidget.prototype.handleDragEndEvent = function(event) {\n\tif(event.target === this.domNodes[0]) {\n\t\t$tw.dragInProgress = false;\n\t\t// Remove the dragging class on the element being dragged\n\t\t$tw.utils.removeClass(event.target,\"tc-tiddlylink-dragging\");\n\t\t// Delete the drag image element\n\t\tif(this.dragImage) {\n\t\t\tthis.dragImage.parentNode.removeChild(this.dragImage);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.followAliases = this.getAttribute(\"followAliases\", \"true\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to) && !(this.wiki.filterTiddlers(\"[title[\"+this.to+\"]listed[aliases]]\").length === 1);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
"type": "application/javascript",
"title": "$:/core/modules/widgets/link.js",
"module-type": "widget",
"modified": "20161018180800361",
"created": "20160218191628007"
}
}
}
{
"tiddlers": {
"$:/plugins/tobibeer/setvars/readme": {
"title": "$:/plugins/tobibeer/setvars/readme",
"text": "Provides the widget `<$setvars>`...\n\n!!Usage\n\n```\r\n<$setvars\r\n_attr1=<<currentTiddler>>\r\n_attr2={{!!title}}\r\n_attr3=\"1 2 3\"\r\n_attr4=\"[all[current]tagging[]]\"\r\nvar1=\"attr1 \\ = literal = \\ attr2\"\r\nvar2=\"attr3[n] \\ \\ [attr4[1,2][when-empty]] \\ \\ [attr3[][][ - ]]\"\r\nvar3=\"if(attr1 ? [attr4]) || attr3 attr2\"\r\nvar4=\"if(attr1 == attr2 ? attr3[1]) || [attr3[2]]\">\n\n* <<var1>>\r\n* <<var2>>\r\n* <<var3>>\r\n* <<var4>>\n\n</$setvars>\r\n```\n\n; documentation / examples / demos...\r\n: http://tobibeer.github.io/tw5-plugins#setvars"
},
"$:/plugins/tobibeer/setvars/widgets.js": {
"title": "$:/plugins/tobibeer/setvars/widgets.js",
"text": "/*\\\r\ntitle: $:/plugins/tobibeer/setvars/widgets.js\r\ntype: application/javascript\r\nmodule-type: widget\r\n\r\nAllows to set multiple variables in one go joining widget attributes:\r\n\r\n@preserve\r\n\\*/\n(function(){\"use strict\";var e=require(\"$:/core/modules/widgets/widget.js\").widget;var t=function(t,i){e.call(this);this.initialise(t,i)};t.prototype=Object.create(e.prototype);t.prototype.render=function(e,t){this.parentDomNode=e;this.computeAttributes();this.execute();this.renderChildren(e,t)};t.prototype.execute=function(){var e=this,t=function(t,i,s){var r,n,f=s[3],h=s[4],a=s[5],l=s[6],u=parseInt(f),c=parseInt(h),o=i||f||h;if(i){n=e.wiki.filterTiddlers(t,e)}else{n=f||h?$tw.utils.parseStringArray(t):[t]}r=n.length;if(r&&(f||h)){if(f===\"n\"){u=r}else if(f===\"-n\"){u=1}else if(!f){u=1}if(h===\"n\"){c=r}else if(h===\"-n\"){c=-(u<0?r+u+1:u)}else if(!h){c=1}u=Math.max(1,u<0?r+u+(c<0?c+2:1):c<0?u+c+1:u);c=Math.max(1,Math.abs(c));n=n.splice(u-1,c)}if(!n.length&&a){n.push(a)}return o?l===undefined?$tw.utils.stringifyList(n):n.join(l):n[0]};if(!this.refreshing){this.refreshing=0;this.$={vars:{},attr:{},set:{}};$tw.utils.each(this.attributes,function(t,i){if(i===\"$refresh\"){e.refreshAll=1}else if(i.charAt(0)===\"_\"){e.$.attr[i.substr(1)]=t}else{e.$.vars[i]=t}})}if(this.refreshing<2){$tw.utils.each(e.$.vars,function(i,s){var r,n,f,h,a,l,u=\"\",c=0,o=0,g=\"\",p=i,d=[[/^\\s+/,1,function(){return false}],[/^\\\\([^\\\\]*)\\\\/,2,function(e){return e[1]}],[/^(if\\s*\\(|\\(|\\?|\\|\\||\\)|==|!=)/i,0,function(e){var t=e[1];if(t.charAt(t.length-1)===\"(\"){r=1;if(c){o=1}else{f=c=0;h=\"\";if(t.length===1){f=1}}}else{switch(t){case\"||\":if(u.length){c=1}break;case\"?\":if(r&&!o){f=h.length;c=!f;h=\"\"}break;case\")\":if(r){if(f){g+=h}r=f=c=0;h=\"\"}o=0;break;case\"==\":case\"!=\":if(r){n=t}break}}return false}],[/^(\\[)?(\\w+)(?:\\[(-?\\d*|-?n)(?:,(-?\\d*|-?n))?\\])?(?:\\[([^\\]]*)\\])?(?:\\[([^\\]]*)\\])?(\\])?/,2,function(i){var s=e.$.attr[i[2]];if(s===undefined){s=e.$.set[i[2]]}if(s){if(i[1]&&i[7]){s=t(s,true,i)}else if(!i[1]&&!i[7]){s=t(s,false,i)}else{s=null}}else{s=\"\"}return s}]];while(p.length){l=p;var v=\"\";$tw.utils.each(d,function(e){var t=e[0].exec(p);if(t){if(!c||!e[1]){v=e[2].call(this,t);if(v===null){v=\"error: missing bracket in setvars\"}else if(typeof v===\"string\"){u=v}}a=e[1]===2;p=p.substr(t[0].length);return false}});if(v){if(r){if(n){u=n===\"==\"&&h===v||n===\"!=\"&&h!==v?\"true\":\"\";h=u;n=\"\"}else{h+=v}}else if(!c){g+=v}}if(!r&&a){c=0}if(l===p){g=\"setvars error: invalid syntax\";p=\"\"}}e.$.set[s]=g;e.setVariable(s,g)})}if(!this.refreshing||this.refreshing===2){this.makeChildWidgets()}};t.prototype.refresh=function(e){var t=0,i,s=this,r=this.computeAttributes();if(Object.keys(r).length){this.refreshSelf();return true}else if(this.refreshAll){i=JSON.parse(JSON.stringify(this.$.set));this.refreshing=1;this.execute();$tw.utils.each(i,function(e,i){if(e!==s.$.set[i]){t=1;return false}});if(t){this.refreshing=2;this.refreshSelf();return true}this.refreshing=0}return this.refreshChildren(e)};exports.setvars=t})();",
"type": "application/javascript",
"module-type": "widget"
}
}
}
System Reference Document
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/AdvancedSearch/Filter
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/Fields
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/ControlPanel/Palette
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/ControlPanel/Advanced
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/Tagging
$:/core/ui/ControlPanel/Stylesheets
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/ControlPanel/Appearance
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/References
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/Tools
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/TiddlerInfo/SubItems
$:/core/ui/ControlPanel/Toolbars/PageControls
[tag[Spells]search:title[Greater]]
{
"tiddlers": {
"$:/info/browser": {
"title": "$:/info/browser",
"text": "yes"
},
"$:/info/node": {
"title": "$:/info/node",
"text": "no"
},
"$:/info/url/full": {
"title": "$:/info/url/full",
"text": "file:///storage/emulated/0/andtidwiki/Starfinder.html"
},
"$:/info/url/host": {
"title": "$:/info/url/host",
"text": ""
},
"$:/info/url/hostname": {
"title": "$:/info/url/hostname",
"text": ""
},
"$:/info/url/protocol": {
"title": "$:/info/url/protocol",
"text": "file:"
},
"$:/info/url/port": {
"title": "$:/info/url/port",
"text": ""
},
"$:/info/url/pathname": {
"title": "$:/info/url/pathname",
"text": "/storage/emulated/0/andtidwiki/Starfinder.html"
},
"$:/info/url/search": {
"title": "$:/info/url/search",
"text": ""
},
"$:/info/url/origin": {
"title": "$:/info/url/origin",
"text": "file://"
},
"$:/info/browser/screen/width": {
"title": "$:/info/browser/screen/width",
"text": "1600"
},
"$:/info/browser/screen/height": {
"title": "$:/info/browser/screen/height",
"text": "2561"
},
"$:/info/browser/language": {
"title": "$:/info/browser/language",
"text": "en-US"
}
}
}
{
"tiddlers": {
"$:/themes/tiddlywiki/snowwhite/base": {
"title": "$:/themes/tiddlywiki/snowwhite/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\ncanvas.tc-edit-bitmapeditor {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n"
}
}
}
{
"tiddlers": {
"$:/themes/tiddlywiki/vanilla/themetweaks": {
"title": "$:/themes/tiddlywiki/vanilla/themetweaks",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
"text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n"
},
"$:/themes/tiddlywiki/vanilla/base": {
"title": "$:/themes/tiddlywiki/vanilla/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n`\"`<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\"`\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n`\"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>`\"`\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n background-color: transparent;\n}\n\n\"\"\">>\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 14px;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n border-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n left: -50px;\n top: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n right: -80px;\n bottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\nbutton, textarea, input, select {\n\toutline-color: <<colour primary>>;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n vertical-align: middle;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\ttop: -1000px;\n\tleft: -1000px;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n \tcursor: pointer;\n\tcolor: <<colour foreground>>;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-primary-btn {\n \tbackground: <<colour primary>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n\twidth: calc(100% + 2px);\n\tmargin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-size: 0.75em;\n\t}\n\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 400;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tvertical-align: text-bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n font-size: 1rem;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.2em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-tiddler-missing .tc-title {\n font-style: italic;\n font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button,\n.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\n.tc-search button svg, .tc-search a svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n height: 1.2em;\n width: 1.2em;\n margin: 0 0.25em;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tbackground-color: <<colour tiddler-editor-background>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-body {\n\tclear: both;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-add-tag .tc-keyboard {\n\tdisplay:inline;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 49%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\n\twidth: 49%;\n}\n\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\n\tmax-width: 49%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name {\n\tdisplay: inline-block;\n\twidth: 15%;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n\twidth: 40%;\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n width: auto;\n margin-bottom: 0px;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\n}\n\n.tc-drop-down .tc-dropdown-item-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-search-results {\n\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 900;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tmargin-right: 0.3em;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\tmargin-right: 0;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical {\n word-break: break-word;\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\t\n}\n\n.tc-manager-controls {\n\t\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n display: block;\n width: 100%;\n text-align: left;\t\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n flex: 1 0;\n background: <<colour tiddler-editor-background>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n white-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n background: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n padding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n flex: 3 1;\n border-left: 0.5em solid <<colour muted-foreground>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tmax-width: 500px;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 28px;\n\tpadding: 14px 14px 14px 14px;\n\tborder: 2px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 14px;\n\tright: 14px;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom-none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: block;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground-colour: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover .tc-plugin-info > .tc-plugin-info-chunk > svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info-chunk {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-plugin-info-chunk h1 {\n\tfont-size: 1em;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk h2 {\n\tfont-size: 0.8em;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk div {\n\tfont-size: 0.7em;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info:hover > .tc-plugin-info-chunk > img, .tc-plugin-info:hover > .tc-plugin-info-chunk > svg {\n\twidth: 2em;\n\theight: 2em;\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info > .tc-plugin-info-chunk > img, .tc-plugin-info > .tc-plugin-info-chunk > svg {\n\twidth: 2em;\n\theight: 2em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-plugin-info.tc-small-icon > .tc-plugin-info-chunk > img, .tc-plugin-info.tc-small-icon > .tc-plugin-info-chunk > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 1em 1em;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n vertical-align: text-bottom;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\twidth: 2em;\n\tvertical-align: -0.15em;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n\ttext-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n \tpadding-left: 14px;\n}\n\n.tc-tree ol {\n \tlist-style-type: none;\n \tpadding-left: 0;\n \tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n \tpadding-left: 1em; \n}\n\n.tc-tree button { \n \tcolor: #acacac;\n}\n\n.tc-tree svg {\n \tfill: #acacac;\n}\n\n.tc-tree span svg {\n \twidth: 1em;\n \theight: 1em;\n \tvertical-align: baseline;\n}\n\n.tc-tree li span {\n \tcolor: lightgray;\n}\n\nselect {\n color: <<colour select-tag-foreground>>;\n background: <<colour select-tag-background>>;\n}\n\n"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
"text": "15px"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
"text": "22px"
},
"$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
"text": "14px"
},
"$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
"text": "20px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storytop": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyright": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
"text": "686px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
"text": "960px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth",
"text": "350px"
},
"$:/themes/tiddlywiki/vanilla/options/stickytitles": {
"title": "$:/themes/tiddlywiki/vanilla/options/stickytitles",
"text": "no"
},
"$:/themes/tiddlywiki/vanilla/options/sidebarlayout": {
"title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout",
"text": "fixed-fluid"
},
"$:/themes/tiddlywiki/vanilla/options/codewrapping": {
"title": "$:/themes/tiddlywiki/vanilla/options/codewrapping",
"text": "pre-wrap"
},
"$:/themes/tiddlywiki/vanilla/reset": {
"title": "$:/themes/tiddlywiki/vanilla/reset",
"type": "text/plain",
"text": "/*! normalize.css v3.0.0 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n * user zoom.\n */\n\nhtml {\n font-family: sans-serif; /* 1 */\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n margin: 0;\n}\n\n/* HTML5 display definitions\n ========================================================================== */\n\n/**\n * Correct `block` display not defined in IE 8/9.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; /* 1 */\n vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9.\n * Hide the `template` element in IE, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n display: none;\n}\n\n/* Links\n ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n background: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n outline: 0;\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9, Safari 5, and Chrome.\n */\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n */\n\nb,\nstrong {\n font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari 5 and Chrome.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari 5, and Chrome.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9.\n */\n\nimg {\n border: 0;\n}\n\n/**\n * Correct overflow displayed oddly in IE 9.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari 5.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n * Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; /* 1 */\n font: inherit; /* 2 */\n margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10.\n */\n\nbutton {\n overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8+, and Opera\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n * and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n * `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\n * (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; /* 2 */\n box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n border: 0; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n font-weight: bold;\n}\n\n/* Tables\n ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
"text": "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\""
},
"$:/themes/tiddlywiki/vanilla/settings/codefontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily",
"text": "\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace"
},
"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": {
"title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment",
"text": "fixed"
},
"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": {
"title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize",
"text": "auto"
},
"$:/themes/tiddlywiki/vanilla/sticky": {
"title": "$:/themes/tiddlywiki/vanilla/sticky",
"text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n\n``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"
}
}
}
As a reaction when an ally within 60 feet of you is reduced to 0 HP and would become unconscious, you can compel them to stay up and stagger out of the fray. The ally remains conscious, becomes [[nauseated]], and gains temporary Hit Points equal to your envoy level + your Charisma modifier until the end of their next turn. Afterward, if the ally has 0 Hit Points, they become unconscious and [[dying]] as normal, including losing 1 Resolve Point at the end of their turn. Once a creature has been affected by this improvisation, they’re immune to it for 24 hours.
At 6th level, the ally becomes [[staggered]] and [[off-target]] rather than nauseated. If the ally is stable and unconscious and spends 1 Resolve Point to regain 1 HP within 1 minute of falling unconscious, they instead regain HP equal to your envoy level + your Charisma modifier.
This is a language-dependent, mind-affecting, sense-dependent effect.
<div class="statblock">
* ''Tier'' 2
* Tiny fighter
* ''Speed'' 10; ''Maneuverability'' good (turn 1); ''Drift'' 1
* ''AC'' 18; ''TL'' 17
* ''HP'' 35; ''DT'' —; ''CT'' 7
* ''Shields'' basic 40 (forward 10, port 10, starboard 10, aft 10)
* ''Attack (Forward)'' light buster cannon (3d8; 5 hexes), light plasma torpedo launcher (3d8; 20 hexes)
* ''Attack (Aft)'' flak thrower (3d4; 5 hexes)
* ''Power Core'' Pulse Brown (90 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic medium-range sensors, crew quarters (common), mk 4 armor, mk 3 defenses, mk 1 duonode computer, security (biometric locks); ''Expansion Bays'' none
* ''Modifiers'' +1 to any 2 checks per round, +2 [[Computers]] (sensors only), +1 [[Piloting]]
* ''Complement'' 2 (minimum 1, maximum 2)
!!! CREW
* ''Pilot'' gunnery +6 (2nd level), [[Piloting]] +13 (2 ranks)
* ''Gunner'' [[Computers]] +7 (2 ranks), [[Engineering]] +7 (2 ranks), gunnery +6 (2nd level)
</div>
Manufactured by the Allied Arms Corporation (AAC) of Triaxus, the Dyad is a mainstay of the Skyfire Legion's mercenary fleet. From escorting corporate mining expeditions to providing an orbital guard for fledgling colonies operating outside Steward protection, variations of the Dyad have defended against space pirates and raiders for generations. Most Skyfire Legion Dyad crews consist of a bonded ryphorian-dragonkin pair whose near-telepathic connection enables flawless teamwork. Even those who manage to steal a Dyad often find the vessel doesn't handle well for unfamiliar pilots—not only thanks to the oversized back seat built for a dragonkin's frame, but also because the controls are infamously finicky if the operators don't carefully coordinate their movements.
Dyads typically deploy in fleets up to 16 strong, supported by an [[AAC Hoardmaster]], the Skyfire Mandate's premier carrier. The smaller fighters occasionally operate independently for several weeks at a time when patrolling protected space or tracking a posted bounty. For a starship designed for long-range escort missions, the Dyad has only minimal amenities, with most spaces awkwardly constrained by the starship's impressive arsenal. Even so, a Dyad's aft crew space contains a miniature cargo closet where dragonkin co-pilots often store their "hoards" of personal armaments. These compartments, coupled with the vessels' military renown, make decommissioned Dyads highly desirable for both legal and illicit cargo-hauling operations.
Corporations occasionally employ Dyads when operating within lawless sectors because of their intimidation factor. Pirates and Free Captains tend to provide wide berth to a Dyad after spotting its distinctive forward-swept wings, preferring to target easier prey rather than risk incurring the wrath of the Skyfire Legion. On the other hand, those criminals fortunate enough to steal and retrofit a Dyad can exploit the Legion's vaunted reputation to approach and overpower cargo vessels before their crews are any the wiser. The Skyfire Legion takes such instances of mimicry very seriously, either dispatching starships to eliminate the imposters or hiring trusted freelancers to destroy the vessels completely.
Demand for both the Dyad and Hoardmaster spiked after the Pact Worlds' initial diplomatic missions to the Azlanti Star Empire failed, raising concerns of Azlanti raiders. Even though the Empire hasn't directly threatened the Pact Worlds in the decades since, the Skyfire Legion has commissioned hundreds more Dyads and accelerated pilot training in response to growing demand for the Legion's services.
<div class="statblock">
* ''Tier'' 14
* Gargantuan carrier
* ''Speed'' 4; ''Maneuverability'' poor (turn 3); ''Drift'' 1
* ''AC'' 25; ''TL'' 24
* ''HP'' 330; ''DT'' 10; ''CT'' 66
* ''Shields'' heavy 480 (forward 120, port 120, starboard 120, aft 120)
* ''Attack (Forward)'' mega teleportation beam (1d20×10; 20 hexes)
* ''Attack (Port)'' twin laser (5d8; 20 hexes)
* ''Attack (Starboard)'' twin laser (5d8; 20 hexes)
* ''Attack (Turret)'' laser net (2d6; 5 hexes)
* ''Power Core'' Gateway Ultra (500 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic long-range sensors, crew quarters (common), mk 5 armor, mk 5 defenses, mk 3 trinode computer; ''Expansion Bays'' [[combat training facility]] (elite), [[cargo hold]], [[hangar bays]] (2), [[tech workshop]]
* ''Modifiers'' +3 to any 3 checks per round, +2 [[Computers]] (sensors only), –1 [[Piloting]]
* ''Complement'' 111 (minimum 75, maximum 200)
!!! CREW
* ''Captain'' [[Bluff]] +25 (14 ranks), [[Diplomacy]] +25 (14 ranks), [[Intimidate]] +30 (14 ranks), [[Piloting]] +26 (14 ranks)
* ''Engineers (3 officers, 10 crew each)'' [[Engineering]] +30 (14 ranks)
* ''Gunners (3 officers, 10 crew each)'' gunnery +20 (14th level)
* ''Pilots (2 officers, 10 crew each)'' [[Piloting]] +26 (14 ranks)
* ''Science Officers (2 officers, 10 crew each)'' [[Computers]] +25 (14 ranks)
</div>
A product of the Allied Arms Corporation (AAC) of Triaxus, the Hoardmaster is the flagship of the Skyfire Legion's mercenary fleet. The aptly named carrier can launch over a dozen smaller craft into battle. Designed to operate in tandem with [[AAC Dyads]], this specialized carrier has experienced a surge in popularity during the past 50 years.
The echoes of the Swarm War, combined with the identification of other potential threats to the Pact Worlds, have created myriad opportunities for the Skyfire Legion's iconic vessels to showcase their might. Most recently, a pair of Hoardmasters defended competing corporate mining interests in the Vast against Swarm reconnaissance teams. Their Dyad squads covered the emergency extraction of a Veskarium mining colony's ground assets while simultaneously protecting nearby Pact Worlds transports as the Hoardmasters warmed up their Drift engines for the retreat to safety. Live vidstream coverage of the maneuver inspired a host of hopeful Skyfire recruits across Near Space, bringing new interplanetary relevancy to an already potent mercenary force.
Though the Hoardmaster is slow, each carries a complement of up to 16 Dyads that can be launched at a moment's notice via catapult tubes integrated throughout its hull. The Skyfire Legion encourages soldiers to maintain constant battle-readiness; to this end, all Skyfire Legion Hoardmasters incorporate state-of-the-art combat training facilities.
As with Skyfire Legion Dyads, most Hoardmaster crews consist of bonded ryphorian-dragonkin pairs whose deep connection allows teamwork otherwise deemed practically impossible. Given the fleet of Dyads—and their pilots—often aboard a Hoardmaster, co-pilots of these massive carriers must be of the highest caliber, chosen only after lengthy training and testing periods. Piloting a Hoardmaster is considered a high honor among the members of the Skyfire Legion, and competition to even qualify for consideration is fierce among pilot pairs. In fact, more than a few duos have pulled foolhardy flying stunts in Dyads and played dangerous political games in an attempt to get noticed as potential Hoardmaster pilots.
<div class="statblock">
* ''CR'' 4; ''XP'' 1,200
* LE Medium undead
* ''Init'' +1; ''Senses'' [[darkvision]] 60 ft., [[blindsense]] (thought) 30 ft.; ''Perception'' +10
!!! DEFENSE
* ''HP'' 43
* ''EAC'' 15; ''KAC'' 16
* ''Fort'' +3; ''Ref'' +3; ''Will'' +9
* ''DR'' 5/magic; ''Immunities'' [[undead immunities]]; ''SR'' 15
!!! OFFENSE
* ''Speed'' 30 ft., fly 20 ft. ([[Su]], perfect)
* ''Melee'' claw +8 (1d4+4 S plus [[grab]])
* ''Offensive Abilities'' ritual scar
* ''Spell-Like Abilities'' (CL 4th; ranged +8)
** 1/day—//[[inflict pain]]// (DC 17), //[[mind thrust]]// (2nd level, DC 17)
** 3/day—//[[command]]// (DC 16), //[[detect thoughts]]// (DC 16), //[[fear]]// (DC 16)
** At will—//[[ghost sound]]// (DC 15), //[[telekinetic projectile]]//
!!! STATISTICS
* ''Str'' +0; ''Dex'' +1; ''Con'' —; ''Int'' +5; ''Wis'' +1; ''Cha'' +3
* ''Skills'' [[Athletics]] +10, [[Intimidate]] +15, [[Mysticism]] +15, [[Stealth]] +15
* ''Languages'' Aklo, Common, up to three others; [[limited telepathy]] 30 ft.
* ''Other Abilities'' [[unliving]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or circle (1 plus 3–5 [[occult zombies]])
!!! SPECIAL ABILITIES
''Ritual Scar ([[Su]])'' An aanung-an that starts its turn grappling a creature can attempt to carve a ritual scar into its victim's body as a standard action, afflicting it with potent magic. The aanung-an attempts a [[Mysticism]] check (DC = 20 + target's level or CR). On a success, the aanung-an renews the grapple, and the target takes 1d6+4 slashing damage as the aanung-an claws a symbol into its body. The target must then succeed at a DC 15 Will saving throw or suffer one of the following effects of the aanung-an's choice: //[[bestow curse]]//, //[[slow]]//, or //[[suggestion]]//. These effects function at the aanung-an's caster level. Certain aanung-ans might inflict different or unique effects with this ability, at the GM's discretion.
</div>
Aanung-ans, sometimes called the occulted dead, are rare undead creatures that rise from the corpses of those who died while performing vile and malignant occult rituals. Rising as gangly, emaciated corpses attired in ritual trappings, aanung-ans wield obscure lore in service to unknowable agendas. Some scholars theorize that aanung-ans are somehow linked to one another and are attempting to enact a galaxy-wide ritual, though none agree on their final goal. Conjecture runs from summoning an eldritch horror from beyond space and time to snuffing out all life in the blink of an eye.
While aanung-ans are almost always solitary, rumors persist of individual aanung-ans raising small cabals of zombies to function as bodyguards and servants. Such aanung-ans are likely very powerful spellcasters with sinister schemes.
!! Aanung-an Template Graft
Any creature that dies while performing dark rituals for evil purposes risks rising again as one of the occult dead.
* ''CR:'' 4+
* ''Required Creature Type:'' Undead
* ''Suggested Array:'' Spellcaster
* ''Traits:''
** [[Blindsense]] (thought) 30 ft.
** ritual scar (see above)
** [[Mysticism]] as a master skill
* ''Suggested Ability Modifiers:'' Intelligence, Wisdom, Charisma.
The mortal offspring of celestials,many aasimars have glowing eyes or a metallic sheen to their hair and skin. The Radiant Cathedral trains aasimars to become beacons of the Sarenite faith.
!! Racial Traits
* ''Hit Points:'' 4
* ''Size and Type:'' Aasimars are Medium outsiders with the native subtype.
* ''Ability Adjustments:'' +2 Cha
* ''Celestial Radiance:'' As a standard action, an aasimar can shed light, causing light within 10 feet of him to increase two steps, up to bright, and light for 10 more feet beyond that to increase one step, up to normal. This lasts for 1 minute, but the aasimar can dismiss it as a swift action. Magical darkness can decrease the light level in this area only if it's from an item or creature of a level or CR higher than that of the aasimar. An aasimar can use this ability once per day, plus a number of times equal to half his CR or level.
* ''Celestial Resistance:'' Aasimars have [[resistance]] 5 to acid, cold, and electricity.
* ''Darkvision:'' Aasimars have [[darkvision]] to a range of 60 feet.
* ''Skilled:'' Naturally eloquent and perceptive, aasimars gain a +2 racial bonus to [[Diplomacy]] and [[Perception]] checks.
!!! Alternate Racial Traits
* ''Armor Avatar:'' Aasimars descended from armor-plated celestials have an affinity for armor—it fits perfectly and protects more efficiently, as though it were an extension of the assimar themself. When wearing armor, they gain a +1 racial bonus to AC. When they’re wearing heavy armor, their armor check penalty is 1 less severe than normal. This replaces celestial radiance.
* ''Celestial Heroism:'' Many aasimars born of the wild freedom of Elysium can bring forth the heroic spirit in others, driving them to fight their hardest. As a swift action, the aasimar can bolster the spirit of a willing creature within 30 feet. The bolstered creature gains a +1 morale bonus to damage rolls and saving throws, and suffers no penalties for charging. These benefits last for 1 minute or until the aasimar uses this ability again. This is a mind-affecting effect. The aasimar can bolster spirits in this way once per day, plus a number of times equal to half their CR or level. This replaces celestial radiance and skilled.
* ''Celestial Judgement:'' Aasimars descended from Heaven’s celestial hierarchy can pass judgment on their foes, enforcing their will with the menace of celestial wrath. As a standard action, the aasimar chooses a creature they can see within 20 feet, who must attempt a Will save (DC = 10 + half the scion’s level or CR + the scion’s key ability modifier). On a failure, the target suffers a –1 penalty to attack rolls and saving throws for 1 minute or until the aasimar is no longer conscious, whichever comes first. This is a mind-affecting effect. The aasimar can menace foes this way once per day, plus a number of times equal to half their CR or level. This replaces celestial radiance and skilled.
* ''Celestial Solace:'' Many aasimars born of the comfort of Nirvana are beacons of hope, uplifting their allies with warm glances and gentle words. As a swift action, the aasimar can impart hope to a creature within 30 feet who has 0 Stamina Points (or is at half Hit Points or fewer for creatures that don’t have Stamina Points), granting that creature temporary Hit Points equal to the aasimar’s level or CR and a +1 divine bonus to AC. These benefits last for 1 minute or until the aasimar uses this ability again. This is a mind-affecting effect. The aasimar can impart hope in this way once per day, plus a number of times equal to half their CR or level. This replaces celestial radiance and skilled.
* ''Celestial Voyager:'' The devas who watch over the planes lend their aasimar descendants the ability to reach across planar borders, summoning allies of raw quintessence. These aasimars can cast the first-level version of //[[summon creature]]// as a spell-like ability, choosing one type of creature for each character level they gain. This otherwise acts as gaining //summon creature// as a spell known for all purposes, including changing selections and meeting requirements of selected creatures. At 4th level and every 4 levels thereafter, this ability increases by 1 spell level, to a maximum of sixth level at 20th level. The aasimar can summon allies in this way once per day. This replaces celestial radiance and skilled.
* ''Myopic Resilience:'' Some aasimars build a particularly intense resistance rather than developing diverse resistances. When selecting this trait, the aasimar chooses a single energy type to which they normally have resistance—acid, cold, or electricity. The scion loses resistance to the other energy types, but the resistance they choose increases to 10 at 8th level and to 15 at 12th level. This ability alters celestial resistance.
* ''Winged Scion:'' An aasimar with this alternate racial trait has a pair of fully developed wings sprouting from their back. Angel wings are the most iconic, but by no means are these the only manifestations. An aasimar with this trait has an extraordinary fly speed of 30 feet with average maneuverability. This replaces celestial radiance.
!! Aasimar Template Graft
More imposing and beautiful than their mundane kin, an aasimar has celestial ancestry.
* ''Required Creature Type and Subtype:'' outsider (native)
* ''Suggested Alignment:'' any nonevil
* ''Traits:''
** [[darkvision]] 60 ft.
** [[resistance]] 5 to acid, cold, and electricity
** celestial radiance (see above) usable a number of times per day equal to 1 + half the creature's CR
* ''Suggested Ability Score Modifiers:'' Charisma, Wisdom
!! Celestial Radiance Graft
{{Celestial Radiance}}
AbadarCorp's Defender line of ranged weaponry includes a built-in friend-or-foe protocol that prevents it from firing in a situation where it could target a creature programmed to be recognized as a friend. You can add an ally to the protocol's list of friends as a move action, provided the ally is within the weapon's first range increment at the time. Each Defender weapon has a built-in scanner that can be pointed at a target without needing to aim the weapon. In other words, you can point the Defender weapon's scanner, rather than the weapon itself, at a chosen ally. A Defender weapon's list initially includes juvenile sentient creatures and recognized law enforcement officials as friends. You can download new friend parameters to add to your protocol's list, too, as well as grant others permission to transmit their friend parameters to your list.
You can remove or modify the initial programming by succeeding at a [[Computers]] check (DC = 15 + 1-1/2 × the weapon's item level). If you fail the check, the Defender's anti-tampering software kicks in, and the weapon won't fire at all. To reactivate it, you must reset it by succeeding at a Computers check with the same DC as the first check, or take the weapon to an Abadar Corp dealer or contact one via an infosphere network to have it reset for a fee equal to 10% of the item's price. Each time you fail to reset the anti-tampering software, the DC to try again increases by 5.
A Defender weapon relies on visual scans and limited biometric data to identify friends. It can be fooled by illusions and similar optical tricks, including a good disguise, even with regard to its initial programming. If the need arises, as a standard action, you can remove a friend from the list of friends included in your weapon's protocol. That friend can be added back to the list as a move action.
The Defender protocol allows you to avoid shooting friends. When you use a weapon's automatic special property, the protocol excludes friends as possible targets. The weapon fires no ammunition at a friend. A Defender weapon with the [[blast]], [[explode]], or [[line]] special property won't fire if a friend would be hit by the area effect.
When you openly carry a Defender weapon, law enforcement officers might react more positively toward you. This response is likely in situations where your weapons are an issue, especially when you carry no other obvious armaments or when you allow an officer to modify the protocol to protect potential targets. The GM can grant you up to a +2 circumstance bonus to checks to interact with law enforcement officers when your carrying a Defender weapon is applicable. This bonus can apply to other characters in similar circumstances, such as the bodyguards of an icon added as friends to your weapon's protocol.
A Defender weapon usually costs 10% more than normal, but weapons that have the [[automatic]] special property cost 20% more than normal.
<div class="statblock">
* ''Tier'' 1
* Tiny starship drone
* ''Speed'' 6; ''Maneuverability'' perfect (turn 0); ''Drift'' 5
* ''AC'' 13; ''TL'' 13
* ''HP'' 15; ''DT'' —; ''CT'' 3
* ''Shields'' none
* ''Power Core'' Pulse Blue (200 PCU); ''Drift Engine'' Signal Ultra
* ''Systems'' basic computer, budget medium-range sensors, tier 1 [[virtual intelligence]]
* ''Modifiers'' +3 [[Piloting]]
* ''Complement'' 0 (minimum 0, maximum 0)
!!! CREW
* ''Virtual Intelligence'' [[Computers]] +7 (1 rank), [[Piloting]] +7 (1 rank)
</div>
The AbadarCorp Bolt is the archetypal Drift drone—it carries information between the stars as quickly as possible without putting sapient lives at risk in the Drift. The Bolt boasts one of the most powerful and miniaturized Drift engines ever designed; this engine alone takes up about one-third of its overall mass, and another third is dedicated to the power core necessary for the engine.
Sensors and maneuvering thrusters are attached to the exterior of this compact device, and a sophisticated computer handles basic astrogation and interprets data from onboard systems. Once given a destination and a recipient for its data, the Bolt attempts to navigate through the Drift; if it manages this task successfully, it scans for its recipient, transmits its data, and awaits further instructions from preauthorized users.
For situations where heavy armor might be a faux-pas, AbadarCorp designed the CelPro (Celebrity Protection) line. Comprised of metal and polyceramic, reinforced with concealed contingent forcefields like their Travel Suit line, this heavy armor resembles mundane, if somewhat bulky, clothing— typically full-length gowns, coats, or business suits. An observer who succeeds at a [[Perception]] check (DC 10 + the armor's level + the wearer's Charisma modifier) can discern the outfit's armored nature.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br>Bonus | KAC<br>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br>Slots | Bulk |h
|AbadarCorp CelPro, local | 2 | 900 | +2 | +4 | +3 | –1 | ‐5 ft. | 0 | 1 |
|AbadarCorp CelPro, elite | 6 | 5,100 | +8 | +10 | +4 | –1 | –5 ft. | 1 | 1 |
|AbadarCorp CelPro, idol | 10 | 18,100 | +13 | +15 | +4 | –1 | –5 ft. | 2 | 1 |
|AbadarCorp CelPro, stellar | 14 | 75,500 | +17 | +19 | +5 | –2 | –5 ft. | 3 | 1 |
|AbadarCorp CelPro, galactic | 18 | 380,000 | +23 | +25 | +5 | –2 | –5 ft. | 4 | 1 |
</div>
AbadarCorp executives popularized these light armor business suits for boardrooms and diplomatic meetings. Contingent force fields and concealed rebreathers protect the wearer in hostile environmental conditions. Higher grades of travel suits offer more protection—along with a designer label.
<div class= "table-wrapper">
|Armor | Level | Price | EAC<br/>Bonus | KAC<br/>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br/>Slots | Bulk |h
|AbadarCorp travel suit, silver | 7 | 7,250 | +6 | +7 | +7 | — | — | 0 | L |
|AbadarCorp travel suit, gold | 9 | 12,100 | +9 | +10 | +8 | — | — | 0 | L |
|AbadarCorp travel suit, platinum | 12 | 30,750 | +12 | +13 | +8 | — | — | 0 | L |
</div>
This item consists of six 1-foot-square circuit boards soldered together at their edges to form a box. One of the sides is hinged, forming a lid. Although the box appears empty, it rattles occasionally, as if something inside is seeking to escape. While anacites across Aballon create these items, Those Who Wait prefer to stockpile them for future use, but Those Who Become send as many of these boxes into the galaxy as possible for unspoken reasons.
When you speak a command word and open the lid of the box as a standard action, a collection of fist-sized microbots swarms out of the box and circles you, granting you concealment against all attacks for 5 rounds before they collapse into 1 bulk of inert scrap. This function can be used once per day.
The scrap can be used as the target of any spell with the word "junkbot" in the name, and the duration of such a spell increases by 1 round. The refuse left over at the end of the spell magically returns to the box, as does the scrap if it remains unused 4 hours after being created.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//Aballonian drone box// | 11 | 24,500 | 1 |
</div>
An aberration has a bizarre anatomy, strange abilities, an alien mindset, or any combination of the three.
* ''Traits:'' [[darkvision]] 60 ft.
* ''Adjustments:'' +2 to Will saving throws
Some monsters can cause ability damage, which penalizes one or more of your ability scores. This can add up quickly, so you need to track the total ability damage you've taken to each ability score.
For every 2 damage you take to an ability score, reduce your ability modifier by 1 for skills and other statistics affected by that ability. If your total damage to one ability is equal to your score in that ability, you cease taking damage to that ability score, but you fall unconscious until the amount of damage is less than your score. However, if you take Constitution damage that equals your Constitution score, you instead immediately die.
You recover from ability damage to each affected ability score at a rate of 1 per day. Spells such as lesser restoration can also heal ability damage.
Reductions to your ability score modifier from ability damage affect skill checks and ability checks that use that ability score, as well as on the DCs of spells and other abilities based on that score. If you take damage to your key ability score, you also lose 1 RP for every 2 damage you have taken to that ability score. The entries below describe other rolls affected by the reduced modifier.
* ''Strength:'' Attack rolls that rely on Strength (usually melee) and weapon damage rolls that rely on Strength (usually melee or thrown).
* ''Dexterity:'' Armor Class, attack rolls that rely on Dexterity (usually ranged, or melee weapons with the [[operative]] property), initiative checks, and Reflex saves.
* ''Constitution:'' Fortitude saves. You also lose a number of Stamina Points equal to your level for every 2 damage you have taken to Constitution. For example, if you're 4th level and you took 5 Constitution damage, you'd lose 8 SP.
* ''Wisdom:'' Will saves.
!! Ability Penalties
Sometimes you might take a penalty to ability checks or to an ability score, rather than ability damage. These penalties affect your modifier the same way as damage, but they are only temporary and can't result in your falling unconscious or dying.
!! Ability Drain
More severe than ability damage, ability drain reduces your ability score permanently. Note that this affects your score directly instead of penalizing your modifier, so 1 ability drain changes your modifier if your original ability score was even, but not if it was odd. Modify all statistics related to the ability's new value. This might make you lose skill ranks along with Resolve Points, Stamina Points and other bonuses gained from having a high ability score. If you take ability drain in the middle of a battle, the GM might have you treat it as damage until after the fight so recalculating your statistics doesn't slow the game. Ability drain doesn't heal naturally but can be healed by the //[[restoration]]// spell.
In general, if any ability score is reduced to 0 from ability drain, you fall unconscious. If that score is Constitution, you instead immediately die.
!! The Six Abilities
!!! Strength (Str)
Strength measures muscle and physical power. A character with a Strength score of 0 is unconscious. Your character's Strength modifier is factored into the following:
* Melee attack rolls and attack rolls made with thrown weapons.
* Damage rolls when using melee weapons or thrown weapons.
* [[Athletics]] skill checks.
* Strength checks (for breaking down doors and the like).
* How much gear your character can carry.
!!! Dexterity (Dex)
Dexterity measures agility, balance, and reflexes. A character with a Dexterity score of 0 is unconscious. Your character's Dexterity modifier is factored into the following:
* Ranged attack rolls, such as those made with projectile weapons and energy weapons, as well as some spells.
* Energy Armor Class (EAC) and Kinetic Armor Class (KAC).
* Reflex saving throws (for leaping out of harm's way).
* [[Acrobatics]], [[Piloting]], [[Sleight of Hand]], and [[Stealth]] skill checks.
!!! Constitution (Con)
Constitution represents your character's health. A living creature whose Constitution score reaches 0 dies. Your character's Constitution modifier is factored into the following:
* Stamina Points, which represent the damage your character can shrug off before it starts to be a problem. If this score changes enough to alter its modifier, your character's Stamina Points increase or decrease accordingly.
* Fortitude saves (to resist diseases, poisons, and similar threats).
!!! Intelligence (Int)
Intelligence represents how well your character learns and reasons, and is often associated with knowledge and education. Animals have Intelligence scores of 1 or 2, and any creature capable of understanding a language has a score of at least 3. A character with an Intelligence score of 0 is unconscious. Your character's Intelligence modifier is factored into the following:
* The number of bonus languages your character knows at the start of the game. Even if this modifier is a penalty, your character can still use her starting languages unless her Intelligence score is lower than 3. See page 40 for more about languages.
* The number of skill ranks gained each level, though your character always gets at least 1 skill rank per level.
* [[Computers]], [[Culture]], [[Engineering]], [[Life Science]], [[Medicine]], [[Physical Science]], and some [[Profession]] skill checks.
* Bonus technomancer spells. The minimum Intelligence score needed to cast a technomancer spell is 10 + the spell's level.
!!! Wisdom (Wis)
Wisdom describes a character's common sense, intuition, and willpower. A character with a Wisdom score of 0 is unconscious. Your character's Wisdom modifier is factored into the following:
* Will saving throws (for defending against things like magical mind control).
* [[Mysticism]], [[Perception]], [[Sense Motive]], [[Survival]], and some [[Profession]] skill checks.
* Bonus mystic spells. The minimum Wisdom score needed to cast a mystic spell is 10 + the spell's level.
!!! Charisma (Cha)
Charisma measures a character's personality, personal magnetism, ability to lead, and appearance. A character with a Charisma score of 0 is unconscious. Your character's Charisma modifier is factored into the following:
* [[Bluff]], [[Diplomacy]], [[Disguise]], [[Intimidate]], and some [[Profession]] skill checks.
* Checks that represent attempts to influence others, including the envoy's extraordinary abilities.
!! Buying Ability Scores
In this method, you customize your ability scores by "buying" them using a pool of points. Since the purpose of this system is to help you build exactly the character you want, before starting to customize your ability scores, first decide what you want your character's race (Chapter 3), class (Chapter 4), and theme (see page 28) to be. Once you've got those firmly in mind, follow the steps below in order.
* ''Step 1:'' Start with a score of 10 in each ability. On your character sheet or a piece of scratch paper, write down all six abilities—Strength, Dexterity, Constitution, Intelligence, Wisdom, and Charisma—and put a 10 next to each of them.
* ''Step 2:'' Add and subtract points for race. Races in Starfinder are often naturally gifted in some abilities and less so in others.
* ''Step 3:'' Add points for theme. Each theme gives you a single ability point to apply to an ability score.
* ''Step 4:'' Spend 10 points customizing your scores. Now that you've got your baseline scores, which incorporate modifications for race and theme, you get a pool of 10 extra points to assign to your ability scores as you see fit. You apply these to your existing ability scores on a 1-for-1 basis—if you have a Dexterity score of 12 and you add a point from your pool, you now have a Dexterity score of 13. You can divide these points up however you want, but you can't make any individual score higher than 18. (Later on, as you level up and gain ability-boosting gear, your ability scores may rise above 18, but 18 is the highest value any character can start out with.) Be sure to spend all 10 of your ability points—you can't save them for later.
* ''Step 5:'' Record ability scores and ability modifiers. Once you've spent all your points, you're done.
!! Ability Modifiers and Ability Checks
The right-hand column in [[Table: Ability Scores and Modifiers]] shows the ability modifier corresponding to each ability score. This modifier is applied to die rolls related to your abilities, such as skill checks, attacks, and more. Nearly every roll is affected by your abilities in some way, often with additional modifiers from other sources, but they generally involve your ability modifier rather than your actual ability score. If a change to an ability score ever alters its modifier, any statistics that rely on that modifier are altered accordingly.
{{Table: Ability Scores and Modifiers}}
Sometimes, a situation or ability might require you to attempt something called an ability check. In such instances, instead of attempting a check involving both your abilities and other factors (such as skills or saving throws that reflect your training and expertise), you attempt a check using just 1d20 + your ability modifier. This represents you trying to use your raw, untrained talent for that particular ability, such as attempting a Strength check to kick down a door.
In the rare instance that you need to determine ability modifiers beyond the numbers presented in the table, such as for extreme high-level play, ability modifiers can be determined by subtracting 10 from the ability score and dividing that result by 2, rounding down if the final result is a fraction. For example, an ability score of 41 would have an ability modifier of +15 (since 41 – 10 = 31 and 31 ÷ 2 = 15-1/2, which rounds down to 15).
!! Leveling Up and Ability Scores
Every 5 levels (at 5th, 10th, 15th, and 20th levels), you get to increase and customize your ability scores. Each time you reach one of these level thresholds, choose four of your ability scores to increase. If that ability score is 17 or higher (excluding any ability increases from [[personal upgrades]]), it increases permanently by 1. If it's 16 or lower, it increases permanently by 2. You can't apply more than one of these increases to the same ability score at a given level, but unlike at 1st level, these increases can make your ability scores go higher than 18.
Abjurations are protective spells. If an abjuration creates a barrier that keeps certain types of creatures at bay, that barrier cannot be used to push away those creatures. If you force the barrier against such a creature, you feel a discernible pressure against the barrier. If you continue to apply pressure, the spell ends, even if the spell would normally work or its normal duration has not yet elapsed.
By layering inexpensive metal and composite plates over existing bulkheads, a ship can absorb initial damage to its hull before its essential components become vulnerable to attack or hostile environments. However, thicker plates are bulky and interfere with the maneuverability and handling of starships. Ablative armor grants a starship temporary Hull Points to each quadrant, usually distributed evenly. When a starship would take damage to its Hull Points, it first reduces its temporary Hull Points from ablative armor in that quadrant. Once a starship's temporary Hull Points in a quadrant are reduced to 0, any further damage to that quadrant not absorbed by shields is applied to the ship's Hull Points. The loss of temporary Hull Points does not count toward the starship's critical threshold, though for all other effects, any attack that reduces a starship's temporary Hull Points is treated as though it had dealt Hull Point damage to the target.
In most cases, ablative armor is applied evenly, distributing its temporary Hull Points between all four quadrants. However, a starship can support uneven distribution at the cost of the starship's handling, though the vessel can add only a limited amount of extra armor to smaller hulls. If a starship's ablative armor is not installed evenly across all four quadrants, reduce the starship's base frame [[Piloting]] modifier by 1 (minimum –3). Reduce the Piloting modifier by 1 if the temporary Hull Points granted by ablative armor exceed the starship's Hull Point total. A starship cannot support ablative armor if its temporary Hull Points exceed twice its standard Hull Point total.
Ablative armor can be restored only when the starship undergoes repairs, and it is repaired at the same rate and cost as standard Hull Points. A starship's Hull Points must be fully repaired before making repairs to any temporary Hull Points provided by ablative armor.
<div class= "table-wrapper">
|Armor | Total<br/>Temp HP | Special | Cost (BP) |h
|basic ablative armor | 8 | — | 2 |
|basic ablative armor | 16 | — | 3 |
|basic ablative armor | 24 | — | 4 |
|basic ablative armor | 32 | — | 5 |
|basic ablative armor | 40 | — | 6 |
|light ablative armor | 52 | –1 TL | 8 |
|light ablative armor | 64 | –1 TL | 10 |
|light ablative armor | 76 | –1 TL | 12 |
|light ablative armor | 88 | –1 TL | 13 |
|light ablative armor | 100 | –1 TL | 14 |
|medium ablative armor | 120 | –2 TL, +1 turn distance | 16 |
|medium ablative armor | 140 | –2 TL, +1 turn distance | 17 |
|medium ablative armor | 160 | –2 TL, +1 turn distance | 19 |
|medium ablative armor | 180 | –2 TL, +1 turn distance | 21 |
|medium ablative armor | 200 | –2 TL, +1 turn distance | 22 |
|heavy ablative armor | 240 | –2 TL, +2 turn distance | 24 |
|heavy ablative armor | 280 | –2 TL, +2 turn distance | 27 |
|heavy ablative armor | 320 | –2 TL, +2 turn distance | 29 |
|heavy ablative armor | 360 | –2 TL, +2 turn distance | 31 |
|heavy ablative armor | 400 | –2 TL, +2 turn distance | 34 |
|superior ablative armor | 460 | –3 TL, +2 turn distance | 38 |
|superior ablative armor | 520 | –4 TL, +2 turn distance | 45 |
</div>
Civilization on Verces exists on the thin line between fiery heat and frozen desolation. Verthani's unique perspective on the elements led them to develop temperature-sensitive compounds with remarkable properties. //Ablative insulation// comes in a single-use canister containing enchanted fullerene-based powder. In a process that takes 1 minute, you can spray the contents on a creature to thoroughly coat it with the powder (though it automatically avoids orifices and sensory organs such as the eyes, mouth, and nose). The creature coated gains [[energy resistance]] to all energy types (which doesn't stack with any other source of energy resistance), and the ablative insulation wears away as it prevents damage. The coating lasts for 1 hour if not ablated away sooner. Multiple coatings don't offer any additional benefit (ignore all but the highest-level coating). Each canister contains enough material to fully cover a single Medium or smaller creature, with any excess wasted. When applied to a Large creature, the insulation provides only half the energy resistance (rounded down) and total points of absorption unless a second canister is used. If applied to a Huge or larger creature, the insulation is wasted without effect.
* ''Mk 1:'' The creature receives [[energy resistance]] 5 to all energy types. The coating lasts for 1 hour or until it prevents a total of 20 damage, whichever comes first.
* ''Mk 2:'' The creature receives [[energy resistance]] 10 to all energy types. The coating lasts for 1 hour or until it prevents a total of 40 damage, whichever comes first.
* ''Mk 3:'' The creature receives [[energy resistance]] 15 to all energy types. The coating lasts for 1 hour or until it prevents a total of 60 damage, whichever comes first.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//ablative insulation//, mk 1 | 4 | 350 | L |
|//ablative insulation//, mk 2 | 8 | 1,500 | L |
|//ablative insulation//, mk 3 | 12 | 5,500 | L |
</div>
While your [[sheath array]] is active, you can apply its bonus to skill checks as an insight bonus to your initiative checks.
When you pair up with a differently sized ally, your foes have little chance to dodge your attacks.
''Prerequisites:'' Base attack bonus +6.
''Benefit:'' When you flank a foe with an ally who's a different size category than you, you can reroll one damage die with a result of 1. To gain this benefit, the foe can't be larger than the larger of you and your ally, or smaller than the smaller of you and your ally.
''Teamwork Benefit:'' If your ally also has this feat, you're both considered to be flanking an enemy as long as you both threaten that enemy, no matter your actual positions.
Once per day as a standard action, you can register the exact molecular makeup of a creature to an //absolute compass// by opening a compartment on the device and inserting a small sample of the creature (such as a hair, scale, or drop of blood). Once the compass is registered this way, the compass needle points toward the creature, regardless of distance. If the registered creature dies or is on a different plane from the compass, the device’s needle wobbles indecisively. More sophisticated models can register more than one creature, and the wielder simply needs to think about the creature they want to locate to have the compass switch targets.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Creatures Registered |h
|//absolute compass//, mk 1 | 1 | 250 | L | 1 |
|//absolute compass//, mk 2 | 4 | 1,800 | L | 4 |
</div>
Once per day as a standard action, you can spend Entropy Points to become immobile for a number of rounds up to the number of Entropy Points spent. For the duration, you can't be moved by any nonmagical effect and are immune to cold damage. In addition, during this time, any creature that touches you, hits you with a melee attack with a natural weapon, or starts their turn within 20 feet of you takes 3d6 cold damage per Entropy Point spent. Any creature that takes this damage is affected as though by slow (no save) until the damage is healed. You can dismiss this effect at the end of your turn without taking an action.
Activating absolute zero automatically ends any [[living effigy]] discipline you have active.
[[Witchwyrds]] can catch magic missiles (from the spell of the same name), and mystical dampeners installed let you do the same. As a reaction, you can use any number of your free hands to catch magic missiles fired at you. Doing so absorbs the missile and manifests as a glowing nimbus around that hand (which is no longer considered free) until the beginning of your next turn. To use this ability, you must be aware of the incoming magic missiles and can't be [[flat-footed]]. This augmentation works best with the [[force bolt]] graft.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|absorb force graft | 3 | 1,350 | all hands |
</div>
Your body absorbs attacks, swallowing bullets, toxins, and even magic that your nanites convert into bursts of power.
!! Vanish into the Depths (1st)
You gain the [[defensive dispersal]] ability at 1st level instead of 2nd level. Add 1/2 your nanocyte level to the amount by which your defensive dispersal ability reduces the damage dealt by a triggering effect.
!! Fuel for the Fires (5th)
You repurpose incoming damage, using it to make your own attacks deadlier. When you use your [[defensive dispersal]] ability to reduce the damage you take from an effect, you enhance the next attack you make with a weapon created by your [[gear array]] made before the end of your next turn. If the attack hits, it deals 1d6 additional damage (or 1d4 additional damage if the weapon attacks all creatures in an area). This additional damage increases by 1d6 (or 1d4 for attacks against an area) at 9th level, 13th level, and 17th level. Alternatively, when a creature in your [[cloud array]] takes damage before the end of your next turn, you can expend your absorbed energy to increase the damage the creature takes by 1d6 (increased to 2d6 at 9th level, 3d6 at 13th level, and 4d6 at 17th level). Either form of additional damage is of the same type as the attack’s normal damage.
!! Kinetic Surge (9th)
When you use your [[defensive dispersal]] ability to reduce the damage you take from an attack, you convert some of that energy into rapid movement, granting you a +10-foot enhancement bonus to each of your speeds until the end of your next turn. During this time, calculate your DC for [[Athletics]] checks to jump as though you had a 10-foot running start. If the triggering attack for defensive dispersal was a critical hit, increase the enhancement bonus to speed to 20 feet, and you also gain a +3 bonus to your Armor Class against attacks of opportunity that you provoke by leaving a threatened square until the end of your next turn.
Arcane Turnabout (13th)
The circumstance bonus to saving throws provided by [[defensive dispersal]] increases to +2 against spells and spell-like abilities. When you use your defensive dispersal ability against a spell or spell-like ability and succeed the effect’s initial saving throw (or if the spell fails to overcome your [[spell resistance]], if any), you can deflect some of the magical energy to damage a creature within 30 feet. That creature takes 1d6 force damage per level of the spell (Fortitude half), and if you target the spell’s caster with this effect, they take a –2 penalty to the saving throw.
!! Deflective Dome (17)
You gain the [[group dispersal]] knack; if you already have the knack, you gain one other knack of your choice that’s available to a 10th-level nanocyte. Once per minute when you use your group dispersal knack, you can apply its benefits to all allies affected by the triggering effect who are adjacent to you or within your cloud array.spell-
These electrically charged absorption plates can draw the force of an explosion toward you, dampening the effect for everyone else. When you are within the area of an explosion (such as that of a weapon with the [[explode]] special property or an area effect that deals damage and allows a Reflex save for half or no damage), you can activate the absorption shield as a reaction. If the explosion deals damage, you take 1-1/2 times as much damage (150%) and can't attempt a saving throw against the explosion (or use [[evasion]] or improved evasion). Other creatures (and objects, if applicable) within the area take only half damage from the explosion (and can attempt to reduce the damage with a saving throw as normal).
This upgrade can be installed only in heavy or powered armor.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk | Capacity | Usage |h
|//absorption shield// | 7 | 6,500 | 1 | heavy, powered | 1 | 40 | 10 |
</div>
<div class="statblock">
* ''Level'' 6; ''Price'' 3,375
* ''EAC Bonus'' +7; ''KAC Bonus'' +12
* ''Max Dex Bonus'' +3; ''Armor Check Penalty'' –3; ''Speed'' 30 ft.
* ''Strength'' 18 (+4); ''Damage'' 1d10 B
* ''Weapon Slots'' 0; ''Upgrade Slots'' 1
* ''Capacity'' 20; ''Usage'' 1/hour
* ''Size'' Medium; ''Bulk'' 18
</div>
This powered armor consists of a thin frame around a central command unit (which fits around the torso for a typical wearer), covered in form-fitting plates filled with a rheopectic fluid that hardens when struck, dispersing force throughout the armor and absorbing crushing blows. Although an absorptive shell provides significant protection, the fluid-filled plates can't support a weapon mount.
Unlike many forms of powered armor which are primarily used as military combat gear, absorptive shells are also often used as safety equipment for skilled rescue workers operating in extremely hazardous conditions, ranging from areas prone to rockfalls, starship crashes, and vehicles that still have explosives and industrial chemicals leaking from them, to actual war zones where rescue workers may come under fire.
Your body houses a seemingly inexhaustible amount of nanites. When calculating your number of [[nanite surges]] per day and the maximum bulk of your [[nanite gear]], treat your Constitution modifier as 2 higher.
<div class="statblock">
* ''CR'' 5; ''XP'' 1,600
* N Small ooze
* ''Init'' +2; ''Senses'' [[blindsense]] (scent [abysium only]) 1 mile, [[blindsight]] (vibration) 60 ft., [[sightless]]; ''Perception'' +11
* ''Aura'' irradiation (medium, DC 13, 20 ft.)
!!! DEFENSE
* ''HP'' 75
* ''EAC'' 17; ''''KAC 19
* ''Fort'' +9; ''Ref'' +5; ''Will'' +2
* ''Immunities'' [[ooze immunities]], radiation
!!! OFFENSE
* ''Speed'' 20 ft., climb 20 ft.
* ''Melee'' slam +14 (1d6+10 B plus fallout susceptibility; critical shear shielding)
* ''Offensive Abilities'' fallout susceptibility, shear shielding
!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' +3; ''Int'' —; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +16
* ''Other Abilities'' [[mindless]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or pair
!!! SPECIAL ABILITIES
''Fallout Susceptibility ([[Ex]])'' A creature hit by an abysium eater's slam attack takes a –1 penalty to its next saving throw against [[radiation sickness]] attempted within the next 24 hours. This penalty stacks, to a maximum equal to half the abysium eater's CR (–2 for a typical specimen).
''Irradiation ([[Ex]])'' An abysium eater emanates medium [[radiation]] in a 20-foot radius. This radiation suffuses an area in 20-foot increments. An abysium eater is considered a natural adioactive material for the purposes of spells that remove radiation, such as //[[remove radioactivity]]//.
''Shear Shielding ([[Ex]])'' When an abysium eater critically hits a creature wearing armor that grants immunity to radiation levels, the target loses that radiation immunity (Reflex DC 13 negates), though the armor continues to provide its saving throw bonus against radiation as normal. This damage persists until the armor is repaired.
</div>
<div class="statblock">
* ''CR'' 7; ''XP'' 3,200
* N Colossal animal (aquatic)
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +14
!!! DEFENSE
* ''HP'' 112
* ''EAC'' 19; ''KAC'' 21; +4 vs. attacks of opportunity
* ''Fort'' +11; ''Ref'' +11; ''Will'' +6
* ''Defensive Abilities'' flexible; ''DR'' 5/piercing; ''Resistances'' cold 5
!!! OFFENSE
* ''Speed'' swim 60 ft.
* ''Melee'' slam +17 (2d6+12 B)
* ''Multiattack'' bite +17 (1d6+12 P plus [[swallow whole]]), 3 tail swipes +17 (1d6+12 B)
* ''Space'' 30 ft.; ''Reach'' 30 ft.
* ''Offensive Abilities'' [[swallow whole]] (2d6+12 B, EAC 19, KAC 17, 28 HP)
!!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' +4; ''Int'' –4; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Acrobatics]] + 14, [[Athletics]] +19 (+27 to swim), [[Stealth]] +14
* ''Other Abilities'' [[water breathing]]
!!! ECOLOGY
* ''Environment'' any water (Entha)
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Flexible ([[Ex]])'' An abynthic can contort itself surprisingly well or its enormous size. An abynthic gains a +4 bonus to its AC against attacks of opportunity.
</div>
Measuring up to 100 feet from their eel-like jaws to their four-part tails and weighing hundreds of tons, abynthics are among the largest and most formidable creatures found in the seas of Entha. While swimming in long migratory patterns that circumnavigate the planet twice a year, their segmented tails cleave together and function as one powerful limb that propels them through the depths. Abynthics are incredibly flexible for their size and can use their tails individually to attack with devastating effect when they happen across a worthy meal. These carnivorous giants attack their prey by first ramming into it with their massive jaws, then clamping down with enormous pressure and bringing their flexible tails to bear. When they've appropriately subdued and tenderized a creature, they swallow it whole.
Abynthics are constantly on the move and have no established hunting grounds. Often, their travel takes them through smaller ecosystems, where their voracious appetites can leave devastation in their wake, upsetting an area's fragile balance. On Entha, the only refuges from these massive creatures are the magical reefs that supernaturally decrease the surrounding water pressure; abynthics are adapted to the high pressure of the deep sea and fare poorly in shallow and low-pressure environments.
Many other worlds contain creatures that closely resemble abynthics, though most have notable differences in their number of tails or diet; some are even herbivorous. Sapient species study, fear, or even worship these mysterious beings wherever they appear—but nothing is known about their reproductive cycle. Some posit that the massive creatures are effectively immortal, dropped fully formed into the seas by some divine entity, as no abynthic young, eggs, or decaying remains have ever been found. The leviathans can be killed, however, and powerful mercenaries regularly mount expeditions to hunt abynthics. These poachers primarily want the creatures' uniquely strong jaws, which are sometimes incorporated into deep-sea submersibles to help them withstand enormous pressure.
Abysium, also called feverstone, is a radioactive metal distinguished by its blue-green glow. It is believed to form when asteroids transmute, in part, into abysium in the darkness of space where boundaries between the Material Plane and the Abyss are thin. Abysium can be used as a power source, and it is sometimes used in higher-capacity batteries.
Weapons and ammunition fashioned from abysium emanate low [[radiation]] in a spherical area equal to the space of the intended wielder—Medium and Small weapons have a radius of 5 feet, Large weapons have a radius of 10 feet, and so on. Weapons and ammunition fashioned from abysium gain the [[bright]] weapon special property, as well as a critical hit effect that inflicts the [[sickened]] condition; the target can attempt a Fortitude saving throw to negate this poison effect, which otherwise lasts 1d4 rounds. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the sickened effect.
If a melee weapon that has the [[powered]] weapon special property is made from abysium, reduce its usage by 1. If the weapon has a usage of 1, increase its usage to up to 2 minutes of operation (rather than the normal 1 minute). This aspect of abysium can be applied to melee weapons that deal only energy damage (though not [[solarian weapon crystals]] of any type).
<div class="table-wrapper">
|Form | Cost |h
|Ammunition (1 piece) | +70 credits |
|Weapon | +4,500 credits |
|Raw material (1 bulk) | 1,125 credits |
</div>
A highly radioactive metal with a bluish-green glow, abysium provides exceptional conductivity and can store electric charges far more efficiently than more mundane metals such as copper.
''Power Core:'' A properly functioning abysium reactor produces far less waste than reactors that use other radioactive materials and doesn't require extreme pressure to sustain nuclear reactions, but it's hazardous when ruptured. An abysium power core increases the PCU it provides by 25% (maximum +50 PCU). However, if the power core takes critical damage, the starship's occupants are subjected to radiation for 1 round of starship combat. This radiation is low if the power core gains the [[glitching]] condition, medium if it gains the [[malfunctioning]] condition, and high if it gains the [[wrecked]] condition.
''Weapon Mount:'' Abysium is naturally radioactive. An abysium weapon mount grants any weapon installed onto it the [[irradiate|Irradiate (starship weapon property)]] special property, with a light weapon mount creating low radiation, a heavy mount creating moderate radiation, and a capital or spinal mount creating heavy radiation. If the weapon already has the irradiate special property, add 1 round to the duration of any radiation applied to struck starships. Mounting a light, heavy, capital, or spinal weapon with abysium increases its cost by 2 BP, 6 BP, 10 BP, or 10 BP, respectively.
<div class= "table-wrapper">
|Upgraded System | BP Cost |h
|power core | +2 BP |
|weapon mount | special |
</div>
Blue-green abysium dragons glow from within and are dangerously radioactive. They usually isolate themselves from others to avoid causing unintended harm and as such are often agitated by those who seek them out.
* ''CR:'' 3+
* ''Required Creature Type and Subtype:'' Dragon (fire)
* ''Suggested Alignment:'' Neutral
* ''Traits:''
** [[blindsense]] (vibration) 60 feet; [[darkvision]] 120 feet
** [[frightful presence]] (CR 14+, 60 feet + 10 feet per CR); irradiation aura (see below)
** [[void adaptation]]; [[DR]] 5/magic (CR 13+, increase to DR 10/magic at CR 15, DR 15/magic at CR 17, DR 20/magic at CR 19); [[immunity]] to radiation
** [[breath weapon]] (line 30 ft. + 10 feet per 2 CR, 1d6 F + 1d6 per CR); spell-like abilities (CR 8+)
** [[spaceflight]]
* //Irradiation Aura ([[Ex]]):// An abysium dragon emanates [[radiation]] in a 20-foot radius. The maximum strength of the radiation is dependent on the dragon's CR, starting at medium and increasing to high at CR 7 and severe at CR 19. This radiation suffuses at 20-foot increments as normal. An abysium dragon can't suppress its radioactive aura, and it is considered a natural radioactive material for the purposes of //[[remove radioactivity]]//.
Abysium eaters glow with a sickly blue-green radiance and are dangerously radioactive. They are sometimes found in nuclear power plants that have undergone a deadly meltdown, basking in the lethal radioactivity, or accompanying [[pluprex demons|Demon, Pluprex]].
* ''CR:'' 3+
* ''Required Creature Type:'' Ooze.
* ''Required Array:'' Combatant.
* ''Traits:''
** [[blindsense]] (scent [abysium only]) 1 mile, [[blindsight]] (vibration) 60 ft.
** fallout susceptibility (see below)
** [[immunity]] to radiation
** irradiation [[aura]] (see below; an abysium eater's radiation strength is dependent on its CR, starting at medium and increasing to high at CR 7 and severe at CR 19)
** [[mindless]]
** [[ooze immunities]]
** shear shielding (see below)
** [[sightless]]
* //Fallout Susceptibility ([[Ex]])// A creature hit by an abysium eater's slam attack takes a –1 penalty to its next saving throw against [[radiation sickness]] attempted within the next 24 hours. This penalty stacks, to a maximum equal to half the abysium eater's CR (–2 for a typical specimen).
* //Irradiation ([[Ex]])// An abysium eater emanates medium [[radiation]] in a 20-foot radius. This radiation suffuses an area in 20-foot increments. An abysium eater is considered a natural adioactive material for the purposes of spells that remove radiation, such as //[[remove radioactivity]]//.
* //Shear Shielding ([[Ex]])// When an abysium eater critically hits a creature wearing armor that grants immunity to radiation levels, the target loses that radiation immunity (Reflex DC 13 negates), though the armor continues to provide its saving throw bonus against radiation as normal. This damage persists until the armor is repaired.
<div class="statblock">
* ''CR'' 12; ''XP'' 19,200
* N Large construct (magical, technological)
* ''Init'' +4; ''Senses'' [[darkvision]] 60ft., [[low-light vision]]; ''Perception'' +22
* ''Aura'' [[radioactive]] (high, 10 ft., DC 22)
!!! DEFENSE
* ''HP'' 200
* ''EAC'' 26; ''KAC'' 28
* ''Fort'' +12; ''Ref'' +12; ''Will'' +9
* ''DR'' 10/—; ''Immunities'' [[construct immunities]], electricity, magic
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' slam +26 (6d4+20 B; critical [[irradiate|Irradiate (critical)]] [DC 19])
* ''Offensive Abilities'' berserk, [[breath weapon]] (30-ft. cone, 13d6 F, DC 19, usable every 1d4 rounds)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
!!! STATISTICS
* ''Str'' +8; ''Dex'' +4; ''Con'' —; ''Int'' —; ''Wis'' +1; ''Cha'' –2
* ''Skills'' [[Intimidate]] +22
* ''Other Abilities'' comm, [[mindless]], [[unliving]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or gang (2–4)
!!! SPECIAL ABILITIES
''Berserk ([[Ex]])'' When an abysium golem takes damage that reduces it to half its maximum Hit Points or fewer, it must attempt a DC 18 Will saving throw. While at or below half HP, it must also attempt a DC 18 Will saving throw whenever it takes additional damage. On a failure, the golem goes berserk. While berserk, the golem uses its actions to make a full attack or to move and attack. If it can't reach a creature, it attacks objects. The golem can attempt a DC 18 Will save at the end of each of its turns to end the berserk state. If the golem's creator communicates with the golem to calm it (via comm unit or from within 60 feet) and succeeds at a DC 10 Charisma check, the golem receives a +2 circumstance bonus to this saving throw.
''Comm ([[Ex]])'' A golem can receive wireless communications (and thus commands from its
creator) at planetary range.
''Magic Immunity ([[Ex]])'' An abysium golem is immune to any spell or spell-like ability that allows [[spell resistance]], unless the spell specifically lists constructs in its Targets entry. In addition, certain spells and effects function differently against the golem, as follows.
@@.special
* If targeted with //[[remove radioactivity]]//, the abysium golem is slowed (as the //[[slow]]// spell) for 3 rounds (no save), but if the caster also succeeds at a caster level check against the DC of the golem's radioactive aura, the golem is also [[flat-footed]] and [[off-target]] for the same duration.
* The [[irradiate|Irradiate (spell)]] spell ends any slow effect on the golem, and it regains a number of Hit Points depending on the radiation level (2d8 for low, 4d8 for medium, 6d8 for high, and 8d8 for severe). If the amount of healing would cause the golem to exceed its maximum Hit Points, it gains any excess as temporary Hit Points.
@@
</div>
These golems are crafted from abysium, the blue-green glowing starmetal also known as feverstone. They are dangerous not only for their strength and ferocity, but also because of the radiation they emit at all times. Some believe that abysium—and the golems made of it—are connected to the Abyss, the nightmarish home of all demonkind.
Normally crafted by demonic smiths, abyssal plate tends to be rare, but sets of this armor reverse-engineered from those taken from vanquished fiends are slowly gaining a presence in the galactic market. Abyssal plate sacrifices adaptability for speed, giving it less room for armor upgrades than its competitors. Demon‑made sets are rumored to be forged with sinners’ souls, but that ingredient is something most mortal corporations don’t attempt to emulate.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br/>Bonus | KAC<br/>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br/>Slots | Bulk |h
|abyssal plate, vrock | 8 | 11,150 | +14 | +16 | 2 | –3 | –5 ft. | 1 | 3 |
|abyssal plate, glabrezu | 11 | 24,000 | +17 | +19 | 2 | –4 | –5 ft. | 2 | 3 |
|abyssal plate, marilith | 15 | 116,500 | +21 | +23 | 4 | –4 | –5 ft. | 3 | 4 |
|abyssal plate, balor | 20 | 944,000 | +26 | +28 | 4 | –4 | –5 ft. | 4 | 4 |
</div>
You can boost the entropic release of energy in violent effects. As a reaction when you are in the area of a damaging effect, you can spend 1 Entropy Point to add a +2 bonus per die to the damage dealt to every other creature in the area, or you can spend 2 Entropy Points to add +3 bonus per die.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Duration'' 1 round/level
</div>
Drawing upon the Dimension of Time, you speed your steps until your every movement is a blur of motion. While you move up to your speed, charge, run, or step, you have concealment against attackers.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' 1 barathu
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Fortitude negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
You grant a barathu increased control over its own powers of adaptation. If the target has the early stage adaptation racial trait, it gains adaptation instead. If the target already has adaptation, it can have two adaptations in effect at a time, instead of only one.
When you gain MP at the start of your turn, you can gain 2 MP instead. Whenever you spend a Resolve Point to gain a Mutation Point, you can gain 2 MP instead.
Your body knits back together especially quickly while you are resting.
''Prerequisites:'' Con 13.
''Benefit:'' You regain twice as many Hit Points when taking an 8-hour rest. In addition, for each uninterrupted 8 hours of rest you receive, you recover from afflictions as though you had rested for a full day. This effect does not stack with other effects that increase these rates of healing and recovery; if more than one would apply, you choose which one takes effect.
<div class="statblock">
* ''Type'' drug (ingested, inhaled)
* ''Save'' Fortitude DC 19
* ''Addiction'' Fortitude DC 19 (physical)
* ''Track'' [[Dexterity|Dexterity Poison Track]]
* ''Effect'' For 1 hour, a +2 morale bonus to saving throws against fear effects and +5 to subsequent saves against the same effect.
</div>
<div class= "table-wrapper">
|Substance | Level | Price |h
|acceptance | 6 | 600 |
</div>
As a standard action, you can use Computers to access an unsecured computer system's most basic functions. The DC to access the information or functions of a public computer with no countermeasures or firewalls is generally 10. Unlike other tasks of the Computers skill, you can attempt to access a system untrained if you take 20 on the task, requiring 2 minutes. Secured computer systems, and secured sections of an unsecured system, can be accessed by making a Computers check to [[hack a system|Hack System]].
This simple metal band attaches to the collar area of your space suit, suit of armor, or other set of clothes. When activated as a standard action, an acclimation torc places your respiratory system and your digestive system in a form of temporal stasis, while still keeping you alive. Essentially, your need to eat, drink, and breathe is temporarily "paused" while the acclimation torc continues to hold a charge. You can breathe normally in vacuums, clouds of smoke, water, and thick, thin, and toxic atmospheres, though you aren't protected against the damage of a corrosive atmosphere. In addition, you don't need to worry about starvation or thirst while your acclimation torc is active. Unlike the normal protections provided by most suits of armor, an acclimation torc doesn't grant you protection against low levels of radiation or conditions of cold and heat. An acclimation torc holds 50 charges and uses 1 charge per hour. You can replenish these charges the same way you recharge the duration of a suit of armor's environmental protections.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|acclimation torc | 5 | 2,700 | L | 50 | 1/hour |
</div>
The //accurate// fusion bestows exceptional balance and handling on a weapon. When you take a move action to aim a weapon with this fusion at a specific target, you gain a +1 bonus to your next attack roll with that weapon provided neither you nor your target has moved since you aimed. You also gain this bonus if you take a move action to aim for other purposes, such as aiming a weapon with the sniper special property. Only ranged weapons can benefit from this fusion.
You are most comfortable at the controls of a vehicle, whether it's a starship racing through the inky void of space or a ground vehicle zooming between trees, around boulders, and across dusty badlands. You might be a member of an elite military force, the recipient of intense courses of training. Alternatively, you might be a total amateur with innate skills that make you a much-admired hotshot.
!! Theme Knowledge (1st)
You are obsessed with starships and vehicles, and have committed to memory almost every related tidbit of knowledge you've ever come across. Reduce the DC of [[Culture]] checks to [[recall knowledge]] about starship and vehicle models and parts as well as famous hotshot pilots by 5. [[Piloting]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to your Piloting checks. In addition, you gain an ability adjustment of +1 to Dexterity at character creation.
!! Lone Wolf (6th)
You know at least a little bit about handling every role on a starship, and you can sub in for certain tasks in a pinch. Whenever you need to attempt a skill check either during starship combat or to directly repair or otherwise maintain your starship, you can treat half your ranks in [[Piloting]] as your ranks in the appropriate skill for the check, if that would be better (since you effectively have ranks in the related skill, you are considered trained in the skill for the purposes of this check).
!! Need For Speed (12th)
Speeding in a vehicle gives you a heady rush, and you can easily handle operating vehicles at high velocities that might send lesser pilots spinning out of control. Reduce any penalties to [[Piloting]] checks you make when on a vehicle by 1. When you take the double maneuver action during a vehicle chase, reduce the penalty for each action by 1. Whenever a Piloting check has a penalty for failing by 5 or more, you take that penalty only if you fail by 10 or more.
!! Master Pilot (18th)
Your piloting accomplishments invigorate you, giving you renewed purpose and zeal. Up to twice per day, when you defeat a significant foe in starship combat as a pilot or succeed in a vehicle chase (meaning that you've either escaped a pursuer or caught or defeated your opponent), you recover 1 Resolve Point.
<div class="statblock" >
* ''Level'' 5; ''Price'' 9,400
* Large land and tunneling vehicle (5 ft. wide, 10 ft. long, 5 ft. high)
* ''Speed'' 15 ft., full 350 ft., 40 mph (land); 15 ft., full 45 ft., 5 mph (burrow)
* ''EAC'' 18; ''KAC'' 19; ''Cover'' total cover
* ''HP'' 60 (30); ''Hardness'' 10
* ''Attack (Collision)'' 5d8 B (DC 12); ignores 5 points of hardness
* ''Modifiers'' +1 [[Piloting]], –1 attack (–3 at full speed)
* ''Systems'' autocontrol, enhanced sensors ([[darkvision]] 120 ft., [[sense through]] [vision, stone only] 30 ft.), planetary [[comm unit]]
* ''Passengers'' 1
</div>
Able to tunnel through soil and loose rock using jets of acid, this cylindrical, tracked vehicle has portholes and a rear-facing entry hatch.
Despite its name, derived from Swarm conventions and suggesting a heavier armament, the lightweight acid cannon is a derivation of the Swarm [[corrovox]]'s arm-mounted weapon modified to be a stand-alone pistol-sized firearm. The weapon uses small amounts of power to produce caustic fluid. The trigger administers a jolt of electricity to the device, causing a reflexive constriction that forces blobs of this acid out of the weapon's throatlike barrel.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|acid cannon, micrergate | 3 | 1,500 | 1d4 A | 40 ft. | [[corrode]] 1d4 | 40 charges | 2 | L |[[living]], [[swarm|Swarm (weapon property)]] |
|acid cannon, macrergate | 7 | 7,000 | 2d6 A | 40 ft. | [[corrode]] 2d4 | 40 charges | 4 | L |[[living]], [[swarm|Swarm (weapon property)]] |
|acid cannon, dinergate | 12 | 36,000 | 3d8 A | 40 ft. | [[corrode]] 3d4 | 40 charges | 4 | L |[[living]], [[swarm|Swarm (weapon property)]] |
|acid cannon, ergatoid | 17 | 256,000 | 4d10 A | 40 ft. | [[corrode]] 4d4 | 40 charges | 5 | L |[[living]], [[swarm|Swarm (weapon property)]] |
</div>
An acid dart rifle has a nonreactive polymer reservoir that can be filled with whatever acid the wielder desires. The automatic loading process fills the rifle darts with acid as they are moved into the chamber. Dual acid dart rifles fire two darts simultaneously, while complex acid dart rifles hold concentrated doses of acid.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|acid dart rifle, tactical | 2 | 485 | 1d8 A & P | 80 ft. | [[corrode]] 1d4 | 10 darts | 1 | 1 |[[analog]] |
|acid dart rifle, dual | 7 | 6,900 | 2d8 A & P | 90 ft. | [[corrode]] 2d4 | 24 darts | 2 | 1 |[[analog]] |
|acid dart rifle, complex | 12 | 39,200 | 4d8 A & P | 90 ft. | [[corrode]] 4d4 | 48 darts | 4 | 2 |[[analog]] |
</div>
<div class="statblock">
* ''Type'' ranged; ''Range'' 150 ft.; ''Special'' [[automatic]]
* ''Damage'' medium; ''Damage Type'' A; ''Critical'' [[corrode]]
* ''Slots'' 1 (frame or upper limb); ''Capacity'' 10
* ''Cost'' 3.5 × level
</div>
Streams of potent, sizzling acid fly from the barrel of this fortified gun.
In addition to collecting the valuable composites the creature leaves behind, some entrepreneurs enter [[surnochs']] territory to hunt and kill them for their acid-producing glands and spines. These components can be made into heavy weapons known as acid lancers, which shoot jets of caustic fluid. A wielder of an acid lancer can squeeze the gland located near the trigger to give her next shot an extra boost of damaging acid. Acid lancers use a special synthetic acid called caustrol for ammunition, which has the same price and comes in the same size containers as [[petrol]].
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|acid lancer, corroder-class | 4 | 2,000 | 2d4 A | 30 ft. | [[corrode]] 1d4 | 20 caustrol | 4 | 2 |[[analog]], [[boost]] 1d4, [[line]], [[unwieldy]] |
|acid lancer, melter-class | 9 | 13,000 | 3d4 A | 30 ft. | [[corrode]] 2d4 | 20 caustrol | 5 | 2 |[[analog]], [[boost]] 1d6, [[line]], [[unwieldy]] |
|acid lancer, liquefier-class | 14 | 75,000 | 8d4 A | 50 ft. | [[corrode]] 4d4 | 40 caustrol | 8 | 2 |[[analog]], [[boost]] 1d8, [[line]], [[unwieldy]] |
|acid lancer, disintegrator-class | 19 | 550,000 | 8d8 A | 50 ft. | [[corrode]] 6d4 | 40 caustrol | 10 | 2 |[[analog]], [[boost]] 1d10, [[line]], [[unwieldy]] |
</div>
<div class="statblock">
* <<levels>>
* ''School'' conjuration (acid, creation)
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' 20-ft.-radius spread
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Reflex half
* ''Spell Resistance'' no
</div>
You coat the area in conjured acid, which quickly pools on the ground. Creatures and objects in the area when the spell is cast take 6d6 acid damage. For the duration of the spell, creatures that enter or start their turn in the area take 2d6 acid damage.
<div class="statblock">
* <<levels>>
* ''School'' evocation
* ''Casting Time'' 1 standard action
* ''Range'' long (400 ft. + 40 ft./level)
* ''Area'' cylinder (20-ft. radius, 40 ft. high)
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Fortitude partial (see text)
* ''Spell Resistance'' no
</div>
You pull a downpour of elemental precipitation from an alternate reality. You then direct this acid rain to pour only onto your enemies, dealing them 3d6 acid damage each round. The acid splashes into and burns your foes' eyes, coats them in slime, and clouds their other senses. Enemies must attempt a Fortitude save when exposed to the spell. On a failure, the creature has a 50% miss chance for its attacks while in the area. The rain causes spellcasters who fail the save to have a 20% chance of losing any spell they attempt to cast from within the area. When this spell ends, a thunderclap causes enemies still in the area who failed their Fortitude saves to be [[staggered]] for 1 round.
As a standard action, you can change the rain, causing it to deal a different type of energy damage, such as fiery sparks that deal fire damage or shards of ice that deal cold damage. This change in damage types leaves secondary effects unchanged.
When the spell ends, the rain leaves no aftereffects.
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' conjuration (acid)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Area'' 10-ft.-radius spread
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Fortitude half
* ''Spell Resistance'' no
</div>
You call forth the corrosive atmosphere of a gas giant to damage your opponents. A creature that starts its turn in the area takes 2d6 acid damage. The corrosive mist does not obscure vision.
Each level, including 1st level, you gain a number of skill ranks. The number you gain is determined by the class chosen for that , adjusted by your Intelligence modifier (though you always gain a minimum of 1 skill rank per level). For instance, if you create a 1st-level technomancer with an Intelligence score of 18, you gain 8 skill ranks per level: 4 ranks from the technomancer class and 4 more ranks because your Intelligence modifier is +4.
Investing a rank in a skill represents training gained through experience or intense study. Each skill rank increases your total skill bonus by 1 (see Skill Checks below)—as you level up, you can invest new ranks to upgrade existing skills or learn new ones. Your skill ranks in a single skill can't exceed your total character level. Skills in which you've invested ranks are called trained skills; skills in which you have no ranks are untrained skills.
Each class also features a number of favored skills, called class skills. It's easier for you to become proficient in your class skills. Class skills in which you have at least 1 rank are known as trained class skills; you gain a +3 bonus to skill checks with such skills. If you have more than one class, you gain the class skills from all your classes. The bonus for trained class skills doesn't increase for skills in the class skill lists of more than one of your classes—it remains +3.
You can keep your balance while traversing narrow or treacherous surfaces, escape from restraints, and tumble to avoid attacks. You also use Acrobatics to determine the success of difficult maneuvers while flying.
<$list filter="[tag<currentTiddler>tag[Tasks]]">
<$macrocall $name="collapse" tiddler={{!!title}}/>
</$list>
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* N Medium animal
* ''Init'' +6; ''Senses'' [[low-light vision]]; ''Perception'' +16
!!! DEFENSE
* ''HP'' 128
* ''EAC'' 20; ''KAC'' 22
* ''Fort'' +12; ''Ref'' +12; ''Will'' +7
* ''Resistances'' fire 5;
!!! OFFENSE
* ''Speed'' 40 ft., climb 30 ft.
* ''Melee'' bite +19 (3d4+12 P plus [[grab]])
* ''Special Attacks'' constrict (3d4+12 B)
!!! STATISTICS
* ''Str'' +4; ''Dex'' +6; ''Con'' +2; ''Int'' –5; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +21 (+29 to climb), [[Stealth]] +16, [[Survival]] +16
* ''Feats'' [[Lunge]]
!!! ECOLOGY
* ''Environment'' warm hills or mountains (Nejeor V)
* ''Organization'' solitary or pair
!!! SPECIAL ABILITIES
''Constrict ([[Ex]])'' When an acrochor successfully renews a grapple or a [[pin]] against an opponent, it automatically deals 3d4+12 bludgeoning damage to that creature.
</div>
The serpentine acrochors originally evolved on the fifth planet of the Nejeor system, a rocky and volcanically active world, where they slithered among crevasses and lava tubes, hunting small prey such as the furry mammalian knuggs and creeping up on jaexus birds' nests to feast on the dusky eggs. Acrochors usually grow up to 8 to 12 feet in length and almost 1 foot in diameter. They are red and black in color with tough, knobby skin and a cluster of visual sensors that allow the creatures to see well even in dim light. Acrochors' mouths are on the undersides of their bodies, and they usually keep them closed except when attacking.
An acrochor often begins attacking its prey by lashing out with surprising speed to bite with jaws filled with razor-sharp teeth. Once its fangs are firmly implanted, the acrochor whips its tail to coil several times around the victim's body, using its powerful musculature to squeeze the life from the unfortunate prey. When its prey is dead, the acrochor leisurely tears into the flesh in a bloody and gruesome fashion. If an acrochor takes down a victim of its size or larger, the acrochor might need several days to devour the corpse, but it can digest both fresh and rotting meat without trouble.
After mating, an acrochor lays its fertilized eggs in a thermal vent or other warm place. Over the next day, the parent acrochor eats as much as it can, often consuming pieces of obsidian or other volcanic glass in the process. It then enters a state of hibernation in close proximity to its eggs, which incubate over the next few months. The acrochor's stomach acids slowly dissolve the volcanic glass as it sleeps, providing it with the minerals it needs to survive. Despite its dormant state, the acrochor has an almost supernatural connection to its eggs, waking the moment they hatch or if anything disturbs them.
The [[kishalee]] of Nejeor VI captured a number of acrochor specimens ages ago, housing the creatures in temperature-controlled habitats in wildlife parks. As kishalee civilization declined, the acrochors escaped captivity and began living in the bowels of the cities, maintaining their body heat via energy conduits and breeding with impunity. The kish of stamak sometimes hunt these dangerous creatures for their hides, though acrochor meat is too tough to make it a viable source of food.
Crafted from the hides of [[acrochors]]—serpentine predators that crush their prey—these suits of light armor offer both protection and flexibility. Acrochor hide has the [[archaic]] armor special property.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br>Bonus | KAC<br>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br>Slots | Bulk |h
|acrochor hide, basic | 4 | 2,100 | +5 | +5 | +5 | — | — | 0 | L |
|acrochor hide, advanced | 8 | 8,250 | +10 | +10 | +6 | — | — | 0 | L |
|acrochor hide, elite | 12 | 28,000 | +15 | +15 | +7 | — | — | 0 | L |
</div>
An action's type essentially tells you how long the action takes to perform within the framework of a 6-second combat round. There are five types of actions: standard actions, move actions, swift actions, full actions, and reactions.
In a normal round, you can perform one standard action, one move action, and one swift action, or you can instead perform one full action. Most characters will rarely perform swift actions, though occasionally using a special ability or class feature is a swift action. You can use your standard action to perform either a move action or a swift action, if you wish, and you can also use your move action to perform a swift action. You can also take one reaction each round, even if it isn't your turn; however, reactions happen only in response to certain defined triggers. There are some other actions that do not fall into the normal action types.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
<<tabs "[contains:tab[Actions]sortby{Actions (tab)!!list}]" "Combat Actions" "Index Template">>
Many technological and magic items, such as a cybernetic hand, don't need to be activated. Certain items, however, do need to be activated to have an effect. Unless otherwise noted, activating such an item is a standard action.
You can activate one of your starship's ECM modules. If you use an ECM module mounted on a turret, you can target a ship in any arc.
''Critical:'' Your powerful ECM module disrupts enemy targeting computers. Gunners aboard the target starship also take a –2 penalty to gunnery checks during this round.
Hazards can directly impede or damage the vehicles in a chase. They might be persistent or temporary. Some hazards make one attack against a vehicle when that vehicle enters the hazard's zone. The hazard might trigger only once, or it might attack every vehicle that enters the zone. Decide whether a hazard deals damage, knocks a vehicle off course, or both. The hazard's CR should be close to the item levels of the vehicles involved in the chase, and should use the corresponding attack bonus and damage amount (see the below table). If a hazard knocks vehicles off course, the pilot of any vehicle it hits takes a –4 penalty to [[Piloting]] checks (in addition to its normal modifiers) for 1 round. If a hazard both deals damage and knocks the target off course, reduce the attack bonus by 2 and halve the damage.
Adamantine is a starmetal, one of several valuable metals mined from asteroids and planets throughout the universe. Pure adamantine is exceedingly rare and expensive, so weapons using adamantine are always made of an adamantine alloy. Weapons or ammunition fashioned from adamantine alloy overcome the [[damage reduction]] of creatures with DR/adamantine, such as many magical constructs, and have a natural ability to ignore hardness when sundering weapons or attacking objects, ignoring hardness less than 30. Weapons and ammunition without metal parts can't be made from adamantine alloy.
This metal can be fashioned into threads and incorporated into the composite material of any armor. Wearing such armor provides you with DR 2/—.
<div class= "table-wrapper">
|Form | Cost |h
|Ammunition (1 piece) | +50 credits |
|Armor or weapon | +2,500 credits |
|Raw material (1 bulk) | 625 credits |
</div>
Famously strong, pure adamantine is too expensive to incorporate into something as large as a starship, but its alloys can impart some of the metal's infamous deadliness and impregnability.
''Armor:'' Adamantine alloy armor protects a starship against all but the strongest attacks. This armor grants the starship a Damage Threshold equal to the armor's bonus to AC, stacking with the starship's existing Damage Threshold. Adamantine alloy increases a starship's size category by 1 for the purpose of calculating the cost of its armor; the value of a Supercolossal ship's size category increases from 8 to 9 for this purpose. See [[Fortified Hull]] for denser adamantine armor.
''Weapon Mount:'' Adamantine alloy weapons are extraordinarily destructive, capable of tearing apart unprotected targets. When such a weapon strikes a target in a quadrant without functioning shields, it deals +1 damage per damage die to the target. Against a starship with functioning [[deflector shields]], an adamantine alloy weapon reduces that quadrant's defense value by an additional 1 for each hit that reduces the target's Hull Points; this stacks with the effects of weapon special properties such as [[array|Array (starship weapon property)]], [[line|Line (starship weapon property)]], and [[ripper]]. Mounting an adamantine alloy weapon increases its BP cost by an amount equal to half the weapon's damage dice. If a weapon's damage is multiplied, multiply the cost increase by an equal amount.
<div class= "table-wrapper">
|Upgraded System | BP Cost |h
|armor | special |
|weapon mount | special |
</div>
Steadfast and loyal, steel-colored adamantine dragons are often the center of small, tight-knit communities (such as starship crews or mercenary squads).
* ''CR:'' 3+
* ''Required Creature Type and Subtype:'' Dragon (earth)
* ''Suggested Alignment:'' Lawful neutral
* ''Traits:''
** [[blindsense]] (vibration) 60 feet; [[darkvision]] 120 feet
** adamantine extension aura (see below); [[frightful presence]] (CR 14+, 60 feet + 10 feet per CR)
** [[void adaptation]]; [[DR]] 5/[[adamantine]] and magic (increase to DR 10/adamantine and magic at CR 9, DR 15/adamantine and magic at CR 11, DR 20/adamantine and magic at CR 13); [[immunity]] to acid
** burrow speed of 30 feet
** [[breath weapon]] (cone 15 feet + 5 feet per 2 CR, 1d8 P + 1d8 per CR)
** spell-like abilities (CR 8+)
** [[spaceflight]]
* //Adamantine Extension ([[Su]]):// An adamantine dragon can share some of its trademark toughness with its allies. Allied creatures within 20 feet of an adamantine dragon gain [[damage reduction]] equal to one-fifth that of the dragon's.
These adamantine-alloy plates augment the vehicle's exterior defenses, increasing the vehicle's [[hardness]] by an amount based on the modification's model.
<div class= "table-wrapper">
|Modification | Level | Price | Hardness Increase |h
|adamantine plating, mk 1 | 3 | 1,500 | 2 |
|adamantine plating, mk 2 | 9 | 14,000 | 4 |
|adamantine plating, mk 3 | 20 | 800,000 | 10 |
</div>
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' up to three creatures
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
Dwarves created //adamantine shot// to turn common ammunition into deadly projectiles with siege and mining potential. You transmute one longarm round or similar missile, such as an arrow, into a magical projectile that performs as [[adamantine alloy]] ammunition, then you launch it. The round splits into three; attempt an attack against a target’s KAC for each projectile. On a success, a shot deals piercing damage based on the slot you used to cast the spell and has the [[knockdown]] critical hit effect. Each shot also has the [[breach]] weapon special property, but you use your key ability score in place of Strength and add triple the spell-slot level you used to the roll instead of item level.
* ''1st:'' When you cast //adamantine shot// as a 1st-level spell, each projectile deals 1d8 piercing damage.
* ''2nd:'' When you cast //adamantine shot// as a 2nd-level spell, each projectile deals 2d8 piercing damage.
* ''3rd:'' When you cast //adamantine shot// as a 3rd-level spell, each projectile deals 3d8 piercing damage.
* ''4th:'' When you cast //adamantine shot// as a 4th-level spell, each projectile deals 5d8 piercing damage.
* ''5th:'' When you cast //adamantine shot// as a 5th-level spell, each projectile deals 7d8 piercing damage.
* ''6th:'' When you cast //adamantine shot// as a 6th-level spell, each projectile deals 9d8 piercing damage.
Choose three technomancer spells that you do not know, each with a level equal to or less than the highest spell level you can cast. As a move action, you can add one of these spells to your list of technomancer spells known for 1 minute. If you have the [[cache capacitor]] class feature and you could add that spell to one of your cache capacitor's slots, you can add the spell to your cache capacitor during this time to extend its duration as described by that class feature. You can use this ability multiple times each day, but each time you use it after the first in a single day, you must spend 1 Resolve Point. If you use adaptable spell knowledge again before the duration expires, you replace the previous spell with your new choice. Each time you gain a technomancer level, you can replace one spell you selected with this ability with another choice.
Your nanites capably innovate new features when you manifest nanite weapons. Choose two of the following special weapon properties: [[block]], [[bright]], [[deflect]], [[feint|Feint (weapon property)]], [[grapple|Grapple (combat maneuver)]], [[harrying]], [[penetrating]], [[stun]], [[sunder|Sunder (weapon property)]], or [[trip|Trip (weapon property)]].
Each time you form a weapon using your [[gear array]], you can apply one of the selected special weapon properties to that weapon. You can select this knack multiple times; each time, select two additional special weapon properties and add them to the list of available properties (you still apply only one at a time).
An weapon fitted with an //adaptive// fusion adjusts to any target it hits repeatedly. The fusion's benefits can be granted against only one target at a time. Once the weapon hits a new target, it resets and starts building up momentum against that target, losing the benefits it might have had for any previous target. An adaptive weapon gains the following benefits depending on how many hits it has scored against a given target. The effects are cumulative.
* ''3+ Hits:'' The weapon ignores an amount of the target's energy [[resistance]] or damage [[resistance]] equal to half the weapon's item level.
* ''5+ Hits:'' The weapon gains an enhancement bonus to damage equal to half the item level.
* ''7+ Hits:'' The target is [[flat-footed]] against attacks made with this weapon.
You can duplicate the effects of cybernetics with biotech by using adaptive biochains—microscopic cells that can reform themselves into replacements for technology within the body of a living host. This replicates the effects of any cybernetic augmentation, but it costs an additional 10% due to the price of the biochains. Adaptive biochains can also be used to replace any existing cybernetic with a biotech version of the same device; doing so has the same price and time as introducing a new adaptive biochain.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|adaptive biochains | 3 | varies | varies |
</div>
You have a few extra eldritch tricks up your sleeve.
''Prerequisites:'' Key ability score 19, caster level 7.
''Benefit:'' Select three spells from class spell lists you can cast spells from. They must be at least 1 level lower than the highest spell level you can cast. Once per day, you can cast one of these spells as a spell-like ability. Each time you gain a caster level, you can change which three spells you have selected with this feat.
An //adaptive defense module// emulates the ever-shifting defense of the [[tekhoinos]]. When you take acid, cold, electricity, fire, or sonic damage from an attack, you gain [[resistance]] to that energy type equal to 5 × the upgrade's mark number; this resistance does not apply to the triggering attack, and it lasts for 10 minutes or until you take energy damage of another of those types, triggering a new resistance.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|//adaptive defense module//, mk 1 | 7 | 6,500 | 1 | any | — |
|//adaptive defense module//, mk 2 | 14 | 75,000 | 1 | any | — |
|//adaptive defense module//, mk 3 | 17 | 250,000 | 1 | any | — |
</div>
As a standard action, you can expend an unused spell slot to construct magical defenses from the foreign particles in your wounds, granting you [[resistance]] to one type of energy damage dealt to you within the past minute. This resistance is equal to your class level and lasts for a number of rounds equal to the level of the spell slot you expended. You can spend 1 Resolve Point to activate this magic hack as a move action.
This intelligent polymer weave covers the entire armor. When in an unattuned state, the first time you take energy damage (acid, cold, electricity, fire, or sonic), the adaptive mesh transforms to better withstand attacks of the same type; your armor thereafter grants you [[energy resistance]] 5 against that energy type. The energy resistance does not apply to the initial attack. The armor remains attuned to that energy type (even if you take other forms of energy damage) until it has taken no damage of the attuned type for 5 minutes. It then becomes unattuned.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|adaptive energy shield | 10 | 17,500 | 1 | any, shield* | L |
</div>
You can adjust your fighting style to match specific conditions during combat.
''Prerequisites:'' Three or more combat feats.
''Benefit:'' Select three combat feats that you do not have but whose prerequisites you meet. Once per day as a move action, you can gain the benefit of one of these feats for 1 minute. Each time you gain a level, you can replace one of these three selected feats with a different feat that you don't have but meet the prerequisites for.
At the start of a starship combat round, you can expend your [[Adaptive Fighting]] feat to apply the TIM benefit associated with one of your selected feats until the end of the round.
Originally created for military operatives but favored by criminals throughout the galaxy, these pads of nanotech-infused artificial flesh replace the skin of your palms and fingertips. You leave no identifying fingerprints behind when touching an object or surface, and you can't be identified through your fingerprints. In addition, if you have access to records of another individual's fingerprints, you can spend 1 Resolve Point to create wrinkled patterns in the pads that mimic those fingerprints for 1 hour, allowing you to bypass security features or leave false evidence.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|adaptive fingerprints | 6 | 4,030 | all hands |
</div>
Choose three graviton revelations that you don't have. When you become fully graviton attuned, you gain one of these revelations of your choice until you are no longer fully graviton attuned. Temporarily gaining this revelation doesn't count against your total number of photon and graviton revelations for the purpose of tracking disproportionate revelations. Whenever you gain a level, you can change one of the chosen revelations.
Choose three photon revelations that you don't have. When you become fully photon attuned, you gain one of these revelations of your choice until you are no longer fully photon attuned. Temporarily gaining this revelation doesn't count against your total number of photon and graviton revelations for the purpose of tracking disproportionate revelations. Whenever you gain a level, you can change one of the chosen revelations.
Your training enables you to adapt and evolve formidable temporary defenses.
''Prerequisites:'' [[Enhanced Resistance]], base attack bonus +4, early stage adaptation racial trait
''Benefit:'' You gain an option for your early stage adaptation ability, allowing you to change the damage type your Enhanced Resistance applies to. This change lasts for the normal duration of your early stage adaptation ability.
A dose of //adaptive serum// consists of a small piece of [[ksarik]] flesh (usually the tip of one of its tentacles) floating in a slightly alcoholic tincture. For an hour after you consume an adaptive serum, the first time you take energy damage, you gain [[resistance]] against that type of damage for that attack and for the remainder of the hour or until you rest 10 minutes to regain Stamina Points, whichever comes first. The amount of energy resistance you receive depends on the level of the serum.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Resistance |h
|//adaptive serum//, mk 1 | 4 | 350 | — | 5 |
|//adaptive serum//, mk 2 | 8 | 1,500 | — | 10 |
|//adaptive serum//, mk 3 | 12 | 5,500 | — | 15 |
</div>
You can transform one or more parts of your body into a deadly weapon. This adaptive strike can take almost any form, such as curved claws, sharp teeth, a club-like tail, fiery wings, porcupine-like quills you can launch as projectiles, or throat glands that let you spit acid. Whatever its nature, your adaptive strike has a physical form that’s apparent to a casual observer.
Your adaptive strike can’t be disarmed, dropped, or sundered. It doesn’t interfere with your ability to wield equipment and doesn’t require hands to wield. Melee adaptive strikes are treated as basic melee weapons and threaten squares within your reach. Ranged adaptive strikes are treated as small arms. Manifesting or dismissing your adaptive strike is a move action that takes the same amount of effort as drawing or sheathing a weapon (and can be combined with a move as a single move action or used with the [[Quick Draw]] feat).
At 1st level, choose whether your adaptive strike is melee or ranged; a ranged adaptive strike has a range increment of 30 feet. Also choose one of the following damage types for your adaptive strike: acid, bludgeoning, cold, electricity, fire, piercing, or slashing. As normal, an adaptive strike that deals energy damage targets EAC and an adaptive strike that deals kinetic damage targets KAC. Once made, these choices can’t be changed.
Your melee adaptive strike deals damage equal to 1d6 + your Strength modifier. Your ranged adaptive strike deals 1d6 damage. This damage increases to 1d10 at 6th level, 2d8 at 9th level, and 2d10 at 11th level. This damage then increases by 1d10 at 13th level, 15th level, 17th level, and every level thereafter.
An //adaptive Swarm mask// is made from the exoskeleton plates from the head of a Swarm component. The mask counts as a worn magic item unless you install it in armor, taking up one upgrade slot. When you take damage of any type while wearing the mask, it reduces the damage by 5. It then ceases to provide that benefit, instead providing damage reduction or energy resistance 5 against the same damage type for 1 minute. The mask remains adapted to the same damage type even if you take a different type of damage. After the duration elapses, the mask becomes unadapted and can adjust to a new damage type. This mask attracts the attention of Swarm components in the same way weapons with the [[Swarm|Swarm (weapon property)]] weapon special property do.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//adaptive Swarm mask// | 11 | 24,500 | L |
</div>
Your nanites can distill your thoughts into emotional images and feelings, enabling you to communicate with those with whom you don’t share a language. You can use a [[nanite surge]] to communicate simple ideas telepathically to any creatures within the area of your [[cloud array]], even if you don’t share a common language. This doesn’t enable you to comprehend languages spoken within the area of your cloud array that you don’t understand.
You have adjusted one of your armor upgrades to give yourself a few more options.
''Prerequisites:'' Int 19, [[Engineering]] 10 ranks.
''Benefit:'' Select three armor upgrades, each with an item level no greater than half your ranks in [[Engineering]]. If these upgrades require any choices to be made (such as what kind of energy damage they protect against), you must make those choices when you select this feat. With 8 hours of work, you can adapt any armor upgrade of an item level equal to at least half your ranks of Engineering, allowing it to function as one of your three selected upgrades. This upgrade functions only when the upgrade is installed in armor you are wearing. Activating this upgrade requires a move action, after which the upgrade functions as both its normal upgrade and your selected upgrade for 1 minute. If a selected upgrade requires charges, ammunition, or other resources, you must provide them normally; you can add batteries and ammunition to the upgrade as part of the process of adapting it to work with your selected upgrade choices. You can have only one upgrade adapted to be usable with this feat at a time—if you adapt a new upgrade, the adaptations to any previous upgrade are lost.
Once you've used your adapted upgrade, you can't use it again until you've regained Stamina Points after a 10-minute rest.
Each time you gain another rank in Engineering, you can change the three upgrades you have selected with this feat.
You hold your weapon using an extra hand (or more) to better push your enemies around.
''Prerequisites:'' Str 15.
''Benefit:'' For each hand you use to wield your weapon beyond the minimum required to wield that weapon, you increase the distance you can move your opponent with a successful bull rush or reposition combat maneuver by 5 feet. If you use a trip combat maneuver against a flying opponent, you can increase the distance that creature descends by 5 feet for each additional hand used to wield your weapon. Changing your grip to alter the number of hands you are wielding a weapon with is a swift action. You can't hold items in hands used to add leverage, or use them for any other purpose.
<div class="statblock">
* ''Type'' disease (drug use)
* ''Save'' see specific drug
* ''Track'' [[physical]], [[mental]], or both (see specific drug)
* ''Frequency'' 1/day when not using the drug
* ''Effect'' If a creature takes a drug while it has progressed beyond healthy on the drug's progression track, the DC of the saving throw against addiction increases by 2. A creature can attempt a save against an addiction only on a day when it hasn't taken the drug. Each day spent without using the drug decreases the addiction's DC by 2, to a minimum of the starting DC, but using the drug again, even once, returns the DC to its highest value. Each drug addiction is a separate disease.
* ''Cure'' 3 consecutive saves
Some creatures have modes of movement other than walking and running, such as burrowing, climbing, flying, and swimming. Such creatures have a specific speed listed for each movement type. Generally speaking, these additional movement types follow the normal rules for movement, except as detailed below.
!! Burrowing
If you have a burrow speed, you can use move actions to tunnel through dirt. You cannot tunnel through rock unless you have an ability that states otherwise. You can move your full burrow speed while burrowing, but you cannot run. Most burrowing creatures do not leave behind tunnels other creatures can use unless they have an ability that states otherwise; instead, the dirt closes up behind them as if they had not been there.
!! Climbing
If you have a climb speed, you can use move actions to climb slopes, walls, and other steep inclines, and you don't need to attempt an [[Athletics]] check to climb except in hazardous circumstances. You are not [[flat-footed]] while climbing. You receive a +8 bonus to all Athletics checks to climb and can always take 10 while climbing, even if distracted or threatened. You can move your full climb speed when you use the move action while climbing, but you cannot run. You can move double your climb speed with a successful Athletics check to climb, but you take a –5 penalty to the check. Creatures without a climb speed use the Athletics skill to climb.
!! Flying
If you have a fly speed, you can use move actions to fly through the air. A creature with a fly speed has one of three maneuverability classes: clumsy, average, or perfect. Creatures with clumsy maneuverability take a –8 penalty to Acrobatics checks to fly, while those with perfect maneuverability gain a +8 bonus to these checks. Creatures with average maneuverability (the default maneuverability) neither gain a bonus nor take a penalty to [[Acrobatics]] checks to [[fly|Fly (acrobatics)]]. While you are flying, at the start of each turn, choose a primary direction for the round (including up or down). You can move your full fly speed in a straight line in that direction without the need for an Acrobatics check, as long as the wind conditions are favorable.
If you want to change direction while flying, it costs you an additional 5 feet of movement to turn 45 degrees. If you want to ascend, it costs you an additional 5 feet of movement for each square that you move upward. For example, suppose you have a fly speed of 60 feet. As a single move action, you can fly forward 20 feet, turn 45 degrees to the left, and fly one square diagonally (all of which costs 30 feet of your movement). You can then ascend 15 feet, which costs another 30 feet of movement. At this point, you have used your full 60 feet of flying movement, so your move action is over.
If you are flying in an area with zero or low gravity, movement to ascend does not cost extra squares. If you are flying in an area with high gravity, ascending costs double the extra squares of movement.
The Acrobatics skill also details other types of movement that can be made by flying creatures. These require successful Acrobatics checks, and these checks have consequences if you fail. If you have clumsy maneuverability, you cannot use the hover option presented in the fly task of the Acrobatics skill. If you have average maneuverability, all of the options in the fly task of Acrobatics are available to you. If you have perfect maneuverability, you do not have to attempt an Acrobatics check to use the avoid falling damage or hover options; you automatically succeed at these options (unless you are unconscious), though you can still attempt an Acrobatics check to hover as a swift action instead of a move action.
!! Swimming
If you have a swim speed, you can use move actions to swim through liquids, but you don't need to attempt an [[Athletics]] check to swim except in hazardous circumstances. You receive a +8 bonus to all Athletics checks to swim, and you can always take 10 while swimming, even if you are distracted or threatened. You can move your full swim speed while swimming, and you can use the run action while swimming, provided that you swim in a straight line. Creatures without a swim speed use the Athletics skill to swim. A swim speed does not automatically impart the ability to breathe underwater.
The vehicle is equipped with a sidecar or additional interior seating. Increase the number of passengers the vehicle can seat by 50%.
<div class= "table-wrapper">
|Modification | Level | Price |h
|additional seating | 1 | 115 |
</div>
Choose another skill in which you have at least 1 rank from the list of skills you can choose with the [[skill expertise]] class feature; you can use [[expertise]] with that skill. You can choose this talent up to three times, choosing a different skill each time.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one object
* ''Duration'' varies; see text
* ''Saving Throw'' see text
* ''Spell Resistance'' no
</div>
You create a molecular bond between an object you touch (bulk up to 1 + your caster level) and another object or a surface that object is touching. Pulling the object free of that surface then requires a Strength check against the spell’s save DC, although you can dismiss it by touching the object again. If moving or opening the object already requires a Strength check, you increase the DC of that check by half your key ability score bonus. If the adherence is broken, the spell ends. Otherwise, the magic is permanent.
If you instead touch a surface (one 5-foot square), that surface becomes charged with adhering magic for 1 round per level. If a creature touches the surface of the affected square, the creature must succeed at a Reflex saving throw or become [[entangled]] until they successfully save against the spell (they can attempt a new save at the beginning of each of their turns). Once the entangled creature escapes, the spell ends. It also ends if you cast this version of the spell on another area.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Duration'' 1 minute/level
</div>
You alter the chemical composition of your vital fluids to become a glue-like substance when exposed to air. For the duration of the spell, a melee weapon that deals piercing or slashing damage to you is stuck fast unless the wielder succeeds at a Reflex saving throw. A creature can attempt to pry off a stuck weapon as a standard action with a successful Strength check (DC = 10 + half your spellcaster level + your key ability modifier). Strong alcohol or a mixture like basic [[universal solvent]] dissolves the adhesive. The glue also breaks down 5 rounds after you die, or when the spell’s duration ends. This glue has no effect while you’re underwater or in an environment that lacks air.
<div class="statblock">
* ''CR'' 18; ''XP'' 153,600
* NE Medium outsider (daemon, evil, extraplanar)
* ''Init'' +8; ''Senses'' [[darkvision]] 60 ft., //[[true seeing]]//; ''Perception'' +31
!!! DEFENSE
* ''HP'' 315
* ''EAC'' 31; ''KAC'' 32
* ''Fort'' +16; ''Ref'' +16; ''Will'' +22
* ''DR'' 10/good or silver; ''Immunities'' acid, death effects, disease, poison; ''Resistances'' cold 10, electricity 10,fire 10; ''SR'' 29
!!! OFFENSE
* ''Speed'' 30 ft., fly 60 ft. (average)
* ''Melee'' claw +27 (8d8+22 S)
* ''Ranged'' executioner [[disintegrator pistol]] +29 (2d20+18 A; [[corrode]] 1d6)
* ''Spell-Like Abilities'' (CL 18th)
** 1/day—[[summon allies]] (1 adikodaemon 35%)
* ''Spells Known'' (CL 18th, ranged +29)
** 1/day—//[[disintegrate]]// (DC 27)
** 3/day—//[[holographic image]]// (5th level, DC 26), //[[holographic terrain]]// (DC 26), //[[unwilling guardian]]// (DC 26)
** At will—//[[destruction protocol]]//, //[[greater invisibility]]//
** Constant—//[[true seeing]]//
!!! STATISTICS
* ''Str'' +4; ''Dex'' +8; ''Con'' +2; ''Int'' +6; ''Wis'' +4; ''Cha'' +11
* ''Skills'' [[Bluff]] +36, [[Computers]] +31, [[Culture]] +31, [[Disguise]] +36, [[Mysticism]] +31
* ''Languages'' Abyssal, Common, Infernal; [[telepathy]] 100 ft.
* ''Other Abilities'' [[change shape]] (any Small, Medium, or Large creature), terms and conditions
* ''Gear'' bespoke [[echelon fashion]], executioner [[disintegrator pistol]] with 1 high-capacity battery (40 charges)
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or board (3–6)
!!! SPECIAL ABILITIES
''Terms and Conditions ([[Su]])'' When a creature unwittingly allies with an adikodaemon, typically by accepting a boon or favor from the daemon in disguise, they must succeed at a DC 25 Will save or succumb to the curse of planned obsolescence (see below).
!!! Curse of Planned Obsolescence
* ''Type'' curse
* ''Save'' Will DC 25
* ''Effect'' Some of the victim's gear seems to occasionally work better. The first three times per day that the victim attempts an equipment-based skill check (such as using a tool kit), the victim adds 1d6 as an insight bonus to that skill check as a reaction. However, for 1 minute afterward, all of the victim's other gear becomes slightly corrupted. Skill checks using that other gear take a –4 circumstance penalty. Weapons have a 25% chance of targeting the nearest friendly target instead of the intended target. Any other piece of gear (such as activated armor upgrades) has a 50% chance of having its usage doubled for that time.
* ''Cure'' The victim must spend 1 month abstaining from the use of mass-produced gear (which is most equipment available for purchase); this doesn't include gear that the victim or one of the victim's allies crafts.
</div>
Adikodaemons are shapeshifters and tricksters who personify the deaths caused by corporate malfeasance—from casualties brought about by lax safety regulations or by companies deciding not to recall a defective product because it would hurt the bottom line.
A few years ago, a Qabarat-based news agency broadcast an investigative report about a small planet in the Vast called Aurok 6, which featured a near-utopian civilization on its surface but a complicated infrastructure of prisons below. According to the report, Aurok 6's aboveground nations enjoy peace and quiet due to the contributions of a planetary law enforcement agency with international jurisdiction, known only as the Adjudicators, who wield psychic technology and governmental authority to act as judge, jury, and executioners when pursuing criminals. Since the broadcast, several weapons manufacturers have secretly visited the planet, and now examples of experimental "judgment tech" weapons accessories can be found on various dark infospheres throughout the Pact Worlds. The most notable of these is a scope, known as an //adjudicator's eye//, that can supposedly determine the guilt or innocence of a target.
An //adjudicator's eye// functions as a combined [[laser scope|Scope]] and [[nightvision scope|Scope]], but it also contains mnemonopathic sensors capable of scanning a target's memories for recollections of a specified crime or attempted crime. Once per day, in a process that takes 1 minute, you can program the scope's sensors with a single yes-or-no question testing responsibility for a particular crime, such as "Did the target attempt to blow up my starship?" or "Did the target plant the explosive device in the Eoxian embassy?" Three times per day, you can activate an //adjudicator's eye// attached to a weapon as a move action. For the next 10 minutes, when aiming or looking through the scope, the sensors automatically scan targets to reveal their perception of guilt or innocence in regards to that question. Each target must succeed at a DC 18 Will saving throw or the //adjudicator's eye// searches their memories for information about the specified question. These memories indicate only whether or not the target remembers themself as being innocent or guilty of the crime in question, and they do not necessarily reflect the truth (as in the case of someone who has been affected by //[[modify memory]]//). The scope places a "guilty" indicator over any target that recalls participating in the specified crime, and an "innocent" indicator over any target that has no memory of the crime or who succeeded at the Will save. Deactivating an //adjudicator's eye// is a move action.
The //adjudicator's eye// imposes a –2 penalty on attack rolls made with the weapon it is attached to against any unscanned target or any target the scope has deemed innocent.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//adjudicator's eye// | 9 | 12,500 | L |
</div>
You can remove certain mechanical parts of your body in order to reduce your size.
''Prerequisites:'' Con 14; constructed species trait, construct type, or cybernetic augmentations installed in all arms and legs.
''Benefit:'' You can spend 1 minute removing parts of the mechanical apparatuses of your form to reduce your size by one step (Medium to Small, for example); this affects your space and your natural [[reach|Reach and Threatened Squares]]. In addition, your height and weight are reduced by approximately 50%. These removed parts are treated as items of your character level with a combined bulk of 2 until you spend an additional 1 minute reattaching them, regaining your original size.
You can increase your size by bolting on random pieces of junk to your body.
''Prerequisites:'' Con 14; [[Adjustable Frame]]; character level 10th; constructed species trait, construct type, or cybernetic augmentations installed in all arms and legs.
''Benefit:'' In a process that takes 10 minutes, you can attach at least 2 bulk of inert, nonworking electronic equipment (such as a large broken computer system, unconnected computer or robot parts, or a destroyed robot or other such trashed mechanical system) to your body to increase your size by one step (Small to Medium, for example); this aff ects your space and your natural [[reach|Reach and Threatened Squares]]. These adjustments are fragile, and after 1 hour, they break and fall off , reverting you to your original size; you can also spend an additional 10 minutes to remove them on your own. This time doesn’t count as resting to restore Stamina Points. Once removed, the equipment can’t be used for this feat’s benefit a second time, and you must secure more materials. You can use this feat’s benefit only once per day.
You direct the overall flow of battle, delivering key orders, timing fleet movements, and providing motivation at opportune moments. The role of admiral does not necessarily mean that you outrank the other officers or control their actions, but as the armada's leader, you are in a position to influence your forces in unique ways. An armada can only have a single admiral.
* ''Associated Skills:'' [[Bluff]], [[Diplomacy]], or [[Intimidate]]
* ''Officer Bonus:'' morale checks
!! Encourage (Any Phase)
You can encourage a fleet or officer to grant them a bonus to their action. Before that fleet or officer attempts the check, you attempt a DC 10 flat check. If you succeed, you either grant your officer bonus to the triggering check, or you grant a +1 untyped bonus to the check.
!! Rally (Engineering Phase)
You order a fleet to regroup, granting it your officer bonus to morale checks until the end of the round. If the fleet is routed, it attempts a new morale check against the same DC that caused it to rout. If it succeeds, it is no longer routed.
!! Taunt (Helm Phase)
You harangue or mislead an enemy fleet. Attempt a check against an enemy fleet's AC. If you succeed, that fleet takes a penalty equal to 1 + half your officer bonus to all checks until the beginning of the next helm phase. Whether or not you succeed, you can't successfully taunt that fleet again for the rest of the combat.
This pair of nanocarbon devices replaces part of your adrenal glands, and microscopic threads delicately link them to your endocrine system. When you are dying, the number of Resolve Points you need to [[stabilize]] is reduced by 1 (to a minimum of 1 Resolve Point needed to stabilize). This ability doesn't stack with any other ability that allows you to spend fewer Resolve Points to stabilize. In addition, once per day, you can spend the required Resolve Points to stabilize and 1 additional Resolve Point to stay in the fight (regaining 1 Hit Point) in the same round.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|adrenal booster | 8 | 8,900 | endocrine |
</div>
<div class="statblock">
* ''CR'' 11; ''XP'' 12,800
* N Huge magical beast
* ''Init'' +0; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]], telepathy sense 60 ft.; ''Perception'' +20
!!! DEFENSE
* ''HP'' 180
* ''EAC'' 24; ''KAC'' 26
* ''Fort'' +15; ''Ref'' +10; ''Will'' +13
* ''Resistances'' electricity 10, sonic 10
!!! OFFENSE
* ''Speed'' 40 ft.
* ''Melee'' bite +24 (4d6+19 P plus [[swallow whole]]) or phasic claws +24 (2d8+19 So; critical [[wound]] [DC 18]) or tail scourge +24 (2d8+19 E)
* ''Multiattack'' bite +18 (4d6+19 P plus [[swallow whole]]), phasic claws +18 (2d8+19 So; critical [[wound]] [DC 18]), tail scourge +18 (2d8+19 E)
* ''Space'' 15 ft.; ''Reach'' 15 ft.
* ''Offensive Abilities'' [[breath weapon]] (30-ft. cone, 11d6 So [see text], Reflex DC 18 half, usable every 1d6 rounds [see text]), [[swallow whole]] (4d6+19 B, EAC 24, KAC 22, 45 HP)
!!! STATISTICS
* ''Str'' +8; ''Dex'' +0; ''Con'' +5; ''Int'' –4; ''Wis'' +3; ''Cha'' –2
* ''Skills'' [[Athletics]] +25
!!! ECOLOGY
* ''Environment'' temperate or warm plains (Castrovel)
* ''Organization'' solitary, pair, or brood (1–2 adults plus 3–6 juveniles)
!!! SPECIAL ABILITIES
''Phasic Claws ([[Su]])'' See above.
''Breath Weapon ([[Su]])'' See above. An adult nyssholora can't use its breath weapon if it has a creature [[grappled]] in its mouth or for at least 1 round after swallowing a creature.
''Telepathy Sense ([[Su]])'' See above.
</div>
<div class="statblock">
* ''CR'' 14; ''XP'' 38,400
* LG Huge dragon (cold)
* ''Init'' +3; ''Senses'' [[blindsense]] (vibration) 60 ft., [[darkvision]] 120 ft., [[detect alignment]], [[low-light vision]]; ''Perception'' +25
* ''Aura'' [[frightful presence]] (200 ft., DC 22)
!!! DEFENSE
* ''HP'' 235
* ''EAC'' 28; ''KAC'' 29
* ''Fort'' +14; ''Ref'' +14; ''Will'' +19
* ''DR'' 10/magic; ''Immunities'' cold, [[paralysis]], sleep; ''SR'' 25
* ''Weaknesses'' [[vulnerable]] to fire
!!! OFFENSE
* ''Speed'' 40 ft., fly 200 ft. ([[Ex]], clumsy); cloudwalking
* ''Melee'' bite +26 (6d6+22 P)
* ''Multiattack'' bite +20 (3d6+22 P), 2 claws +20 (3d6+22 S), tail slap +20 (3d6+22 B)
* ''Space'' 15 ft.; ''Reach'' 10 ft. (15 ft. with bite)
* ''Offensive Abilities'' [[breath weapon]] (50-ft. cone, 15d8 C, Reflex DC 22 half, usable every 1d4 rounds), [[crush]] (6d6+22 B), paralyzing breath (30-ft cone, 1d6+7 rounds, DC 22)
* ''Spell-Like Abilities'' (CL 14th; melee +26)
** 1/day—//[[greater dispel magic]]//, //[[heat leech]]// (DC 22)
** 3/day—//[[greater invisibility]]//, //[[overload systems]]// (DC 21), //[[resilient sphere]]// (DC 21), //[[soothing protocol]]// (DC 21)
** At will—//[[arcing surge]]// (DC 20), //[[probability prediction]]//
!!! STATISTICS
* ''Str'' +8; ''Dex'' +3; ''Con'' +3; ''Int'' +6; ''Wis'' +3; ''Cha'' +4
* ''Skills'' [[Acrobatics]] +25 (+17 to fly), [[Computers]] +30, [[Diplomacy]] +30, [[Disguise]] +25, [[Life Science]] +30, [[Mysticism]] +25, [[Physical Science]] +30, [[Sense Motive]] +25
* ''Feats'' [[Mobility]], [[Spring Attack]]
* ''Languages'' Auran, Common, Draconic, Dwarven, Terran
* ''Other Abilities'' [[change shape]] (animal or humanoid)
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Cloudwalking ([[Su]])'' A silver dragon can tread on clouds or fog as though on solid ground.
''Paralyzing Breath ([[Su]]):'' Instead of a cone of cold, a silver dragon can breathe a 30-foot cone of paralyzing gas. Each creature within the cone that inhales the gas must succeed at a Fortitude save or be paralyzed for 1d6 rounds plus a number of additional rounds equal to half the dragon's CR.
</div>
<div class="statblock">
* ''CR'' 19; ''XP'' 204,800
* N Small outsider (air, elemental, fire, native)
* ''Init'' +11; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +32
* ''Aura'' gravitational pull aura (120 ft.)
!!! DEFENSE
* ''HP'' 400
* ''EAC'' 34; ''KAC'' 35
* ''Fort'' +22; ''Ref'' +20; ''Will'' +16
* ''Defensive Abilities'' [[void adaptation]]; ''Immunities'' [[elemental immunities]], fire, [[radiation]]
* ''Weaknesses'' [[vulnerable]] to cold
!!! OFFENSE
* ''Speed'' fly 60 ft. ([[Su]], perfect)
* ''Melee'' slam +31 (15d6+28 F)
* ''Ranged'' solar ray +34 (8d8+19 F; critical [[burn]] 6d6)
* ''Offensive Abilities'' conflagration, stellar heat
!!! STATISTICS
* ''Str'' +9; ''Dex'' +11; ''Con'' +6; ''Int'' –3; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +37 (+45 to fly)
* ''Other Abilities'' aglow (90 ft.), [[solar adaptation]], [[spaceflight]]
!!! ECOLOGY
* ''Environment'' temperate or warm land or vacuum
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Aglow ([[Ex]])'' See above.
''Conflagration ([[Ex]])'' Once every 1d4 rounds as a standard action, a mature solar wisp can hurl a portion of its burning form at a grid intersection within 120 feet, at which point the flames detonate, dealing 10d6 fire damage to all creatures within a 20-foot-radius burst. An affected creature can attempt a DC 24 Reflex saving throw to halve the damage.
''Gravitational Pull Aura ([[Ex]])'' A creature within 120 feet of a mature solar wisp has its speed reduced by half when it moves away from the solar wisp, and can move at double its speed when moving toward the solar wisp.
''Solar Ray ([[Ex]])'' A mature solar wisp can project an intense ray of light as a ranged attack against a target within 240 feet.
''Stellar Heat ([[Ex]])'' A creature adjacent to a mature solar wisp takes 3d12 fire damage from the intense heat that the elemental radiates. A creature that succeeds at DC 24 Fortitude save takes half this damage.
</div>
You shout a warning to your allies, focusing their attention on the threats around them.
''Prerequisites:'' Cha 15.
''Benefit:'' As a move action, you can shout a warning to your allies, ending the [[flat-footed]] condition for any ally within 60 feet. You cannot use this feat when you're flat-footed. Once you've used this ability, you cannot do so again until you've regained Stamina Points after a 10-minute rest. This is a sense-dependent ability
This badge, typically made of a metal such as bronze or gold to signify the wearer's rank, prominently features the Aspis Consortium's insignia. These devices are especially sophisticated versions of the conventional Aspis badge, designed to help an agent remain hidden, receive updates, and make speedy escapes. The badge constantly shields itself from detection as if protected by //[[nondetection]]// (CL 8th). Once per day as a standard action, you can spend 1 Resolve Point to gain the //nondetection// effect targeting yourself for 1 hour; if your level is higher than 8, you can use your level in place of the badge's caster level for this effect. Once per month as a full action, you can send a message that doesn't exceed 10 words as if using an unlimited [[comm unit]], though the message can be sent only to a recipient associated with the Aspis Consortium.
As a standard action, you can activate one of two self-destruct protocols for the badge. The quiet protocol causes the badge to disintegrate, which dissolves it into nondescript dust by the start of your next turn. The explosive protocol causes the badge to explode a few seconds later, causing it to function as a mk 3 [[incendiary grenade]] that you throw as part of the action used to activate the badge.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|advanced Aspis badge | 8 | 8,500 | – |
</div>
''Required Feat:'' [[Coordinated Shot]]
When you are threatening a foe with a wielded melee weapon, cover it gains from you doesn't grant it any bonus to AC against your allies' ranged attacks. The foe still counts as having cover for the purpose of effects such as the [[Coordinated Shot]] feat; it simply doesn't gain any cover bonuses to AC against your allies' attacks.
You can use [[locomotive adaptation]] twice per day, and the climb and swim speeds you grant with this theorem increase to 30 feet each. When selecting the movement speed you give the targets, you add a burrow speed of 20 feet as well as an [[extraordinary]] fly speed of 20 feet with average maneuverability to the options from which you can choose. You must have the locomotive adaptation theorem to choose this theorem.
You know how to use advanced melee weapons.
''Prerequisites:'' Proficiency in basic melee weapons.
''Benefit:'' You gain proficiency in advanced melee weapons.
''Normal:'' If you use a weapon with which you are not proficient, you take a –4 penalty to attack rolls with that weapon, and the DC for any saving throws against that weapon's special effects likewise takes a –4 penalty.
Advanced melee weapons require a degree of training and skill to use properly. Advanced melee weapons are divided into one-handed and two-handed weapons.
You can choose from any of the mods on the advanced mod list whenever your drone gains a new mod (in addition to those from the [[basic mod|basic mods]] list). Your drone must always have at least 5 mods from the basic list before you can add any advanced mods, even if you rebuild your drone after it gains this ability.
<<list-links "[tag[Drone Mods]tag[Advanced]sort[title]]">>
Your knowledge of timelines lets you prepare for almost any situation, giving you exactly what you need precisely when you need it. Once per day as a standard action, you can use a [[paradox]] to produce one consumable item (such as a grenade, serum, or spell gem). The item must have a bulk of L or less, and an item level no greater than your level. You immediately lose a number of credits equal to the value of the item, as this ability assumes you prepurchased or traded for this item at the most recent opportunity after glimpsing your future need of it. You can’t use this ability if you don’t have sufficient credits to pay for the item, and you can’t convert other items, except for UPBs, to pay for this cost.
Your [[custom rig]]'s computer functions gain a bonus firewall countermeasure. This firewall has no additional cost, does not count against the maximum number of countermeasures your custom rig can have, and can block off a module or group of modules already protected by a firewall.
In addition, you can use your custom rig to communicate over an encrypted channel with your ship, allowing you to access the ship's sensors, control its security systems, and prepare its engines for takeoff (as well as use the encrypted communications functions of your expert rig) at a range of 50 miles. If you have a drone, you can issue commands to or directly control your drone over an encrypted channel at the same range.
When you defeat a foe, a weapon with the [[advancing]] fusion draws you further into the fray. The first time each round that you make a successful melee attack with an [[advancing]] weapon that drops a foe (by killing it or rendering it unconscious), you can take a guarded step as a reaction. This movement must move you closer to at least one foe.
Aegis suits of heavy armor cover wearers entirely, leading to the suits' nickname of "personal tanks." Helmet visors are narrow or nonexistent, instead projecting video and audio feeds to the wearer. Power-assisted limbs allow the wearer to move intuitively with the suit on.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br>Bonus | KAC<br>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br>Slots | Bulk |h
|aegis series, squad | 12 | 45,200 | +17 | +19 | +3 | –5 | –10 ft. | 5 | 3 |
|aegis series, elite | 17 | 209,000 | +23 | +27 | +3 | –5 | –10 ft. | 6 | 3 |
|aegis series, specialist | 20 | 932,000 | +25 | +28 | +4 | –4 | –10 ft. | 7 | 3 |
</div>
A weapon that has the aeon special property includes a socket that can house an //[[aeon stone]]//. As a standard action, you can slot an //aeon stone// into the socket or remove it. You can slot an //aeon stone// into a weapon only if the weapon has an item level equal to or greater than the //aeon stone's// item level. You don't benefit from the stone's normal abilities while the stone is slotted into a weapon. Instead, an aeon weapon with a slotted //aeon stone// gains the [[boost]] weapon special property, provided it doesn't have the [[blast]] or [[unwieldy]] properties. The amount of the boost's damage increase is dependent on the item level of the slotted //aeon stone//, as follows: level 1–5, 1d4; levels 6–10, 1d6; levels 11–15, 1d8; levels 16–20, 1d10.
A slotted //aeon stone// has a number of charges per day equal to the stone's item level. Utilizing the [[boost]] special property the stone provides spends charges from the stone equal to the weapon's usage value. If the stone lacks enough charges, the boost attempt has no effect. An //aeon stone// that has had any daily charges expended in this way turns a dull color and doesn't confer its usual benefits if removed from the aeon weapon.
name://aeon caster//
range:medium
speed:—
damage:3d4
pcu:10
cost:7
special:[[mystical]], [[restricted]] (Imperial Fleet)
name://aeon caster, heavy//
range:medium
speed:—
damage:6d6
pcu:20
cost:18
special:[[mystical]], [[restricted]] (Imperial Fleet)
An //aeon comm// is a cylindrical booth constructed of resonant crystal that allows remote observation of and communication to space around an //[[aeon stone]]//. A pedestal in the center of the booth can hold one //aeon stone//, and as an action, a user can mystically connect that stone to the nearest stone of the same type with a system-wide range. Alternatively, a user can attune the booth to a known //aeon stone// of the same type in the same system. In either case, the booth creates an invisible magical sensor centered on the targeted //aeon stone//. The booth's crystal reflects the targeted stone's visual and auditory surroundings as if the user were standing at the stone's location. This view doesn't move unless the targeted stone does, but a viewer can turn within the booth to observe the area as desired. A user within the booth can activate the //aeon comm's// communication function to speak through the targeted //aeon stone//, and unlike with technological system-wide communications, the message is transmitted instantaneously.
<div class="table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|//aeon comm// | 5 | 3 |
</div>
<div class= "statblock">
* ''Prerequisite'' Can be applied only to an eternal core.
* ''Rate'' +0; ''Initial'' –1; ''Maximum'' –1
* ''Special'' Once per round, an operator can expend an unused spell slot to grant the mech a number of Power Points equal to half the spell slot's level, rounded down.
* ''Cost'' 0
</div>
Developed by the Azlanti Star Empire, this power core template converts magical energy into mechanical force.
A small technomagical compartment incorporated into a Medium or smaller starship's life-support system, an //aeon diffuser// can hold one //[[aeon stone]]//. The diffuser conveys the benefits of an //aeon stone// placed inside it to all creatures aboard the starship. However, a starship that has [[biometric locks]] can limit the benefit of the //aeon diffuser// to only those creatures able to operate those locks. If the ship's life-support system is malfunctioning, the //aeon diffuser// ceases to convey its benefits. If the ship's life-support system is wrecked, any //aeon stone// within an //aeon diffuser// on the ship is destroyed.
<div class="table-wrapper">
|System | PCU | Cost (in BP) |h
|//aeon diffuser// | 5 | 2 × size category |
</div>
An //aeon eye// replaces one of your eyes with a specialized //[[aeon stone]]// connected to your ocular nerves. As a move action, you can mentally activate or deactivate this augmentation, which grants you [[sense through]] (vision) with a range of 60 feet. While the augmentation is active, you gain no benefit from other special visual senses, and you can't see anything beyond the augmentation's range.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|//aeon eye// | 13 | 46,000 | eye |
</div>
An [[aeon gage]] not only functions as a [[polyhand]], but it also has six sockets in which //[[aeon stones]]// can be slotted. You gain the benefit of each //aeon stone// slotted in your //aeon gage// as if the stone orbited you. If all six sockets contain //aeon stones//, you can also cast one or more of the spells listed below as spell-like abilities. Total the item levels of the //aeon stones// slotted into the //aeon gage// to determine the spells you have access to. While you have access to a spell, you also have access to any spell from a lower level range, as follows:
<div class="table-wrapper">
| Total Levels | Spell |h
| 6–30 | //[[caustic conversion]]// |
| 31-60 | //[[arcing surge]]// |
| 61–90 | //[[corrosive haze]]// |
| 91–120 | //[[heat leech]]// |
</div>
The //aeon gage// has a number of charges per day equal to twice the highest level of spell it provides as a spell-like ability. Using a spell-like ability from the //gage// consumes a number of charges equal to that spell's level. The caster level for these spells is 16th.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|//aeon gage// | 16 | 200,000 | hand |
</div>
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* Azlanti soldier
* LE Medium humanoid (human)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +8
!!! DEFENSE
* ''HP'' 48
* ''EAC'' 19; ''KAC'' 22
* ''Fort'' +5; ''Ref'' +3; ''Will'' +4
!!! OFFENSE
* ''Speed'' 20 ft.
* ''Melee'' thunderstrike [[pulse gauntlet]] +8 (1d6+5 B & So; critical [[knockdown]])
* ''Ranged'' [[AG assault rifle|Aeon Guard Rifle]] +11 (1d8+3 P) or [[frag grenade]] II +11 ([[explode]] [15 ft., 2d6 P, DC 14]) or [[incendiary grenade]] I +11 (explode [5 ft., 1d6 F plus 1d4 [[burn]], DC 14])
* ''Offensive Abilities'' fighting styles ([[sharpshoot]]), [[sniper's aim|Sharpshoot]]
!!! STATISTICS
* ''Str'' +2; ''Dex'' +4; ''Con'' +1; ''Int'' +1; ''Wis'' +1; ''Cha'' +1
* ''Skills'' [[Athletics]] +8, [[Intimidate]] +8, [[Profession]] (soldier) +8, [[Stealth]] +10
* ''Languages'' Azlanti
* ''Gear'' [[AG trooper battle dress|Aeon Guard armor]] (//[[clear spindle]] aeon stone//, [[jump jets]]), [[AG assault rifle|Aeon Guard Rifle]] with 4 magazines (100 longarm rounds), thunderstrike [[pulse gauntlet]] with 2 batteries, [[frag grenade]] II, [[incendiary grenade]] I
!!! ECOLOGY
* ''Environment'' any (Azlanti Star Empire)
* ''Organization'' fire team (3–6), squad (7–12), strike team (7–12 Aeon Guards plus 1 Aeon Guard specialist), or troop (21–48 Aeon Guards plus 1 Aeon Guard specialist)
</div>
<<section 'Aeon Guard Specialist'>>
The powerful Azlanti Star Empire maintains its hold on its subject systems through the might of its military, which is divided into two arms: the Imperial Fleet and the Aeon Guard. Aeon Guards are the elite infantry of the Star Empire; they serve as marines aboard the warships of the Imperial Fleet, protect imperial government and military installations, quell dissent and crush rebellions, and spearhead invasions to conquer and occupy new territories for the Star Empire.
Aeon Guards swear personal oaths of loyalty to the Aeon Throne, and only death in service to the empire can release them from their duty. Only humans are accepted into the ranks of the Aeon Guard, and all of them must be paragons of the Azlanti race.
Aeon Guards are readily identifiable by their distinctive armor, which incorporates the magic of the empire's legendary aeon stones, and many are given cybernetic and biotechnological augmentations in addition to their standard-issue gear. The Aeon Guard stat block represents a rank-and-file trooper who can be found almost anywhere within the Azlanti Star Empire or on one of its starships. Aeon Guard specialists are capable of operating for weeks or even months at a time with little or no support, carrying out secretive missions of espionage, infiltration, reconnaissance, or sabotage.
!! Aeon Guard Armor
{{Aeon Guard Armor}}
!! Aeon Guard Rifles
{{Aeon Guard Rifle}}
Standard issue for soldiers of the Azlanti Star Empire's elite military, [[Aeon Guard]] battle dress is a suit of heavy armor consisting of close-fitting ceramic and polycarbonate plates overlaid with an energy-reflective molecular coating. SpecOps armor, designed for use by Aeon Guard specialists, is of the same design but in a lighter, more agile package. In addition to slots for traditional armor upgrades, each suit of Aeon Guard battle dress also includes additional aeon upgrade slots that can be used to house only aeon stones. Placing an [[aeon stone]] in an aeon upgrade slot allows you to benefit from the aeon stone's abilities as if it was orbiting your head. In the Azlanti Star Empire, civilian possession of a suit of Aeon Guard battle dress is a criminal offense punishable by death.
For all its utility, Aeon Guard armor is also highly stylized, designed to impress and intimidate the enemy. The most recognizable part of its design is its helmet, which always includes a blank, full-face mask designed to give the soldier a disturbing, almost robotic look while also making it impossible to recognize specific soldiers. This is as much for the soldier's benefit as the enemy's, as being unable to distinguish one's comrades makes it easier to ignore personal attachment and remain a true tool of the throne. Standard Aeon Guard troopers often have a single aeon stone set in the faceplate, but officers may have a different number or configuration.
<div class= "table-wrapper">
|multilevel |k
|Armor | Level | Price | EAC<br>Bonus | KAC<br>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br>Slots | Bulk |h
|!Light Armor |<|<|<|<|<|<|<|<|<|<|
|SpecOps armor, AG | 7 | 7,500 | +7 | +8 | +5 | –1 | — | 3 + 2* | 1 |
|!Heavy Armor |<|<|<|<|<|<|<|<|<|<|
|battle dress, AG trooper | 3 | 1,650 | +5 | +7 | +2 | –3 | –10 ft. | 1 + 1* | 3 |
|battle dress, AG command | 10 | 18,750 | +15 | +17 | +3 | –3 | –10 ft. | 2 + 3* | 3 |
|* Upgrade slots marked with an asterisk are aeon upgrade slots; these slots can be used only to hold [[aeon stones]].|<|<|<|<|<|<|<|<|<|<|f
</div>
<div class="statblock">
* ''CR 15''; ''XP'' 51,200
* Azlanti soldier
* LE Large humanoid (Azlanti)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +26
!!! DEFENSE
* ''HP'' 275
* ''EAC'' 29; ''KAC'' 34; +2 vs combat maneuvers
* ''Fort'' +17, ''Ref'' +15, ''Will'' +15
* ''Defensive Abilities'' [[enhanced tank|Armor Storm]]; ''Resistances'' fire 15
!!! OFFENSE
* ''Speed'' 30 feet
* ''Melee'' fist +25 (3d10+1d6+28 B)
* ''Ranged'' //[[guarded]]// blue star [[plasma array]] +28 (5d10+1d6+15 E & F; critical [[burn]] 4d4) or
[[NIL grenade launcher]] ([[explode]] [15 ft.] 10d6 P, DC 21)
* ''Space'' 10 ft; ''Reach'' 10 ft.
* ''Offensive Abilities'' fighting styles ([[armor storm]], [[squad]]), [[soldier's onslaught]]
!!! STATISTICS
* ''Str'' +9; ''Dex'' +0; ''Con'' +7; ''Int'' +1; ''Wis'' +1; ''Cha'' +2
* ''Skills'' [[Athletics]] +31, [[Engineering]] +26, [[Intimidate]] +26
* ''Feats'' [[Coordinated Shot]], [[Suppressive Fire]]
* ''Languages'' Azlanti
* ''Other Abilities'' [[automatic expert]], [[coordinated aim|Squad]], [[heavy onslaught]], [[quick backup|Squad]], [[smash through|Armor Storm]]
* ''Gear'' [[Aeon Guard elite harness]] (//[[guarded]]// blue star [[plasma array]] with 10 batteries [20 charges each], [[infrared sensors]], //[[kaleidoscopic icosahedron]]// aeon stone, mk 3 [[thermal capacitor]], [[NIL grenade launcher]] with 12 [[frag grenades]] V, //[[obsidian annulus]]// aeon stone, [[targeting computer]]) with 1 battery (40 charges)
<div class="statblock">
* ''Level 15''; ''Price'' 125,000
* ''EAC Bonus'' +19; ''KAC Bonus'' +24
* ''Max Dex Bonus'' +3; ''Armor Check Penalty'' –3; ''Speed'' 30 feet
* ''Strength'' 28 (+9); ''Damage'' 2d8 B
* ''Weapon Slots'' 3; ''Upgrade Slots'' 2+2*
* ''Capacity'' 40; ''Usage'' 1/hour
* ''Size'' Large (10-ft. reach); ''Bulk'' 40
</div>
The Star Empire equips elite Aeon Guard units with powered armor designed for extensive field operations and customized to include slots for a pair of aeon stones. Soldiers in these units form the frontline in major assaults and serve as rallying points for less well-equipped troops forced to retreat.
* Upgrade slots marked with an asterisk are aeon upgrade slots; these slots can be used only to hold [[aeon stones]].
The AG series of longarms is manufactured by government-held factories for the sole use of the Aeon Guard. Its ingenious designers are held via lifelong "contracts" as pampered but neurally locked prisoners of the throne. The AG assault rifle is a selective-fire rifle that is standard issue for rank-and-file troops. Other weapons in the series include the AG accelerator rifle, which uses magnetic fields to propel metal projectiles like a magnetar rifle does, and the rocket propelled–projectile rifle (RPPR, or "Ripper," as it's known in the ranks of the Aeon Guard), which fires mini-rockets like those used in gyrojet rifles. Pact Worlds intelligence believes that some AG weapons can also be equipped with //[[aeon stones]]//, though what functions they provide and how this hybrid technology actually works is unknown. In the Azlanti Star Empire, civilian possession of any AG-series weapon is a criminal offense punishable by death.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|AG assault rifle | 3 | 1,400 | 1d8 P | 80 ft. | — | 12 rounds | 1 | 1 |[[automatic]] |
|AG accelerator rifle | 7 | 7,500 | 3d4 P | 60 ft. | — | 16 rounds | 1 | 2 |[[automatic]] |
|RPPR | 10 | 21,000 | 2d12 B | 60 ft. | [[knockdown]] | 12 mini-rockets | 1 | 2 |— |
</div>
<div class="statblock">
* ''CR'' 7; XP 3,200
* Azlanti operative
* LE Medium humanoid (human)
* ''Init'' +8; Senses [[blindsense]] (emotion) 60 ft., [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +15
!!! DEFENSE
* ''HP'' 102
* ''EAC'' 22; ''KAC'' 23
* ''Fort'' +9; ''Ref'' +9; ''Will'' +10; +2 vs. disease and poison
* ''Defensive Abilities'' [[evasion]], [[uncanny agility]]; ''DR'' 5/—; ''Resistances'' acid 5
!!! OFFENSE
* ''Speed'' 40 ft., fly 30 ft. ([[jetpack]], average)
* ''Melee'' tactical [[knife]] +13 (2d4+9 S)
* ''Ranged'' [[AG accelerator rifle|Aeon Guard Rifle]] +15 (3d4+7 P) or corona [[laser pistol]] +15 (2d4+7 F; critical 1d4 [[burn]])
* ''Offensive Abilities'' [[debilitating trick]], [[trick attack]] +4d8
!!! STATISTICS
* ''Str'' +1; ''Dex'' +5; ''Con'' +1; ''Int'' +4; ''Wis'' +2; ''Cha'' +1
* ''Skills'' [[Acrobatics]] +20, [[Athletics]] +15, [[Computers]] +20, [[Piloting]] +15, [[Profession]] (soldier) +15, [[Stealth]] +20
* ''Languages'' Azlanti, Common, 4 additional languages
* ''Other Abilities'' operative exploits ([[cloaking field]]), specialization ([[ghost|Ghost (specialization)]])
* ''Gear'' [[AG SpecOps armor|Aeon Guard armor]] (clear spindle [[aeon stone]], [[deflective reinforcement]], [[filtered rebreather]], [[jetpack]], //[[purple sphere]] aeon stone//), [[AG accelerator rifle|Aeon Guard Rifle]], corona [[laser pistol]], tactical [[knife]], [[efficient bandolier]] (200 longarm rounds and 2 ultra-capacity batteries)
!!! ECOLOGY
* ''Environment'' any (Azlanti Star Empire)
* ''Organization'' solitary, pair, strike team (1 Aeon Guard specialist plus 7–12 Aeon Guards), or troop (1 Aeon Guard specialist plus 21–48 Aeon Guard)
</div>
Early Azlanti starships flew without shields, but meteors and debris spurred research. The first Azlanti starship shields were magical //aeon shields//; less powerful than modern energy shields, they regenerated quickly but scaled up poorly with larger craft. Unlike normal energy shields, aeon shields regenerate during combat. At the start of the [[Engineering]] phase, the science officer can distribute these Shield Points as they see fit.
<div class="table-wrapper">
|System | Total SP | Regen. | PCU | Cost (in BP) |h
|//aeon shields// 10 | 10 | 1/round | 10 | 3 |
|//aeon shields// 30 | 30 | 3/round | 20 | 8 |
|//aeon shields// 50 | 50 | 5/round | 30 | 15 |
|//aeon shields// 80 | 80 | 8/round | 45 | 20 |
</div>
<div class="statblock">
* ''CR'' 7; ''XP'' 3,200
* N Fine construct (magical, swarm, technological)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +14
!!! DEFENSE
* ''HP'' 91
* ''EAC'' 19; ''KAC'' 20
* ''Fort'' +6; ''Ref'' +10; ''Will'' +6
* ''Defensive Abilities'' [[swarm defenses]]; ''Immunities'' [[construct immunities]], [[swarm immunities]]; ''SR'' 18
* ''Weaknesses'' [[vulnerable]] to electricity
!!! OFFENSE
* ''Speed'' fly 40 ft. ([[Su]], perfect)
* ''Melee'' [[swarm attack]] (1d6+9 B plus [[distraction]] [DC 17])
* ''Space'' 10 ft.; ''Reach'' 0 ft.
* ''Offensive Abilities'' telekinetic whirlwind
* ''Spell-Like Abilities'' (CL 7th)
** At will—//[[magic missile]]//
!!! STATISTICS
* ''Str'' +0; ''Dex'' +5; ''Con'' —; ''Int'' +1; ''Wis'' +3; ''Cha'' +1
* ''Skills'' [[Computers]] +14, [[Engineering]] +14, [[Life Science]] +19, [[Mysticism]] +19, [[Physical Science]] +19
* ''Languages'' Azlanti (can't speak); [[telepathy]] 100 ft.
* ''Other Abilities'' aeon upgrade (//[[purple sphere]] aeon stone//), remote hack, [[unliving]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Aeon Upgrade ([[Su]])'' An aeon stone network benefits from one //[[aeon stone]]// with an item level of its CR or lower.
''Remote Hack ([[Ex]])'' An aeon stone network has the [[remote hack]] feature as if it were a mechanic of a level equal to its CR.
''Telekinetic Whirlwind ([[Su]])'' Once per day as a standard action, an aeon stone network can spiral around a Large or smaller creature or object that is completely in its space, negating gravity for that target while it's inside the vortex. The network can remain in this form for 4 rounds, but it can return to its normal form as a move action at any time. The target creature or object moves with the aeon stone network. A creature caught in the telekinetic whirlwind is [[off-target]] and must attempt a DC 17 Reflex saving throw at the end of each of its turns. On a failed save, the creature becomes [[off-kilter]] until the end of its next turn or until it leaves the aeon stone network's space, whichever comes first. A creature can leave the aeon stone network's space if it has some way to move itself in zero gravity or if, as a standard action, it succeeds at an [[Acrobatics]] skill check (DC = 10 + the network's KAC). On a success, the target moves to a square adjacent to the aeon stone network.
</div>
Aeon stone networks are created from specially enhanced //[[aeon stones]]// that orbit one another to form a wireless digital network. These swarms are employed as loyal and tireless system administrators for large corporations in the Azlanti Star Empire, and their creation is strictly regulated.
//Aeon stones// are magic gemstones that orbit your head (or the nearest equivalent of a head, for species that lack heads) and grant you a constant magic effect. They do not count toward your worn magic item limit, and there's no limit to the number you can have orbiting you. They are most common in the Azlanti Star Empire, which also has unique ways of using such stones, but the most common types of aeon stones can be found in magic shops in many major settlements. //Aeon stones// are categorized by their shape and color, with all stones of the same shape and color having the same magic abilities.
Placing an //aeon stone// in orbit around your head is a standard action, and removing it is a move action. An aeon stone must be in orbit for you to benefit from its abilities. The stone orbits at a distance of 3 inches to 3 feet, as you prefer, but always outside any armor or helmet you wear. An orbiting //aeon stone// has an Armor Class equal to 12 + your character level, and it can be attacked directly or even grappled (a successful grapple check plucks the stone out of its orbit and into the attacker's hand).
Most //aeon stones// (including all those presented here) are capable of glowing with a bright light. As a standard action, you can activate or deactivate the illumination of an //aeon stone//, which glows brightly enough to increase the light level in your square by one step.
Each //aeon stone// also has at least one other power that comes into effect when in orbit around you, detailed in the individual descriptions below.
<<compact '[tag<currentTiddler>]'>>
<div class="statblock">
* ''Tier'' 6
* Gargantuan blinkstriker
* ''Operators'' 2–6; ''PP'' 5 (1/turn, max 12)
* ''Speed'' 90 ft.
* ''Senses'' [[blindsense]] (vibration) 30 ft., [[darkvision]] 120 ft., [[low-light vision]]
!!! DEFENSE
* ''HP'' 66; ''SP'' 15; ''Hardness'' 3
* ''EAC'' 23; ''KAC'' 24
* ''Fort'' +6; ''Ref'' +8
* ''Immunities'' [[construct immunities]]
!!! OFFENSE
* ''Base Attack Bonus'' +9
* ''Melee'' thundergauntlet (upper limb—3d6+11 So; critical [[knockdown]])
* ''Ranged'' rotary cannon (frame—3d10+6 P), or laser rifle (frame—3d8+6 F; burn 1d8)
* ''Space'' 20 ft.; ''Reach'' 20 ft.
* ''Strength'' +5
!!! SYSTEMS
* ''Power Core'' mk 2 eternal (aeon core)
* ''Lower Limbs'' fast biped
* ''Upper Limbs'' precision arms (+2 melee, +1 ranged)
* ''Auxiliary'' autotarget, entry hatch, haste circuit, plasma-shock circuits, teleporter
* ''Upgrades'' fleet
</div>
The Aeon Striker relies on its inherent mobility and speed—along with the twitch reflexes of its operators—to control the battlefield. Strikers are found at the flash points of battles, teleporting into the action and unleashing flurries of attacks against larger, slower enemies. After delivering these surgical attacks, the Striker blinks out of range to pursue the next target.
Aeons are a race of neutral outsiders that maintain the balance of reality.
* ''Traits:''
** [[immunity]] to cold, critical hits, and poison
** [[resistance]] 10 to electricity and fire
** bonus equal to CR to skill checks to [[recall knowledge]]
** envisaging (see below), extension of all (see below)
* //Envisaging ([[Su]]):// Aeons communicate without language, first scanning beings for their thoughts and intentions and then projecting psychic flashes of a single concept in response. These flashes are usually a combination of visual and aural stimulation that communicate the aeon's intent or understanding. An aeon's envisaging functions as a nonverbal form of [[telepathy]] with a range of 100 feet, and it counts as a language for the purposes of telepathy and [[truespeech]]. Aeons can't read the thoughts of creatures immune to mind-affecting effects.
* //Extension of All ([[Ex]]):// Aeons can communicate telepathically with other aeons over vast distances. This ability works even across planes, albeit less effectively, allowing the communication of only vague impressions and feelings.
Aeons are inscrutable neutral outsiders often working to maintain and protect reality. They appear as clouds of glowing energy, with a few limbs and tools jutting from the haze. They communicate only in images.
* ''Type:'' outsider (aeon, extraplanar)
* ''Traits:''
** supernatural fly speed of 30 ft. (perfect)
** [[immunity]] to cold, critical hits, and poison
** [[resistance]] to electricity and fire equal to creature's CR
* ''Skills:'' add [[Culture]], [[Engineering]], [[Life Science]], [[Mysticism]], and [[Physical Science]]
* ''Languages:'' [[telepathy]] 100 ft.
name://aeon torpedo launcher, heavy//
range:long
speed:12
damage:6d8
pcu:15
cost:20
special:[[limited fire]] 5, [[mystical]], [[restricted]] (Imperial Fleet)
name://aeon torpedo launcher, light//
range:long
speed:12
damage:3d6
pcu:10
cost:8
special:[[limited fire]] 5, [[mystical]], [[restricted]] (Imperial Fleet)
<div class="statblock">
* ''CR'' 10; ''XP'' 9,600
* N Medium outsider (aeon, extraplanar)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +19
!!! DEFENSE
* ''HP'' 145
* ''EAC'' 23; ''KAC'' 24
* ''Fort'' +11; ''Ref'' +9; ''Will'' +13
* ''Defensive Abilities'' adaptive defense, [[unflankable]]; ''Immunities'' cold, critical hits, poison; ''Resistances'' electricity 10, fire 10; ''SR'' 21
!!! OFFENSE
* ''Speed'' 20 ft., fly 40 ft. ([[Su]], perfect)
* ''Melee'' slam +19 (2d8+12 B)
* ''Multiattack'' 3 slams +13 (1d10+12 B)
* ''Ranged'' telekinetic blast +21 (2d8+10 B; critical [[knockdown]])
* ''Offensive Abilities'' pattern bind
* ''Spell-Like Abilities'' (CL 10th)
** 1/day—//[[hold monster]]// (DC 20), //[[plane shift]]// (self only)
** 3/day—//[[synaptic pulse]]// (DC 19)
** At will—//[[invisibility]]//
!!! STATISTICS
* ''Str'' +2; ''Dex'' +5; ''Con'' +2; ''Int'' +2; ''Wis'' +8; ''Cha'' +3
* ''Skills'' [[Acrobatics]] +19 (+27 to fly), [[Culture]] +19 (+29 to recall knowledge), [[Engineering]] +19, [[Life Science]] +19 (+29 to recall knowledge), [[Mysticism]] +24 (+34 to recall knowledge), [[Sense Motive]] +19, [[Stealth]] +24
* ''Languages'' [[envisaging|Aeon Subtype Graft]]
* ''Other Abilities'' [[no breath]]
!!! ECOLOGY
* ''Environment'' any (Outer Planes)
* ''Organization'' solitary, pair, or collective (3–10)
!!! SPECIAL ABILITIES
''Adaptive Defense ([[Ex]])'' When a tekhoinos takes acid, electricity, fire, or sonic damage, it gains [[resistance]] 10 to that damage type. This resistance does not apply to the triggering attack, and it lasts for 1 hour or until the tekhoinos takes damage of another of those types, triggering a new resistance. This resistance stacks with other sources of energy resistance.
''Pattern Bind ([[Su]])'' As a standard action, a tekhoinos can force a creature within 100 feet to repeat its actions unless it succeeds at a DC 19 Will saving throw. Whatever full, standard, or move actions the creature takes on its turn after being subjected to this effect, the target must repeat on the following turn. The creature must take the same actions in the same order (for example, moving its speed and casting a specific spell) and must act against the same target or targets. However, the creature doesn't have to make exactly the same choices (such as moving the same number of squares or choosing the same command for the //[[command]]// spell). If the target is unable to repeat an action, it is unable to act and its turn ends immediately. A creature that is affected by pattern bind can't delay, and if it readies an action on the first turn it is affected, it must ready the same action on its following turn using the same trigger. Whether or not a creature succeeds at its saving throw against this ability, it is immune to further instances of this effect for 24 hours.
''Telekinetic Blast ([[Ex]])'' A tekhoinos's telekinetic blast has a range increment of 50 feet.
</div>
The enigmatic aeons maintain balance in the multiverse according to rules known only to themselves. Each variety of aeon holds sway over an aspect of the natural order and seeks to maintain equilibrium, indifferent to any concerns of ethics or morality. Tekhoinos aeons concern themselves with the balance between social development and technological advancement. Populations whose scientific advancements have outstripped their social development are likely to draw a tekhoinos's attention, as are those who forcefully suppress technological development in favor of spiritual concerns.
Tekhoinos often become involved when a society is uplifted or held back by outside forces, but they also step in when a society manages to unbalance itself. Exactly what constitutes a society out of balance is determined by an intricate code unfathomable to any but the aeons. When an imbalance is suspected, a single tekhoinos visits the society, gathers intelligence with its innate powers, and then confers with a larger collective of tekhoinos and other aeons via its envisaging ability. Once a consensus is reached, the tekhoinos can begin its intervention, wait for reinforcements, or move on to seek out more imbalanced civilizations.
Technological excess that would draw a tekhoinos's attention might include any less-advanced species that stumbles across advanced technology or species that invent technologies that their societies lack the cultural maturity to handle. On the other end of the spectrum, societies that eschew technology to the extent that harm is done to their societal development might attract tekhoinos, which then seek to inspire new inventions or disrupt the social constructs that keep technological innovation at bay. Tekhoinos prefer covert actions such as manipulation and sabotage to direct confrontation, but this preference is not out of a desire to protect the recipients of their intervention—the aeons have merely found that subtlety makes for more lasting change. This clandestine approach also does not mean the aeons' actions are benign. A collective might rectify an imbalance through covert manipulation of key individuals or targeted assassinations, or they might take more drastic measures, such as detonating a starship's reactor or instigating a war, all based on cold calculations regarding which actions give the highest probability of long-term success.
Tekhoinos take great pains to hide their presence, lest notice of their tampering lead to further imbalance. They spend most of their time invisible, and they move carefully and deliberately to further evade detection. They prefer to incapacitate those who discover them, but they don't hesitate to dispose of creatures that prove a threat to their aims.
Tekhoinos normally intervene in the affairs of single planets, isolated communities, or remote outposts since sprawling planetary and interplanetary populations more readily resist change and are more likely to uncover tekhoinos's manipulations. However, when major populations swing so far out of balance that they can't be ignored, they warrant intervention by multiple tekhoinos collectives. Such grand interventions can require generations of covert observation and manipulation before massive, coordinated action, all overseen by elder aeons of significantly greater capabilities.
Such major actions might be subtle. However, if the threat of the imbalance is widespread but its source centralized, or if swift action is required, the intervention could resemble an invasion. The tekhoinos collectives assigned to the intervention might take direct control of problematic sites or objects. Forced into such action, the aeons then directly confront any defenders of those problem areas.
A tekhoinos has no eyes, instead perceiving with its entire body. Three tentacle-like limbs revolve around a tekhoinos's nebulous core, and the substance of each limb shifts constantly. Across the aeon's body, patterns of crystalline circuitry and iridescent vapor form, propagate, and give way, the same structure never repeating. The typical tekhoinos measures 4 feet across but weighs only a few pounds.
Like all their kin, tekhoinos communicate using mental imagery rather than words. Among their own kind, they can share the full range of experience and emotion via these images, but communication with non-aeons is far more limited. However, as caretakers of civilization, tekhoinos have better insight into the minds of other creatures than typical aeons have. They can make full use of their telepathic images to communicate with other creatures even when such interactions would normally require a shared language.
!! Adaptive Defense Module Armor Upgrades
Despite their secrecy, tekhoinos have been identified as the corrective force behind more than one newly stabilized society, and they have even been celebrated for their role. One civilization on a lonely planet in Near Space had great mastery over magic and technology, but its people had long turned a blind eye to the great suffering they caused one another. After a tekhoinos intervened and ushered in an era of peace and prosperity, these people designed an armor upgrade meant to honor their benefactor.
{{Adaptive Defense Module}}
These aeonaut suits are the precursors to the armor worn by modern Azlanti Star Empire aeon troopers. Little more than well-insulated plate armor, they have no integrated breathing apparatus. Instead, two upgrade slots in the helmet are designed for //[[clear spindle]]// and //[[iridescent spindle]] aeon stones//, negating the wearer’s need to eat, drink, and breathe. They were also sometimes equipped with gyroscopic stabilizers or //[[cloudy blue rhomboid]] aeon stones//.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br/>Bonus | KAC<br/>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br/>Slots | Bulk |h
|aeonaut suit, traveler | 2 | 525 | +3 | +5 | +2 | –3 | –5 | 1+2* | 3 |
|aeonaut suit, explorer | 6 | 3,225 | +9 | +11 | +3 | –2 | –5 | 2+2* | 3 |
|aeonaut suit, conqueror | 9 | 12,125 | +13 | +15 | +4 | –2 | –5 | 3+2* | 3 |
|* Upgrade slots marked with an asterisk are aeon upgrade slots; these slots can be used only to hold aeon stones. |<|<|<|<|<|<|<|<|<|f
</div>
<div class="statblock">
* ''CR'' 2; ''XP'' 600
* N Small animal
* ''Init'' +4; ''Senses'' [[low-light vision]]; ''Perception'' +7
!!! DEFENSE
* ''HP'' 22
* ''EAC'' 13; ''KAC'' 15
* ''Fort'' +5; ''Ref'' +7; ''Will'' +1
* ''Defensive Abilities'' bewildering velocity, bullet eater, [[evasion]]
!!! OFFENSE
* ''Speed'' 10 ft., fly 80 ft. ([[Ex]], perfect)
* ''Melee'' bite +7 (1d6+3 P; critical [[bleed]] 1d4)
!!! STATISTICS
* ''Str'' +1; ''Dex'' +4; ''Con'' +2; ''Int'' –5; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +12 (+20 to fly), [[Stealth]] +7, [[Survival]] +7
* ''Feats'' [[Spring Attack]]
!!! ECOLOGY
* ''Environment'' cold and temperate forests
* ''Organization'' solitary, pair, or cloud (3–8)
!!! SPECIAL ABILITIES
''Bewildering Velocity ([[Ex]])'' After moving at least 30 feet, an aerial devil gains concealment until the start of its next turn.
''Bullet Eater ([[Ex]])'' When an aerial devil would be hit by a ranged attack against KAC, it can attempt to pick the projectile out of the air with its beak as a reaction. The aerial devil attempts an [[Acrobatics]] check (DC = the result of the successful attack roll). If successful, the aerial devil takes no damage. The aerial devil must be aware of the attack and not [[flat-footed]]. An aerial devil can't eat ammunition from incredibly large ranged weapons (such as starship's mass driver cannon).
</div>
Aerial devils are birdlike animals with leathery wings and strong, hooked beaks. These creatures are consummate carnivores, their small frames belying their large caloric requirements. Aerial devils attack in small groups, taking turns swooping in and tearing at their victims until the creatures fall, at which point the feast begins in earnest. Thanks to their aerodynamic shape and wing structure, aerial devils can reach incredible speeds. They prefer cold and temperate woodlands (such as those found on the Brethedan moon of Marata) and nest high up in the trees. A typical aerial devil is 3 feet long and weighs a surprisingly light 10 pounds.
But aerial devils are not, in fact, devils in the literal sense. Instead, these creatures gained their moniker from loggers working in the forests inhabited by these creatures. They are considered dangerous pests, as they are sometimes driven to attack conservationists, hikers, tourists, and anyone else who might threaten their nests. Aerial devils have developed the impressive ability to pick incoming solid projectiles out of the air and crush the munitions in their vicious beaks. Ornithologists have yet to discover when aerial devils developed this evolutionary quirk, though not for lack of trying; it is easy to spot scientists who study these creatures from their missing digits and scarred faces.
In rare cases, those who live in close proximity to these little bundles of fury have been able to tame them to a limited degree and train them to do minor tricks. If an aerial devil is kept well fed—a challenge to be sure—it can learn to pick bullets out of the air on command. Some fighter pilots have a stylized image of an aerial devil stenciled onto their spacecraft, paying respect (or perhaps attempting to channel) the creature's impressive flying ability.
<div class="statblock" >
* ''Level'' 18; ''Price'' 1,080,000
* Colossal air, land, and water vehicle (80 ft. wide, 80 ft. long, 40 ft. high)
* ''Speed'' 10 ft., full 450 ft., 50 mph (fly and hover)
* ''EAC'' 31; ''KAC'' 32; ''Cover'' cover
* ''HP'' 320 (160); ''Hardness'' 14
* ''Attack (Collision)'' 23d10 B (DC 17)
* ''Attack'' mining grav laser (8d8 F & force; [[penetrating]] and see below)
* ''Modifiers'' –4 [[Piloting]], –3 attack (–5 at full speed)
* ''Systems'' autopilot (Piloting +31), enhanced sensors ([[darkvision]] 5 miles, [[sense through]] [vision, stone only] 300 ft.), expansion bays (8), unlimited [[comm unit]]
* ''Complement'' 39; ''Passengers'' 200
!!! SPECIAL ABILITIES
''Mining Grav Laser ([[Ex]])'' This heavy weapon has a range increment of 240 feet. When an attack with a mining grav laser hits, it ignores 18 points of hardness and pulls the target a number of feet toward the rig equal to the damage dealt; a pulled creature lands [[prone]]. A creature struck can halve the distance pulled and negate falling prone with a successful Reflex saving throw. If the target is a vehicle, its pilot can halve this distance with a successful [[Piloting]] check.
</div>
An aerial mining rig has two upper levels that are partially open to the elements and two lower levels that hold much of its ore-collecting and processing machinery, as well as the controls for its mining grav laser.
Aerial creatures are native denizens of the Elemental Plane of Air, gas giant planets, or similar landless environments, and have unique adaptations to help them survive there.
* ''CR:'' 1+
* ''Grafts:'' add the air subtype graft (fly speed should equal creature's fastest movement speed)
* ''Traits:''
** half of the damage dealt by its natural attacks becomes electricity damage
** if the creature is from the Elemental Plane of Air, it gains the extraplanar subtype when it isn't on that plane
On worlds where the atmosphere expands high above the physical boundaries of the surface, there exists a region of open air. Similarly, gas giants are made up of nothing more than a vast atmosphere, held in place by a starlike core. The most common rules sections to reference when using aerial terrain are [[Falling]], [[Gravity]], [[Suffocation and Drowning]], and [[Weather]]. The rules for flying with the [[Acrobatics]] skill are also critical for many creatures operating in an aerial environment.
!! Clouds
Most clouds are little more than condensed gas that obfuscates vision. Treat a cloud in an aerial environment using the same rules as //[[fog cloud]]//, except it's a nonmagical effect. Other types of cloud exist, such as corrosive or toxic clouds, which operate in the same manner as those types of [[atmospheres]].
!! Stealth And Detection In Aerial Terrain
How far a character can see in the air depends on the presence or absence of clouds. Creatures can usually see 5d8×100 feet if the sky is completely clear, with minimal clouds (or other aerial objects) blocking their views. Clouds generally provide enough concealment to hide within (though the hiding creature might have difficulty seeing out from its hiding place).
<div class="statblock">
* ''Tier'' 8
* Huge skyspy
* ''Operators'' 1–2; ''PP'' 7 (2/turn, max 15)
* ''Speed'' 20 ft., fly 80 ft. (average), fly 10 ft. (perfect, maximum elevation 5 ft.)
* ''Senses'' [[blindsense]] (vibration) 30 ft., [[darkvision]] 120 ft., [[low-light vision]]
!!! DEFENSE
* ''HP'' 74; ''SP'' 19; ''Hardness'' 4
* ''EAC'' 28; ''KAC'' 28
* ''Fort'' +9; ''Ref'' +10
* ''Immunities'' construct immunities
!!! OFFENSE
* ''Base Attack Bonus'' +9
* ''Melee'' plasma sword (upper limb—4d10+12 E&F; critical [[severe wound]]) or spiked shield (upper limb—5d6+12 B or P; critical [[bleed]] 2d6)
* ''Ranged'' laser rifle (frame—5d6+8 F; critical [[burn]] 2d6)
* ''Space'' 15 ft.; ''Reach'' 15 ft.
* ''Strength'' +4
!!! SYSTEMS
* ''Power Core'' mk 3 eternal core
* ''Lower Limbs'' hoverpad
* ''Upper Limbs'' tough arms (+0 melee, +0 ranged)
* ''Auxiliary'' cloaker, haste circuit, reconnaissance array
</div>
Aerosol spray is an opaque liquid stored at high pressure with compressed gas in a spray canister. As a standard action, you can depress the canister's trigger to spray the aerosol in a 5-foot burst, which fills a single square adjacent to your space. You can see any hidden or invisible laser beams in the aerosol-filled square, and you immediately become aware of the location of any [[invisible]] creature in that square. In addition, invisible creatures have only concealment (rather than total concealment) as long as they remain in an aerosol-filled square. The aerosol remains in its square for 1d4+1 rounds before dissipating. Each canister of aerosol spray contains enough aerosol for 10 uses.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|aerosol spray | 1 | 80 | L |
</div>
You study fighting styles thought lost to the Gap, often recorded only in the art of ancient civilizations or inferred from the shape of relic weapons and battle gear. You focus specifically ancient motions and techniques that rely on form and mobility rather than the harshness of attacks and resilience. You gain [[Improved Unarmed Strike]] as a bonus feat. You can deal lethal damage with your unarmed strikes, and the attack doesn't count as [[archaic]]. At 3rd level, you gain a unique [[weapon specialization]] with your unarmed strikes, allowing you to add 1-1/2 times your character level to your damage rolls for your unarmed strikes (instead of just adding your character level, as usual). If you can already add 1-1/2 your character level to your unarmed attack rolls (such as due to the vesk natural attack racial trait), you instead can add the [[block]], [[grapple]], and [[stun]] weapon special properties to your unarmed strikes.
This replaces the soldier's proficiency with heavy armor and heavy weapons.
<$list filter="[list[$:/StoryList]is[current]]">
Curses, diseases, drugs, and poisons can all have effects on a character that continue long past the character's first exposure. This deterioration in physical or mental health is often represented by what is called a "progression track." Diseases and poisons each have default progression tracks whose steps have specific rules consequences; drugs use the relevant poison track (for example, drugs that affect Wisdom use the Wisdom poison track). Some specific afflictions have their own unique progression tracks defined in their stat blocks. Curses generally do not use progression tracks—their effects continue until they're cured without progressing through stages.
Before an individual is subjected to an affliction, she is considered healthy in terms of the affliction's progression track, if any. When initially is targeted by an affliction, she must succeed at a saving throw to avoid its effects; if she fails, she is subject to the affliction. If the affliction has a progression track, she is no longer considered healthy with respect to that affliction and immediately gains the effects of the first step on its progression track. For diseases, this is the typically the latent state; at this step, the victim can pass the disease along to others if it's contagious, but generally suffers no ill effects from it herself. For poisons, the first step on the progression track is usually the weakened step. A truly deadly affliction might cause the victim to start further along a progression track than normal.
Diseases and poisons each have a listed frequency specifying how often a victim must attempt subsequent saving throws to prevent the affliction from progressing. Success could help the victim recover (see Curing an Affliction below); failure means that the victim moves one step further along its progression track, gaining the effects of the next step and keeping all previous effects. On a failed saving throw, if the victim was affected by a condition as a result of the affliction and that condition was removed (such as by remove condition), the victim regains any conditions from earlier steps along the affliction's progression track (as well as conditions from the current step). A character using a drug must attempt a saving throw each time she uses that drug. Victims typically fail voluntarily, progressing along the drug's progression track in exchange for benefits, and withdrawal from the drug acts as a disease.
Each progression track has an end state—a point at which the affliction has progressed as far as it can. Once an affliction has reached its end state, the victim keeps all current effects (but doesn't suffer further effects) and can no longer attempt saving throws to recover from the affliction (see below). By default, diseases, poisons, and drugs have an end state of dead, but some afflictions have less severe end states, while others might have no end state, allowing victims to continue attempting saves.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
!! Curing an Affliction
Diseases, drugs, and poisons can be cured if they are treated before the victim reaches the end state. In the case of a disease, the victim must fulfill the conditions in the disease's Cure entry (usually succeeding at one or more consecutive saving throws). Each time she does so, she moves one step back toward healthy; once she reaches healthy, she is cured. Poisons and drugs work differently—fulfilling the cure condition (or reaching the end of a poison's duration) removes a poison from the victim's system, but she remains at the same step on the track and recovers gradually. For every day of bed rest (or two nights of normal rest), a victim moves one step toward healthy. This rate of recovery is doubled by successful [[Medicine]] checks (see [[Long-Term Care]]), though tenacious poisons might require a longer recovery period.
Curses can be cured only by fulfilling the unique cure conditions listed in their individual stat blocks or through magic.
Usually, the spell //[[remove affliction]]// immediately cures a victim of an affliction (moving the victim of a disease, drug, or poison to a healthy state on its progression track). However, once a disease or poison has reached its end state, only the most powerful magic or technology (such as //[[miracle]]// or //[[wish]]//, or in the most extreme cases, //[[reincarnate]]// or a [[regeneration table]]) can remove its effects.
!! Understanding Afflictions
The individual lines of information in affliction stat blocks are described below. Those marked "Optional" appear only if relevant.
!!! Name
This lists the name of the affliction.
!!! Type
This shows the type of the affliction, such as a curse, disease, drug, or poison. Where applicable, this line also states in parentheses the means by which it is contracted, such as contact, ingestion, inhalation, or injury. Afflictions that have multiple methods of contraction indicate this here.
A //contact// affliction is delivered by any contact with bare skin, which generally requires an attack against EAC if the intended target is unwilling. A contact affliction can also be injected like an injury affliction. Contact afflictions often take 1 minute or longer to take effect.
An //ingested// affliction is delivered by tricking the intended target into eating or drinking it. Ingested afflictions often take 10 minutes or longer to take effect.
An //inhaled// affliction is delivered the moment a creature that breathes (and isn't wearing a space suit or suit of armor that filters out such toxins) enters an area containing such an affliction. Most inhaled afflictions fill a volume equal to a 10-foot cube per dose. A creature at risk can attempt to hold its breath (see [[Suffocation and Drowning]]) while inside such an area to avoid inhaling the affliction. There is a 50% chance each round a creature holding its breath doesn't need to attempt a saving throw against the affliction.
An //injury// affliction is delivered through damage to the target, usually via a slashing or piercing kinetic attack dosed with the affliction. These afflictions often take effect immediately.
!!! Save
This indicates the type of saving throw necessary to avoid contracting the affliction, as well as its DC. Unless otherwise noted, this is also the saving throw to avoid the affliction's effects once it is contracted.
!!! Addiction (Optional)
Typically only applicable to drugs, this line lists the saving throw type and DC to avoid [[addiction]].
!!! Track
This line indicates the progression track used once a character is affected by the affliction.
!!! Onset (Optional)
Some afflictions have a variable amount of time before they set in. Creatures that come into contact with an affliction with an onset time must attempt a saving throw immediately, and if they fail, they suffer the appropriate effect after the onset time has passed. The creature then must continue to attempt saving throws against the affliction's effects as normal.
!!! Frequency
This is how often the periodic saving throw must be attempted after the affliction has been contracted. If the affliction lists an amount of time after its frequency—such as 1/minute for 6 minutes—that means its effects last for only that amount of time, regardless of whether the affected creature ever succeeds at a saving throw. Such an affliction cannot be cured via successful saving throws; after its duration ends, the victim remains at her current step on its progression track until she receives the benefit of //[[remove affliction]]// or a similar effect.
!!! Effect (Optional)
This line lists the affliction's special effects, if any, beyond the effects of its appropriate progression track.
!!! Cure (Optional)
This indicates how the affliction is cured. Usually, this is number of consecutive, successful saving throws. Even if an affliction has a limited frequency, it might be cured earlier if the affected creatures succeeds at enough saving throws. Afflictions without a cure entry can be cured only through spells such as //[[remove affliction]]//.
</$list>
<$list filter="[<currentTiddler>is[missing]]">
<<tabs "[contains:tab[Afflictions]]" "Poisons" "Index Template">>
</$list>
<div class="statblock">
* <<levels>>
* ''School'' conjuration (teleportation)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' personal
* ''Duration'' instantaneous, and 1 round
</div>
You instantly teleport from your current location to any other spot within range, be that a place you visualize or simply by deciding a direction and distance. You can bring along objects as long as their weight doesn’t exceed your maximum load. You leave behind an insubstantial image of yourself in your previous space until the end of your next turn. This image’s features are too washed out to be mistaken for you, and it can’t be harmed (though it can be dispelled). While it lasts, you can perceive the image’s surroundings, flank nearby creatures, and target spells as if you still occupied its space.
Agathions are celestials, or good outsiders, native to Nirvana.
* ''Traits:''
** [[low-light vision]]
** +4 to saving throws against poison; [[immunity]] to electricity and petrification; [[resistance]] 5 to cold and sonic (CR 3+; increases to 10 at CR 7, 20 at CR 11, 30 at CR 15)
** healing channel (as per the [[healer]] mystic connection power)
** [[truespeech]], speak with animals (below)
* //Speak with Animals ([[Su]]):// An agathion can communicate with animals and use language-dependent effects on them.
Summoned agathions are called from Nirvana, and they take the appearance of anthropomorphic animals of all types, such as bears or lions.
* ''Type:'' outsider (agathion, extraplanar, good)
* ''Alignment:'' change to NG
* ''Traits:''
** [[low-light vision]]
** base speed increases to 30 ft.
** climb speed and swim speed of 30 ft.
** if CR 7 or greater, gains supernatural fly speed of 30 ft. (average)
** +4 to saving throws against poison
** [[immunity]] to electricity and petrification
** [[resistance]] to cold and sonic equal to creature's CR
** if base stat block has [[DR]], change to DR/evil
* ''Skills:'' add [[Survival]]
* ''Languages:'' Common and speak with animals (as per the [[xenodruid]] connection power)
* ''Attack:''
** change melee attack to claw (slashing damage)
** if CR 7, change melee attack to bite +18 (1d8+13 P) and add ''Multiattack'' bite +12 (1d8+13 P), 2 claws +12 (1d6+13 S)
** if CR 11, change melee attack to bite +24 (2d8+19 P) and add ''Multiattack'' bite +18 (2d8+19 P), 2 claws +18 (2d6+19 S)
Agathions, who have humanoid forms with animal aspects, form from the souls of mortals who reached an enlightened state and became infused with holy power. Most remain content to meditate and explore their home plane of Nirvana, ut many others visit the Material Plane to combat evil, specially evil that threatens the natural world.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
!! Enlightened Medicinals
As an extension of their supernatural healing abilities, agathions have developed specialized medicines infused with the holy properties of Nirvana. These enlightened medicinals follow the
rules for [[medicinals]], though they're hybrid items that use [[Life Science]] or [[Mysticism]] as the associated skills for crafting.
<<section 'Insulivate' 'h3'>>
<<section 'Revitilate' 'h3'>>
You begin each combat encounter with 3 Entropy Points.
This delicate fusion provides its weapon exceptional balance and lightweight lethality. As a full action, you can make a single attack that deals additional damage equal to your Dexterity bonus to all targets. This fusion can be applied only to small arms or weapons with the [[operative]] weapon property.
You can move, cast a spell, and move again before foes react.
''Prerequisites:'' Key ability score 15, Dex 15, [[Mobility]], caster level 4th.
''Benefit:'' As a full action, you can move up to your speed and cast a single spell with a casting time of one standard action or less at any point during your movement. If you have a supernatural ability that can be activated as a standard action or less, you can instead use that ability at any point during your movement.
''Normal:'' You can move only before or after casting a spell, not both.
The first time per combat that you take on the magic officer role, you can roll your first [[Mysticism]] starship combat check that round twice and use the better result.
The creature gains a +2 bonus to its [[Piloting]] checks.
You can dart around underwater like a fish.
''Prerequisites:'' Racial swim speed.
''Benefit:'' When you take a move action to swim your speed, the first two times you change your direction by 45 degrees during that movement, it doesn't cost an additional 5 feet of movement.
''Normal:'' Each time you change your direction by 45 degrees while swimming, it costs an additional 5 feet of movement.
You have developed a technique to conduct maneuvers on the battlefield at range with your [[solar flare]]. You can attempt combat maneuvers as a ranged attack instead of a melee attack, with a range of 30 feet. Any weapon special properties your solar flare has that would affect certain combat maneuvers apply as normal. While attuned or fully attuned, you gain a +2 insight bonus to combat maneuvers attempted at range using this stellar revelation. You must have a solar flare to select this stellar revelation.
This upgrade consists of replacing the hard corners of armor with more expensive flexible materials carefully angled and reinforced to increase mobility without sacrificing protective values. Agility enhancers reduce the armor check penalty of your armor, to a minimum of 0. Some agility enhancers apply only to [[Acrobatics]], while others apply to any skill affected by armor check penalties. The amount depends on the agility enhancer type, as listed below.
* ''Mk 1 (Level 1):'' Reduce the penalty by 1 for [[Acrobatics]].
* ''Mk 2 (Level 5):'' Reduce the penalty by 1 for all skills.
* ''Mk 3 (Level 9):'' Reduce the penalty by 2 for [[Acrobatics]].
* ''Mk 4 (Level 13):'' Reduce the penalty by 2 for all skills.
* ''Mk 5 (Level 17):'' Reduce the penalty by 3 for [[Acrobatics]].
This upgrade can be installed only in light or heavy armor.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|agility enhancer, mk 1 | 1 | 375 | 1 | light, heavy | L |
|agility enhancer, mk 2 | 5 | 3,000 | 1 | light, heavy | L |
|agility enhancer, mk 3 | 9 | 13,000 | 1 | light, heavy | L |
|agility enhancer, mk 4 | 13 | 46,000 | 1 | light, heavy | L |
|agility enhancer, mk 5 | 17 | 216,000 | 1 | light, heavy | L |
</div>
An agitator is a portable generator of microwave radiation that rapidly heats up targets to create internal bubbles of steam or makes targets burst into flames. The longer the weapon is focused, the more intense the agitation becomes, making it a favored by the defenders of bunkers, guard posts, and other emplacements. Ember agitators and blaze agitators rely on individual generators, taking the form of a bulky cylinder in the middle of the gun that hums ominously as the weapon fires, but miniaturization technology allows inferno agitators and solar flare agitators to include multiple smaller generators for increased effect.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|agitator, ember | 1 | 220 | 1d8 F | 60 ft. | [[burn]] 1d4 | 20 charges | 1 | 2 |[[boost]] 1d4 |
|agitator, blaze | 6 | 4,300 | 2d6 F | 80 ft. | [[burn]] 2d4 | 40 charges | 1 | 2 |[[boost]] 1d6 |
|agitator, inferno | 13 | 50,800 | 6d6 F | 80 ft. | [[burn]] 3d4 | 40 charges | 2 | 2 |[[boost]] 2d6 |
|agitator, solar flare | 19 | 580,000 | 12d6 F | 100 ft. | [[burn]] 4d4 | 40 charges | 2 | 2 |[[boost]] 5d6 |
</div>
<div class="statblock">
* ''CR'' 5; ''XP'' 1,600
* CN Tiny animal (swarm)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +11
!!! DEFENSE
* ''HP'' 65
* ''EAC'' 17; ''KAC'' 18
* ''Fort'' +6; ''Ref'' +6; ''Will'' +8
* ''Defensive Abilities'' [[swarm defenses]]; ''Immunities'' [[swarm immunities]]; ''Resistances'' cold 5; ''SR'' 16
* ''Weaknesses'' [[vulnerable]] to electricity
!!! OFFENSE
* ''Speed'' swim 40 ft.
* ''Melee'' [[swarm attack]] (1d4+5 P)
* ''Space'' 10 ft.; ''Reach'' 0 ft.
!!! STATISTICS
* ''Str'' +0; ''Dex'' +5; ''Con'' +2; ''Int'' +2; ''Wis'' +3; ''Cha'' +1
* ''Skills'' [[Acrobatics]] +16, [[Athletics]] +11 (+19 to swim)
* ''Languages'' Aglian, Common; [[telepathy]] 60 ft.
* ''Other Abilities'' dominant concepts, [[water breathing]]
!!! ECOLOGY
* ''Environment'' any water
* ''Organization'' solitary or intellection (6–12)
!!! SPECIAL ABILITIES
''Dominant Concepts ([[Ex]])'' Each aglian collective has three different dominant concepts drawn from its collective members; examples are described below. These concepts determine the aglian collective's personality, form its name, and affect its statistics. When other aglians are present, the collective can take a full action to change any of its dominant concepts, though no concept can repeat. This stat block represents a school with no concepts applied to it. At the GM's discretion, aglian collectives can have other dominant concepts with varying effects.
@@.special
* //Anger:// Melee attack damage increases by one die size.
* //Charity:// Alignment changes to CG.
* //Curiosity:// [[Culture]] and [[Life Science]] are master skills.
* //Fear:// +10-foot bonus to swim speed.
* //Hope:// Can reroll one d20 roll. This can be used only once per day, no matter how many times the collective changes its component concepts.
* //Love:// [[Diplomacy]] and [[Medicine]] are master skills.
* //Mistrust:// +1 bonus to KAC.
@@
</div>
Each of these tiny eel-like natives of the aquatic world of Entha has a limited individual consciousness focused around a single idea—usually a broad theoretical concept but sometimes a specific object or action like coral, bedrock, swim, or search. An aglian's coloration varies based on the content and complexity of their particular thought, from dull gray for those that concentrate on narrow concepts to rainbow hues for those that embody curiosity or truth. While individual aglians can function in perfunctory ways, they are usually found in schools, telepathically linking with each other like neurons in a brain to form a new consciousness. EJ Corp scientists have dismissed the species as nonsapient, but the large schools in which most aglians spend their time are indeed sapient. Each member contributes and receives each other's concept, building a collective yet individual personhood for each aglian in the school.
When aglians reproduce, two or more parents contribute genetic material, and the offspring, called an elver, has an equal chance to embody either the same concept as a parent or an entirely new thought resulting from the experiences of each. In this way, the aglian population of Entha has grown to embody extremely specific and refined concepts. Their recent interactions with EJ Corp employees, however limited and scattered, have already begun to produce elvers that embody concepts like wonder, dismissal, and greed.
Once per day when you successfully attack a foe with a weapon with the //agonizing// fusion, you can cast //[[inflict pain]]// on the target as a spell-like ability (using the weapon's item level as the caster level). This doesn't provoke an attack of opportunity. If the weapon with this fusion has an item level of 11 or higher, you can use this ability twice per day, and if it has an item level of 16 or higher, you can use this ability three times per day.
<div class="statblock">
* ''CR'' 12; ''XP'' 19,200
* N Huge construct (technological)
* ''Init'' +8; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]], sensor suite; ''Perception'' +27
!!! DEFENSE
* ''HP'' 200
* ''EAC'' 26; ''KAC'' 28
* ''Fort'' +12; ''Ref'' +12; ''Will'' +9
* ''Defensive Abilities'' [[fast healing]] 5, hardness 15; ''Immunities'' [[construct immunities]]
!!! OFFENSE
* ''Speed'' 60 ft.
* ''Ranged'' medium [[machine gun]] +26 (3d10+12 P) or hellhound-class [[flamethrower]] +26 (4d6+12 F; critical [[burn]] 4d6)
* ''Space'' 15 ft.; ''Reach'' 15 ft.
!!! STATISTICS
* ''Str'' +5; ''Dex'' +8; ''Con'' —; ''Int'' –2; ''Wis'' +4; ''Cha'' +2
* ''Skills'' [[Stealth]] +22
* ''Languages'' Common
* ''Other Abilities'' MODEL, [[unliving]]
* ''Gear'' hellhound-class [[flamethrower]] with 2 high-capacity petrol tanks, medium [[machine gun]] with 420 heavy rounds
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or unit (1 AHAV plus 10–12 soldiers)
!!! SPECIAL ABILITIES
''MODEL ([[Ex]])'' An AHAV is created with one of the Mission Dependent Loadouts, or MODELs, listed below. MODELs are intended to allow AHAVs to serve in a variety of roles. This list is not exhaustive; the GM is free to design other MODELs at her discretion.
@@.special
* //Advanced Maneuverability:// The AHAV has an extraordinary fly speed of 60 feet (perfect maneuverability) and the [[Spring Attack]] feat.
* //Autoloader:// When the AHAV makes a full attack with its medium machine gun, it can make up to three attacks instead of two attacks. It takes a –5 penalty to these attacks instead of a –4 penalty.
* //Camouflage Plating:// The AHAV gains a +20 enhancement bonus to [[Stealth]] checks.
* //Harrying Arms:// The AHAV has numerous pistols or other small arms mounted to its chassis. As a full action, the AHAV automatically succeeds at the harrying fire action against every enemy within 60 feet.
* //Ram:// The AHAV gains a slam attack with a +23 attack bonus that deals 6d4+17 bludgeoning damage. If the AHAV hits with this attack after a charge, the target is also knocked back 30 feet. If the target is blocked from moving the full distance, it takes an additional 1d6 bludgeoning damage per 10 feet it can't move.
@@
''Sensor Suite ([[Ex]])'' As a full action, an AHAV can gain one of the following benefits for 1 minute: [[blindsight]] (life), blindsight (vibration), [[sense through]] (vision), or a +10 enhancement bonus to [[Perception]] checks. It can change which benefit it receives as a full action. At the GM's discretion, an AHAV might have access to more options, such as blindsight (emotion) or blindsight (thought).
</div>
Military marvels of advanced weaponry and artificial personality programming, AHAVs are ruthless machines of war, bound by their programming to follow their objectives without pause. The acronym AHAV stands for "autonomous heavy assault vehicle," reflecting the constructs' ability to operate independently and make basic decisions on the battlefield. While the term originated with a specific and popular early model produced by Ironfire Industries on Absalom Station shortly after the Gap, the name quickly spread in colloquial use to refer to all robotic war machines of similar designs, and these days many corporations on many different worlds use the term to market their own proprietary models. AHAVs are built to appear intimidating: sturdy armor-plated tanks that float on hovertreads, armed with various heavy weapons and bristling with antennae. AHAVs have a full complement of sensors, capable of detecting heat, vibration, and sometimes other signatures, though they don't usually have enough processing power to activate every available sense at once.
AHAVs are expensive and difficult to construct, so relatively few of them are found in the service of small planetary militaries and mercenary groups. Only the richest of worlds (and collectors interested in ensuring the safety of their private collections) can afford to purchase and maintain even a single AHAV.
Unfortunately, since AHAVs' basic programming leaves little room for independent thought and nuance, many of them can be easily tricked by those who can figure out the literal outlines of their objectives and work around them. As such, AHAVs have dropped off in popularity over the past few decades, though the corporations invested in building them are continually working to improve on this limitation.
Before they are programmed, AHAVs are outfitted with Mission Dependent Loadouts (MODELs for short), which are special abilities and equipment that aid a robot in its particular mission. An AHAV focused on reconnaissance might have an advanced sensor suite or stealth capabilities, while one intended to go head to head with a superior enemy force might have augmented weaponry. A sufficiently astute observer can use the MODEL of an AHAV to puzzle out its objective.
AHAVs are built to last—a feature that sometimes means their objectives fail before they do. For instance, an AHAV programmed to guard a particular site will continue to do so even though its handlers have long since perished. While such a construct might seem to be a sad sight, it pales in comparison to those AHAVs whose objectives have become unachievable or internally inconsistent over time. Such a state introduces subtle errors into the AHAV's programming, which can result in behavior that would be called insane if exhibited by a flesh-and-blood creature. A technician who can uncover that robot's original purpose might be able to speak with the machine, convincing it of the error of its ways or the irrationality of its objective, but AHAVs have an inherently confrontational worldview and are difficult to reason with. AHAVs that successfully confront such a misalignment are most likely to shut down entirely, becoming nothing but inert metal and circuitry.
The GM might rule that you can help someone succeed at a skill check by performing the same action and attempting a skill check as part of a cooperative effort. To do so, you must attempt your skill check before the creature you want to help, and if you succeed at a DC 10 check, that creature gains a +2 bonus to his check, as long as he attempts the check before the end of his next turn. At the GM's discretion, only a limited number of creatures might be able to aid another. You cannot take 10 or take 20 on an aid another check, but you can use aid another to help a creature who is taking 10 or 20 on a check.
Despite being made of living wind, starship-sized elementals from the Elemental Plane of Air are surrounded by a mystical field of energy that keeps them from dissipating in a vacuum.
* ''Traits:''
** air subtype
** increase speed by 2
** reduce distance between turns by 1 (if already 0, the elemental instead gains a +2 bonus to [[Piloting]] checks)
** reduce [[Piloting]] bonus by 1;
** //Whirlwind Flyby ([[Ex]]):// When a starship-sized air elemental successfully performs the [[flyby]] stunt, in addition to it firing at a chosen quadrant of the enemy vessel at close range during the next gunnery phase, the enemy vessel takes a –2 penalty to AC and TL until the start of the next round and is turned to face the direction of the air elemental's choosing.
* ''Languages:'' Auran.
Beings of living wind, air elementals originate from the Elemental Plane of Air.
* ''Required Creature Type and Subtype:'' outsider (elemental)
* ''Traits:''
** [[air|air subtype graft]] subtype
** supernatural fly speed of 100 feet (perfect)
* ''Abilities''
** air mastery (see below)
** [[whirlwind]]
* ''Feats:'' [[Spring Attack]]
* ''Languages:'' Auran
* //Air Mastery ([[Ex]]):// Airborne creatures take a −1 penalty to attack and damage rolls against an air elemental.
Whimsical and unfocused, air mephits are among the least destructive of their kind.
* ''Traits:''
** add air subtype
** [[fast healing]] works only when the mephit is in a windy area
** fly speed changes to 60 ft. (Su, perfect)
** [[breath weapon]] deals 2d8 piercing damage
* ''Languages:'' Auran.
* //Insubstantial Form (//Su//):// As a standard action, the mephit can transform itself partially into air. While in this form, the mephit always benefits from its [[fast healing]] and gains a 20% miss chance against attacks and effects targeting it directly. In addition, the mephit takes only half damage from area effects. Returning to its normal form requires a move action. The mephit can remain in this form for a number of rounds per day equal to 3 × its CR, but these rounds need not be consecutive.
This subtype is usually applied to outsiders with a connection to the Plane of Air.
* ''Traits:''
** supernatural fly speed, usually with perfect maneuverability
** gains [[Acrobatics]] as a master or good skill.
Air wysps are flighty, cheerful, and at times forgetful. They enjoy playing pranks, telling jokes, and making puns.
* ''Required Creature Type and Subtype:'' outsider (elemental)
* ''Traits:''
** air subtype
** supernatural fly speed of 100 feet (perfect)
* ''Languages:'' Auran.
Airborne creatures spend a good part of their life aloft.
* ''Flying:'' Airborne creatures gain a fly speed at least as fast as their land speed, and often twice as fast.
* ''Senses:'' Keen eyesight is common among airborne creatures. You can choose to give them [[blindsense]] or [[darkvision]] with a longer-than-usual range.
* ''Skills:'' [[Acrobatics]], [[Perception]]
This organ takes in atmospheric gases, concentrates them, and expels them behind you as a kind of jet, granting a 10-foot enhancement bonus to your land and swim speeds. Once per day as a swift action, you can double your land or swim speed for one round. This augmentation doesn’t function in a vacuum.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|airjet | 6 | 4,000 | lungs |
</div>
<div class="statblock">
* ''Level'' 12; ''Price'' 125,000
* Gargantuan land and water vehicle (20 ft. wide, 30 ft. long, 15 ft. high)
* ''Speed'' 30 ft., full 500 ft., 55 mph (hover)
* ''EAC'' 26; ''KAC'' 28; ''Cover'' improved cover
* ''HP'' 200 (100); ''Hardness'' 16
* ''Attack (Collision)'' 13d10 B (DC 15)
* ''Attack'' SAM launcher (2d6 × 10 B & F)
* ''Modifiers'' –2 [[Piloting]], –3 attack (–6 at full speed)
* ''Systems'' autopilot ([[Piloting]] +22), enhanced sensors ([[darkvision]] 5 miles), planetary comm unit
* ''Complement'' 2
!!! SPECIAL ABILITIES
''SAM Launcher ([[Ex]])'' This heavy weapon launches a guided missile that has a range increment of 2,000 feet. The weapon can target only airborne vehicles or starships. On a successful attack, the pilot of the defending vehicle can attempt a [[Piloting]] check (DC = the attack roll's result) to halve the damage. An airspace defender has a capacity of five missiles.
</div>
This tank-like vehicle deters incursions into the local airspace with its deadly antiaircraft missiles.
You're linked to the collective knowledge of every sentient species that ever lived that's held in the Akashic Record, an Astral library of perfect psychic records of every moment in history. You might be an ancient lorekeeper, an inquisitive student of the occult, an intuitive consulting detective, or a secret-hoarding spy.
* ''Associated Deities:'' Eloritu, Nyarlathotep, Pharasma, Talavet, Triune, Weydan, Yaraesa
* ''Associated Skills:'' [[Culture]] and [[Mysticism]]
* ''Spells:'' 1st—//[[identify]]//, 2nd—//[[augury]]//, 3rd—//[[tongues]]//, 4th—//[[divination|Divination (spell)]]//, 5th—//[[contact other plane]]//, 6th—//[[vision]]//
!! Akashic Knowledge (1st)
You gain the [[channel skill]] ability at 1st level (instead of 2nd level). Each day when you recover your spell slots, you can tap into the Akashic Record, enabling you to choose one [[Profession]] skill and add that to your list of associated skills for the channel skill class feature.
!! Access Akashic Record (3rd)
You can access the Akashic Record to augment your skills. You can spend 1 Resolve Point to attempt a skill check as if you had ranks in that skill equal to your mystic level.
!! Peer into the Future (6th)
Once per day, you can spend 10 minutes in uninterrupted meditation to receive visions of possible futures. At any point over the next 24 hours, you can declare that you are using the benefit of this ability before rolling one initiative check, saving throw, or skill check. You gain a +4 insight bonus to that check. At 11th level, you can use this ability twice per day, though you can't use it again until after you've used your first bonus.
!! Mind Probe
You can use //[[mind probe]]// as a spell-like ability a number of times per day equal to your mystic level, lasting for 1 round. A creature that successfully saves against your //mind probe// is immune to further uses of this ability for 24 hours.
!! Telepathic Memories (12th)
You can share memories at will with allies linked by your [[telepathic bond]] class feature. As a full action, you or a linked ally can send a memory of up to 1 minute to as many others in the bond as they choose. Sending a relevant memory counts as a successful aid another attempt for a skill check, even if you wouldn't otherwise be able to use aid another (to a limit of one such memory per skill check).
!! Memory Palace (15th)
You assemble an extradimensional library to house mental constructs representing your accumulated knowledge. This memory palace has a single shimmering entrance. You can access your memory palace once per day; when you do, the entrance appears within close range. If any creatures or objects that were not part of the memory palace when it was created remain inside it, the entrance remains where it first appeared. Only those you designate can enter the memory palace, and the entrance closes and becomes invisible behind you when you enter. Anyone inside can open the entrance and exit the memory palace at will. The only way to enter and exit the memory palace is via the entrance; even //[[plane shift]]// and similar magic do not access it.
You can create any floor plan you desire for your memory palace, up to a number of 10-foot cubes equal to your mystic level. Inside, the atmosphere is clean, fresh, and warm; outside conditions don't affect the memory palace, nor do conditions inside it pass beyond. There is no furniture other than bookcases, computers, and a few desks and sofas. A number of //[[unseen servants]]// equal to half your mystic level serve as librarians. The library keeps the same layout each time you access it, though you can alter its appearance each time you gain a level or by spending 15 minutes concentrating—you don't need to be inside it to alter it.
When you gain this ability, choose one skill that can be used with the [[recall knowledge]] task. Consulting your memory palace gives anyone who studies within—including you—a +4 enhancement bonus to skill checks to recall knowledge of that type, and creatures inside the memory palace can attempt checks of that type untrained. At 16th level, and at each level thereafter, choose another skill that can be used with the recall knowledge task to which your memory palace's skill bonus applies.
!! Glean Spell (18th)
Once per day, you can delve into the Akashic Record to cast a spell from either the mystic or technomancer spell list as if it were on your list of spells known. The spell consumes a spell slot 1 level higher than the level of the spell.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 round
* ''Range'' personal
* ''Duration'' 2 minutes (see text)
</div>
You do a cosmic search of the Akashic Record for information about a topic. Your tier 0 or better computer (such as a [[comm unit]]) instantly compiles snippets and selections from various media relevant to the subject. The information remains for 2 minutes, during which you explore it. Once you're finished, you can attempt one skill check to [[recall knowledge]] on the topic with a +4 divine bonus, and you can do so untrained if the DC is 20 or lower. On a failed skill check, the GM can select some small insight into the topic that you retain. All the information you downloaded from this spell then disappears back to the Akashic Record. Using this spell doesn't prevent you from doing further research using a downloaded data set or library chip, but perusing this magical download can't be done concurrently with such study.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 minute
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Area'' 20-ft.-radius emanation
* ''Duration'' 1 hour (D)
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You sift through the Akashic Record to view a shadow of the past day’s events that happened in the spell’s area. You overlay these events at the location that they occurred, staging a blurred reenactment of events that took place over the last 24 hours. This reenactment presents only a shadow of the original events, with the creatures appearing as shadows that make indecipherable noises. You can make out the general actions, positions, and sizes of creatures, identify generic noises, and determine the mood and tone of conversation. There isn’t enough detail to identify creatures in this reenactment by anything more specific than creature type, nor to determine anything spoken. You have the ability to fast forward, rewind, move in slow motion, and pause the events to get a better view, at any speed desired.
<div class="statblock">
* <<levels>>
* ''School'' necromancy
* ''Casting Time'' 1 hour
* ''Range'' personal
* ''Duration'' 24 hours
</div>
You create perfect documentation of your physical body in the Akashic Record at the time the spell is cast, allowing you to later recall this record and reconstruct your body as it was when you cast this spell. The record of your body includes your current Stamina Points, Hit Points, augmentations, physical ability scores, and any enduring negative physical states (including ability damage or drain to physical ability scores, disease, negative levels, poison, and so on). Any effect that was affecting you when you cast this spell to store your record continues with its normal duration, so that effect might expire between the time you store your record and when you later recall it.
To recall your record, either you must die due to events other than old age or, if you are at 0 Hit Points, you can instead allow your body to perish by spending 3 Resolve Points. If either of these things occurs, you can claim your record as your new physical body at the start of your next turn. Your corpse disappears. Then, you instantly reappear, standing in your recorded body in the corpse's space and wearing your gear. If you cannot appear in that space, you appear as close to it as you can. You retain your mind as it was at the time of your body's death, so you regain no expended spells, Resolve Points, or uses of special abilities. Any mental effects affecting you or mental ability damage present at the time of your death persist in your new body.
Casting this spell again replaces any previous record of yourself with a new one—you can store only one copy of yourself in the Akashic Record.
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' divination
* ''Casting Time'' 1 round
* ''Range'' personal
* ''Duration'' 1 minute/level
</div>
You communicate with the Akashic Record of one of your classmates or former instructors, asking them to assist you in a task. When you cast this spell, select two skills; if you cast //akashic tutor// more than once a day, you must select different skills each time. The tutor can provide you with aid another benefits for the two skills you have selected, and always succeeds at the check to aid you. Alternatively, you can instead choose to let the akashic tutor instruct you on how the task should be performed, substituting the tutor's skill modifier for your own.
* ''1st:'' When you cast //akashic tutor// as a 1st-level spell, your akashic tutor has a total skill modifier equal to your level + 2.
* ''2nd:'' When you cast //akashic tutor// as a 2nd-level spell, your akashic tutor has a total skill modifier equal to your level + 4.
* ''3rd:'' When you cast //akashic tutor// as a 3rd-level spell, your akashic tutor has a total skill modifier equal to your level + 6.
<div class="statblock">
* ''CR'' 1; ''XP'' 400
* N Medium aberration
* ''Init'' +6; ''Senses'' [[blindsense]] (life) 10 ft., [[blindsense]] (scent) 60 ft., [[darkvision]] 120 ft.; ''Perception'' +5
!!! DEFENSE
* ''HP'' 18
* ''EAC'' 12; ''KAC'' 13
* ''Fort'' +3; ''Ref'' +3; ''Will'' +3
* ''Immunities'' cold, disease, poison, starvation; ''Resistances'' fire 5
* ''Weaknesses'' susceptible to salt water
!!! OFFENSE
* ''Speed'' 40 ft., climb 20 ft.
* ''Melee'' bite +8 (1d6+2 P plus void bite)
!!! STATISTICS
* ''Str'' +1; ''Dex'' +2; ''Con'' +4; ''Int'' –4; ''Wis'' +1; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +5, [[Athletics]] +5 (+13 to climb), [[Stealth]] +10
* ''Other Abilities'' deaf, hibernation, [[no breath]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, pack (3–11), or colony (12–30)
!!! SPECIAL ABILITIES
''Deaf ([[Ex]])'' Akatas cannot attempt [[Perception]] checks to listen and are immune to effects that rely on hearing to function.
''Hibernation ([[Ex]])'' Akatas can enter a state of hibernation for an indefinite period of time when food is scarce. After 3 or more days without eating, an akata can secrete a fibrous material that hardens into a dense cocoon of the starmetal called [[noqual]]. The cocoon has hardness 30 and 30 Hit Points, and it is immune to bludgeoning and fire damage. As long as the cocoon remains intact, the akata within remains unharmed. The akata remains in a state of hibernation until it is exposed to extreme heat or senses a living creature with its [[blindsense]], at which point it claws itself free of its cocoon in 1d4 minutes, leaving the fragments of its cocoon behind.
''Susceptible to Salt Water ([[Ex]])'' A splash of salt water deals 1d6 damage to an akata, and full immersion in salt water deals 4d6 damage per round.
''Void Bite ([[Ex]])'' Akatas hold hundreds of microscopic larval young within their mouths, spreading their parasitic offspring to hosts through their bite. Only humanoids make suitable hosts for akata young—all other creature types are immune to this parasitic infection. This affliction is known as [[void death]].
</div>
Terrifying predators that dwell in the vast void of space, akatas make their homes on lifeless asteroids, comets, and dying planets, hibernating in cocoons composed of the starmetal [[noqual]] for countless centuries. An akata looks similar in shape to a lion, but with hairless, rubbery blue skin and a mane of thick, lashing tentacles. Its face is little more than two eyes glowing with ever-changing light and a fanged maw. Two long tentacular tails extend from its muscular hindquarters. A typical akata stands 3-1/2 feet tall and weighs 400 pounds.
Akatas lack auditory organs, lungs, and vocal cords, and they can't hear or vocalize in any way. Instead, they communicate with each other through sight and scent. Akatas can change the color of their eyes to over a thousand shades, which they use in conjunction with complex tail movements to communicate visually. Scent glands located just behind the jawbone on akatas' necks produce a wide variety of smells that other akatas can "taste" with their tongues.
Akatas live in colonies of up to 30 individuals. Massive akatas known as akata alphas rule the largest of these colonies. Most colonies inhabit small asteroids or meteors hurtling through the depths of space. Akatas can hibernate for centuries, protecting themselves in cocoons made from a combination of resin from the creatures' pores and noqual. When a meteorite carrying an akata colony crashes onto a planet or another astronomical object that can support life, the akatas awake from their cocoons. Akatas usually consume the remains of their cocoons upon awakening, but 1 bulk of noqual worth 500 credits can be harvested from the remnants of a single akata cocoon. Once awakened, akatas can drastically depopulate a planet as they seek out suitable hosts for their young.
<<section 'Void Death' >>
Rumor says the first //alabaster helix// originated on a hidden world somewhere in the Vast. This //aeon stone// must adjust to your physiology by orbiting you for 24 hours. If the stone stops orbiting you for more than 1 minute, it must readjust to you. The stone can orbit you while you're [[prone]] or [[unconscious]], but it stops orbiting you if you die. While the //alabaster helix// orbits and remains adjusted to you, you regain 1 Hit Point per hour. You can have only one //alabaster helix// adjusted to your physiology at a time.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//alabaster helix// | 11 | 30,000 | — |
</div>
Your [[nanite sheath]] increases your land speed by 10 feet. This increases to 15 feet at 14th level and 20 feet at 18th level. Once per day at the beginning of your turn, you can use one [[nanite surge]] to gain the benefits of //[[haste]]// until the beginning of your next turn.
One of simplest countermeasures, this program sends an alert to a specific individual or station if someone attempts to breach the system. If the computer has a control module connected to an actual alarm, this countermeasure can trigger that alarm. If the computer controls a robot, trap, or weapon, an alarm can also activate them. The alarm countermeasure costs 10 credits.
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* N Medium fey
* ''Init'' +2; ''Senses'' [[low-light vision]]; [[Perception]] +8 (or +13)
!!! DEFENSE
* ''HP'' 33
* ''EAC'' 15; ''KAC'' 15
* ''Fort'' +4; ''Ref'' +4; ''Will'' +6
* ''Defensive Abilities'' [[void adaptation]]; DR 5/[[cold iron]]; ''Immunities'' cold, laser weapons
!!! OFFENSE
* ''Speed'' 40 ft., fly 40 ft. ([[Su]], perfect)
* ''Melee'' tactical [[dueling sword]] +6 (1d6+1 S; critical [[stagger]])
* ''Ranged'' bow +8 (1d6+1 P; critical [[stagger]])
* ''Offensive Abilities'' cold radiance, reflected moonbeam
* ''Spell-Like Abilities'' (CL 3rd)
** 3/day—//[[reflecting armor]]// (DC 14)
** At will—//[[dancing lights]]//, //[[fatigue]]// (DC 13)
!!! STATISTICS
* ''Str'' +0; ''Dex'' +2; ''Con'' +0; ''Int'' +1; ''Wis'' +1; ''Cha'' +4
* ''Skills'' [[Acrobatics]] +8 (+16 to fly), [[Bluff]] +13, [[Physical Science]] +13, [[Stealth]] +8 (or +13)
* ''Languages'' Common
* ''Other Abilities'' limited spaceflight, lunar aspect
* ''Gear'' bow with 20 arrows, tactical [[dueling sword]]
!!! ECOLOGY
* ''Environment'' any lunar
* ''Organization'' solitary, pair, or coterie (3–8)
!!! SPECIAL ABILITIES
''Cold Radiance ([[Su]])'' Lucandrians can cause any weapon they wield to deal half its damage as cold damage, which makes the weapon neither [[archaic]] nor [[nonlethal]]. If the weapon already deals two damage types, this effect replaces one with cold. In addition, lucandrians can grant weapons they wield the [[stagger]] critical hit effect. If the weapon has any other critical hit effects, the lucandrian chooses only one to apply on a critical hit.
''Limited Spaceflight ([[Su]])'' A lucandrian can fly between a moon or similar satellite and the planet it orbits, or from one satellite to another, arriving in 1d3 days. The fey always arrives at its intended destination.
''Lunar Aspect ([[Su]])'' In the light of a waxing moon or on the lighted surface of a moon, an albedo lucandrian has a +5 racial bonus to [[Perception]]. In the light of a waning moon or on the dark side of a moon, the fey has a +5 racial bonus to [[Stealth]]. If on a planet experiencing a solar eclipse, an albedo lucandrian has both bonuses.
''Reflected Moonbeam ([[Su]])'' When an albedo lucandrian dismisses its //[[reflecting armor]]//, a creature that succeeds at the saving throw is also [[dazzled]] for 1 round, and a creature that fails the saving throw is [[blinded]] for 1 round instead of dazzled. If the target fails the saving throw by 5 or more, the creature is also [[confused]] for 2 rounds.
</div>
The alert redirector consists of a metallic transmitter the size of a coin and a battery-powered receiver normally kept somewhere discreet on your body, such as in a pocket or on an arm strap under your clothing. As a standard action, you can attach the transmitter to a technological item that provides an alert or alarm when used, such as a [[radiation badge]]. Once the transmitter is attached, the item it is attached to doesn't produce its usual alert or alarm; instead, the alert redirector's receiver vibrates, warms slightly, or otherwise inaudibly alerts you as long as it is within 500 feet of the activated transmitter. Others relying on the item might consider an area safe, for example, while you know otherwise. Detecting a transmitter attached to an item normally requires a successful DC 20 [[Perception]] check, but the DC might be lower or higher based on the size of the item to which the transmitter is attached.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|alert redirector | 3 | 1,450 | — | 20 | 1/hour |
</div>
<div class="statblock">
* <<levels>>
* ''School'' conjuration
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' 20-ft.-radius burst
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Fortitude negates
* ''Spell Resistance'' no
</div>
You conjure a toxic algae bloom composed of particles that are sufficiently tiny to bypass standard environmental protections. Creatures that breathe (whether water or air) that start their turn in or enter the area must attempt a Fortitude save or become [[sickened]] for 1d4+1 rounds.
If the entire area of this spell is underwater, its duration increases to 1 minute per level.
The algal shielding system can be installed only in a [[biomechanical starship]]. The hull of a vessel with algal shielding has a layer made of water-filled, valved chambers that circulate blue-green algae through the ship, interfacing with the life-support system and most living parts of the ship. This supplemental circulatory system has two functions. First, the algae act as a radiation buffer. When a biomechanical starship with algal shielding takes damage from a weapon with the [[irradiate|Irradiate (starship weapon property)]] special property, the algal shielding grants a +2 circumstance bonus to saving throws against radiation and other poisons introduced to the ship's internal atmosphere. This system also functions as one [[hydroponic garden]]. If a critical damage effect causes a vessel's life-support system to become malfunctioning or wrecked, the algal shielding provides no benefit until the life-support system's condition is improved to [[glitching]] or normal.
<div class= "table-wrapper">
|System | PCU | Cost (in BP) |h
|algal shielding | 0 | 5 + (2 × size category) |
</div>
<h3>First Letter: <<selector>></h3>
<dl>
<$list filter="[has[aliases]prefix{Aliases!!selection}sort[title]]" >
<dt><$link><<currentTiddler>></$link>
<$button>
<$action-deletefield aliases/>
de-alias
</$button>
</dt>
<$list filter="[enlist{!!aliases}]">
<dd><<currentTiddler>> (<$list filter="[<currentTiddler>backlinks[]count[]]" template="plain" />)</dd>
</$list>
</$list>
</dl>
<<list-links '[all[current]listed[source]]' class:index>>
Your vast experience makes identifying new creatures easier for you. Double your [[operative's edge]] bonus to your skill checks when identifying a creature and its abilities. If you successfully identify a creature, you gain a +2 enhancement bonus to your skill check when you make a [[trick attack]] against that creature.
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
By gathering natural ingredients, you can create life-saving medicines.
''Prerequisites:'' [[Life Science]] 5 ranks, [[Survival]] 5 ranks.
''Benefit:'' Once per day, you can take 10 minutes and spend 1 Resolve Point to gather local flora and fauna, processing them to create a short-lived [[medicinal]]. The GM has discretion over whether enough such plants and animals are nearby to allow you to use this ability, though most wilderness settings not specifically described as barren typically have sufficient organisms to create such medicinals. Your creation is a tier 1 medicinal of any type you can create with [[Life Science]], and it retains its potency for a number of minutes equal to 10 × your ranks in [[Survival]].
For every 5 ranks in both Life Science and Survival you have beyond 5, you can either increase the tier of one medicinal you create with this feat (to a maximum of 4), or you can create one additional tier 1 medicinal or the same type. For example, with 15 ranks each in Life Science and Survival, you could create a tier 3 medicinal, a tier 2 and tier 1 medicinal, or three tier 1 medicinals.
The creature's mere presence can have deleterious effects for those nearby. It can activate this ability as part of the action of making an attack or as a move action, but it can activate it only once per round. It usually has a range of 30 feet. This [[aura]] functions as [[frightful presence]], but instead of imposing the [[shaken]] condition on creatures that fail their Will saves, it imposes the listed condition. The duration is 5d6 rounds unless the ability says otherwise. Once an opponent has been exposed to a creature's alien presence (whether or not the opponent succeeds at its saving throw), it cannot be affected by the same creature's alien presence for 24 hours. This is an emotion, fear, mind-affecting, and sense-dependent effect.
//Format:// ''Aura'' alien presence (240 ft., DC 25, [[sickened]] 2d4 rounds).
<h3>First Letter: <<selector>></h3>
<div class="tc-table-of-contents">
<$macrocall $name="toc-selective-expandable" tag="Races" sort="] -[!prefix{Alien Races!!selection}tag[Races]] +[sort[title]" />
</div>
This upgrade bolsters your armor against threats from beyond the Material Plane. Against effects created by outsiders, the armor grants you [[DR]] 3/— as well as [[resistance]] 3 against acid, cold, electricity, fire, and sonic damage. If the outsider has any alignment subtypes, this protection might increase. If at least one of the outsider's alignment subtypes is the opposite of your alignment (such as a demon with the evil subtype attacking a good-aligned wearer), increase the damage reduction and energy resistance values by 2 each. If the outsider has two alignment subtypes that are opposite of both components of your alignment, you also ignore the first 5 points of the outsider's resistances and damage reduction for 1 round after that outsider deals damage to you.
<div class= "table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|//aligned buffer// | 7 | 6,450 | 1 | any | L |
</div>
<div class="statblock">
* ''Tier'' 13
* N Medium starship outsider (aeon)
* ''Speed'' 8; ''Maneuverability'' good (turn 1)
* ''AC'' 27; ''TL'' 24
* ''HP'' 340; ''DT'' —; ''CT'' 68
* ''Shields'' 305 (forward 80, port 75, starboard 75, aft 75)
* ''Attack (Forward)'' meteor (5d6; 10 hexes), molten fist (2d4×10; 10 hexes)
* ''Attack (Turret)'' meteor (5d6; 10 hexes), meteor (5d6; 10 hexes)
* ''Other Abilities'' gravitational adjustment, [[improved shields]], living starship, [[void adaptation]]
!!! CREW ACTIONS
* ''Engineer (1 action)'' [[Engineering]] +23 (13 ranks)
* ''Gunner (4 actions)'' gunnery +19 (13th level)
* ''Pilot (1 action)'' [[Piloting]] +29 (13 ranks)
* ''Science Officer (1 action)'' [[Computers]] +23 (13 ranks)
!!! ECOLOGY
* ''Environment'' any vacuum
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Gravitational Adjustment ([[Ex]])'' Every 1d4 rounds, just before or after it moves during the helm phase, an alinoisos can push or pull a starship to an empty hex either further away or closer.
''Living Starship ([[Ex]])'' An alinoisos is a spacefaring aeon so immense that it functions as a starship (and thus engages only in starship combat). It has no crew, but it can still take engineer, gunner, pilot, and science officer actions using the bonuses, level, and ranks listed above. Modifiers for its size, speed, and maneuverability are already factored into its statistics. Use the following table to determine the effects when an alinoisos takes critical damage.
<div class="table-wrapper">
| d% | System |Effect |h
| 1–30 | weapons array |@@.constrained Randomly determine one arc containing weapons; condition applies to all gunner actions using weapons in that arc.@@ |
| 31–60 | propulsion |@@.constrained Condition applies to all pilot actions.@@ |
| 61–90 | heart |@@.constrained Condition applies to all engineer actions, except when patching or repairing the heart.@@ |
| 91–100 | brain† |@@.constrained During the next round, each of the alinoisos's attempted actions has a 25% chance of failure.@@ |
|† An alinoisos's brain doesn't gain critical damage conditions. |<|<|
</div>
</div>
An alinoisos is a nebulous aeon tasked with maintaining the balance between light and gravity, and it attempts to neutralize any imbalances it perceives by any means necessary and with no concern for ethics or morality.
An alinoisos travels the multiverse in search of imbalance, and might focus on such things as a megastructure that saps the energy from a star it encompasses, an advanced civilization that has discovered technomagical means of manipulating gravity, or even starships whose gravity-bending weapons happen to catch the aeon's attention. The outsider then neutralizes these perceived threats, whether through destruction or its ability to manipulate gravity. Because alinoisoses share similar concerns with solarians, the rare alinoisos is sometimes revered as a near-mythical mascot of sorts by remote solarian enclaves, which imprint its likeness onto their armor, banners, and architecture.
As a move action, you can adjust the payload of a weapon you wield that deals acid damage, briefly converting it into an alkaline and equally caustic substance. Until the end of your turn, your attacks with the weapon treat the acid [[resistance]] of targets as 5 lower (minimum 0) for the purposes of resisting the weapon's acid damage. At 15th level, the alkaline attacks instead treat the acid resistance of targets as 10 lower, and such attacks deal their minimum acid damage to targets immune to acid rather than dealing no damage.
Alkainans are badger-like humanoids with metallic fur who have recently taken up residence on the arboreal planet of Volunisp in Near Space, somewhat near the Veskarium. Alkainan mythology speaks of their home world, a realm of naturally occurring metallic spires somewhere in the Vast, and how they fled a “great evil” that none can specify.
Current alkainan society consists of three castes: the byggja, custodians of the Volunisp settlements; the leita, who take to the stars to meet and trade with other species; and the matriarchs, female alkainan leaders and ministers of marriage and other spiritual matters. While most matriarchs remain on Volunisp, a few travel with leita on their chrome-plated starships.
Part of an alkainan’s physiology depends on the types of metals consumed by their ancestors on their home world, granting unusual coloring to their fur and unique defenses.
!! Species Traits
* ''Ability Adjustments:'' +2 Str, +2 Con, –2 Wis
* ''Hit Points:'' 4
* ''Size and Type:'' Alkainans are Medium humanoids with the alkainan subtype.
* ''Low-Light Vision:'' Alkainans have [[low-light vision]].
* ''Metallic Bloodline:'' Each alkainan’s ancestors survived on a type of metal, granting their descendants a certain ability as follows.
** //Ferrous:// When wearing armor, the alkainan gains a +1 species bonus to KAC.
** //Nonferrous:// The alkainan gains a +2 species bonus to Reflex saving throws.
** //Skymetal:// The alkainan’s unarmed strikes count as magic. At 7th level, the alkainan’s unarmed strikes also count as adamantine.
* ''Natural Weapons:'' Alkainans can attack with a special unarmed strike that deals lethal slashing damage, doesn’t count as archaic, and threatens squares. Alkainans gain a special version of the [[Weapon Specialization]] feat with this unarmed strike at 3rd level, allowing them to add 1-1/2 × their character level to their damage rolls for this unarmed strike (instead of just adding their character level, as usual).
<h3>First Letter: <<selector>></h3>
<<list-links '[prefix{All Feats!!selection}tag[Feats]]' class:index >>
Many hands make light work.
''Prerequisites:'' Four or more arms.
''Benefit:'' When performing labor, perhaps requiring a Strength check or an [[Athletics]] check, such as digging a hole, moving cargo, or hauling in a rope, you can complete the task in half the usual time. Tasks requiring other checks aren't included.
Exerting your will upon the universe, you generate an aura that brings your foes to their knees (or similar joints). When you're fully graviton-attuned, as a move action, you can generate a 20-foot-radius aura of submission. An enemy that ends its turn within the aura must attempt a Fortitude save. On a failure, that creature gains the [[overburdened]] condition until the end of its next turn. At 17th level, a creature that fails the save instead gains the [[pinned]] condition until the end of its next turn. This aura lasts for 1 round plus 1 round for every 4 solarian levels you have, or until you become photon-attuned.
As a standard action, you can expend an unused spell slot to erode the internal security of a computer system you can touch. You reduce the DC to [[hack]] the computer by an amount equal to the level of the spell expended for the duration of a single attempt to hack the computer. If you have used all-access enchantment on a computer and fail a [[Computers]] check to access it, you can spend 1 Resolve Point as a reaction to avoid activating a single countermeasure of your choice.
With a press of a button, this stylish accessory transforms into a variety of useful items. All-purpose accessories come in multiple designs, including cufflinks, tie pins, barrettes, and jewelry. When you activate your all-purpose accessory as a move action, it instantly reconfigures into your choice of the following items: a grappler, a tool kit that grants a +4 bonus to [[Engineering]] checks made to disable locks and mechanical traps, or a survival knife. Reconfiguring your accessory to its original form is a more complicated process that takes 1 minute. Each reconfigured item takes the normal number of hands to use and draws any usage from the all-purpose accessory's own battery.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|all-purpose accessory | 3 | 1,500 | L | 20 | 1/reconfiguration |
</div>
Your nanites' sensors are especially acute. You gain [[blindsight]] (vibration) with a range of 5 feet. This blindsight also extends to any area in or adjacent to your [[nanite cloud]].
As a reaction, after you touch a target, strike a target with a weapon formed with your [[gear array]], or are hit by an adjacent creature, you can use a [[nanite surge]] to adhere a tiny mass of nanites to that creature or object; a creature can attempt a Reflex save to negate this effect. These nanites resonate with the rest of your nanite array, allowing you to sense the target as though you had [[blindsight]] (vibration) with a range of 120 feet. In addition, you can [[track|Follow Tracks]] the target with a base DC of 10 regardless of the surface conditions, and you can use [[Perception]] in place of [[Survival]] to track the target. The tracking nanites remain active for a number of days equal to your Constitution modifier.
You must have the [[sensory nanites]] knack to select this knack.
You're adept at piloting terrestrial vehicles. You gain a +2 circumstance bonus to skill checks to use tricks during a vehicle chase. Once per vehicle chase while you're piloting a vehicle, you can perform the [[double maneuver]] action, taking a –2 penalty to each skill check rather than a –4 penalty (or no penalty if your vehicle's full speed is at least 50 feet faster than the fastest enemy vehicle's full speed). You must have the [[uncanny pilot]] exploit to learn this exploit.
<div class="statblock" >
* ''Level'' 6; ''Price'' 8,370
* Huge land vehicle (10 ft. wide, 20 ft. long, 7 ft. high)
* ''Speed'' 10 ft., full 450 ft., 50 mph
* ''EAC'' 13; ''KAC'' 16; ''Cover'' total cover
* ''HP'' 90 (45); ''Hardness'' 8
* ''Attack (Collision)'' 7d8 B (DC 12)
* ''Modifiers'' –4 Piloting, –3 attack (–6 at full speed)
* ''Systems'' autopilot (Piloting +13), planetary [[comm unit]]
* ''Passengers'' 7
</div>
Designed for off-road travel, these rugged vehicles withstand rough terrain, weather, and abuse like no other.
* ''Adjustments:'' Increase price by 5%, decrease speed by 5 feet, decrease full speed by 25 feet, decrease attack modifiers by 1. When moving through difficult terrain, this vehicle treats every other space of difficult terrain as a space of normal terrain.
* ''Special:'' The vehicle must have a land speed.
A black iron choker, an //allegiance collar// contains technomagical circuitry that adapts to someone who willingly wears it for 24 hours. It grants such a wearer the benefits and weaknesses of the fire subtype and the [[solar adaptation]] universal creature rule. The collar can be removed only with a special key or a successful DC 32 [[Engineering]] check.
In addition, this collar contains a self-destruct feature that can be triggered in several ways: via a specific encrypted hybrid electronic signal, if the collar doesn't receive a similar sort of signal (usually with paired encryption) in a specified amount of time, upon certain individuals uttering a command word, or if the wearer simply wills it. The collar also activates if a creature fails the Engineering check to remove it.
Upon activation, the collar illuminates with red light and the device injects the wearer with nanites adapted to the wearer's genetic code. These nanites destroy a wearer's brain in seconds (death is instantaneous), obliterate the head in 1 round, and then disassemble the rest of the body in a number of rounds equal to 1 + the number of steps by which the creature's size category exceeds Small. Once the process is over, the nanites decompose, and all that remains of them and their victim is molecular dust. The nanites are harmless to organisms they aren't adapted to disassemble, and they decompose seconds after being removed from the collar.
After the collar activates, its magic fades, becoming just an ornate piece of iron jewelry worth about 20 credits.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//allegiance collar// | 8 | 10,000 | L |
</div>
An allergy pod is a small organic consumable that can be inserted into your nose or another breathing orifice with a standard action, where it slightly inflates to fill your breathing cavity. Creatures with multiple nostrils must break the pod apart and insert a piece in each nostril. The pod suppresses your allergic responses to inhaled substances, such as fungus, mold, or pollen. You gain a +2 circumstance bonus to saving throws against inhaled afflictions for 12 hours, after which the pods shrivel up and drop out of your nose. The listed price is for a box of 10 allergy pods.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|allergy pod | 1 | 20 | — |
</div>
<div class="statblock">
* ''Type'' melee; ''Special'' [[analog]], [[penetrating]], [[thrown]] (20 ft.)
* ''Damage'' low; ''Damage'' Type S; ''Critical'' —
* ''Slots'' 1 (upper limb)
* ''Cost'' 2.5 × level
</div>
This sword is made of the finest adamantine alloy honed to a razor‑sharp edge.
This clockwork precision instrument, often mounted on the bridge of a starship, allows you to glean the distance and direction of Alluvion, the itinerant city in the Drift. While you’re in the Drift, the theodolite gives you a +4 insight bonus to astrogate to Alluvion (though you must still have received coordinates from some other source).
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//Alluvion theodolite// | 3 | 1,750 | 2 |
</div>
<div class="statblock">
* ''CR'' 12; ''XP'' 19,200
* NE Large outsider (daemon, evil, extraplanar)
* ''Init'' +8; ''Senses'' [[blindsense]] (life) 60 ft., [[darkvision]] 120 ft.; ''Perception'' +22
* ''Aura'' hazardous dedication (100 ft., DC 21)
!!! DEFENSE
* ''HP'' 200
* ''EAC'' 26; ''KAC'' 27
* ''Fort'' +11; ''Ref'' +13; ''Will'' +17
* ''Immunities'' acid, death effects, disease, poison; ''Resistances'' cold 10, electricity 10, fire 10
!!! OFFENSE
* ''Speed'' 10 ft., fly 50 ft. ([[Su]], average)
* ''Melee'' slam +22 (2d10+16 B)
* ''Ranged'' electro discharge +24 (2d8+12 E; critical [[arc]] 3d6)
* ''Space'' 10 ft.; ''Reach'' 5 ft.
* ''Offensive Abilities'' virtual mortality
* ''Spell-Like Abilities'' (CL 12th; melee +22, ranged +24)
** 1/day—//[[holographic terrain]]// (DC 22), //[[overload systems]]// (DC 21)
** 3/day—//[[arcing surge]]// (DC 20), //[[displacement]]//, //[[holographic image]]// (5th level, DC 22), //[[instant virus]]// (DC 20)
** At will—//[[holographic image]]// (3th level, DC 20), //[[magic missile]]//, //[[remote operation]]//
!!! STATISTICS
* ''Str'' +4; ''Dex'' +8; ''Con'' +2; ''Int'' +3; ''Wis'' +3; ''Cha'' +5
* ''Skills'' [[Bluff]] +27, [[Computers]] +27, [[Culture]] +27, [[Engineering]] +22, [[Piloting]] +22
* ''Languages'' Abyssal, Infernal; [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any (Abaddon)
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Electro Discharge ([[Su]])'' See [[alucidaemon]].
''Hazardous Reality ([[Su]])'' An alorbidaemon can distort reality around themself. Each creature within 100 feet of the alorbidaemon must succeed at a DC 21 Will save or take a –2 penalty to saving throws against illusions; this penalty persists while the creature remains in the aura and for 1 minute afterward. Any creature taking this penalty also takes 4d10 damage at the end of each turn that they're within an area of holographic terrain or within 30 feet of a holographic image (Will DC 21 negates), as the holographic threats attack them and inflict mental strain. A creature that succeeds at either Will save against hazardous reality is immune to that alorbidaemon's aura for 24 hours. This is a mind-affecting effect.
''Virtual Mortality ([[Su]])'' See [[alucidaemon]]; the Will save DC is 21, and the damage dealt is 3d8.
</div>
\define alpha(tag)
<$list filter="A B C D E F G H I J K L M N O P Q R S T U V W X Y Z">
<$set name="letter" value={{!!title}}>
<$list filter="[tag[$tag$]prefix<letter>limit[1]]">
<details class="alpha">
<summary><<letter>></summary>
<div class="section">
<div class="tc-table-of-contents">
<$macrocall $name="toc-selective-expandable" tag="$tag$" sort="] -[!prefix<letter>tag[$tag$]] +[sort[title]" />
</div>
</div>
</details>
</$list>
</$set>
</$list>
\end
Example:
<<alpha 'Skills' >>
Portable altars are designed for use by traveling or adventuring priests when access to a church or temple is not available. Portable altars can be made of durable plastic, ceramic, or even wood, and they are usually ornately decorated and embellished with the religious iconography of a particular deity or faith. One side of the altar is a hinged lid, allowing you to store items such as holy texts, religious symbols, and other religious accoutrements inside.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|altar, portable | 1 | 250 | 2 |
</div>
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' necromancy
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one corpse
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You cause a corpse to change to suit a narrative you choose. This spell can hide or create clues about how the corpse ended up in its current state, from closing wounds to evaporating chemicals in the cadaver's system. However, the changes cannot be major, such as removing or restoring a limb, or stripping flesh from the skeleton. The spell is also unable to change the corpse's identity.
Anyone who examines the corpse can attempt a [[Perception]] check (DC = 10 + your caster level) to notice that the corpse's condition (or lack thereof) seems manipulated, but success doesn't allow the observer to determine what the corpse looked like before this spell was cast. Closely examining the corpse with a successful [[Medicine]] check (DC = 15 + your caster level) not only reveals what a successful Perception check does, but also reveals what the corpse looked like before this spell was cast.
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one weapon with at least one weapon fusion or one suit of armor with at least one armor upgrade
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Fortitude negates (object)
* ''Spell Resistance'' yes
</div>
You tap into the multiverse and find a reality with a forgotten object similar to the target of this spell, swapping that item with the target item. For the duration of the spell, you can select one weapon fusion or armor upgrade on the target item to replace with another. A fusion selected this way must be the same level of the original or lower. An upgrade selected this way must be the same type (hybrid, magical, or technological) as the original, be of the same level or lower. and occupy the same number of slots or fewer. At the end of the spell's duration, the original item returns as it was when swapped, including its number of remaining charges, if any.
Attacks might be more difficult due to bad weather or barriers that block lines of sight. Use the normal rules for concealment, cover, and line of sight when implementing environments that alter attacks. It's rare for the environment to improve attacks, but if it somehow would, you can reduce the normal penalties for attacking during a chase.
You can quickly adjust your posture, your stride, your demeanor, and the way your clothes and gear fit, causing casual observers to fail to recognize your true appearance. When you attempt a [[Disguise]] check to alter minor details of your appearance, you can forgo your expertise die to attempt the check as a move action. You don't reduce the DC by 5 for attempting to alter only minor details, and if an observer succeeds at an opposed [[Perception]] check that pierces your disguise, he also realizes your true race and what features you have disguised. You can't use this ability for more complex disguises.
Some environments make it easier, more difficult, or more complicated to move. This might come up in a chase through a space station where some zones lack artificial gravity or on a muddy plain where vehicles could get bogged down. Altered movement usually causes a +2 bonus or –2 penalty to skill checks attempted during pilot actions. The environment can work differently on different vehicle types; a wheeled transport might take a penalty when artificial gravity goes out, while a hover vehicle wouldn't, for example. Likewise, the effects can change how certain actions work. A massive downhill slope might make it easier to speed up but harder to keep pace, or it could even require a check to slow down.
You can spend 1 Resolve Point as a standard action to replace a section of wall, floor, or ceiling within 30 feet with a counterpart from an alternate reality in which that obstacle contains an unlocked door, window, or other means of access. To create the opening, you must succeed at a caster-level check (1d20 + your caster level) with a DC equal to the obstacle’s break DC. You can spend up to 3 additional Resolve Points when activating this paradigm shift, gaining a cumulative +5 bonus to the caster-level check for each additional Resolve Point spent. The portal persists for 1 minute or until you dismiss it as a standard action, and a creature partway through the portal is immediately shunted to its choice of either side. This ability can only target artificial or constructed surfaces no more than 5 feet thick.
As a standard action, you can target a creature within 100 feet that was summoned with //[[summon creature]]// or transformed with //[[polymorph]]// and alter their form (Will negates). You transform this creature from their current form to another creature or form allowed by the spell of that spell level, though these creatures or forms must be drawn from the predetermined //polymorph// forms or predetermined //summon creature// forms selected by you or the caster. The creature retains this new form for the duration of the //summon creature// or //polymorph// spell. After you use this ability, you can’t do so again until after you take a 10-minute rest to regain Stamina Points, though you can use it additional times by spending 1 Resolve Point per additional use.
The interstellar drives below let you travel to distant star systems without using the Drift. For each ship, divide the base travel time by the drive’s engine rating; the better the rating, the faster you can reach your destination. Interstellar drives have a PCU requirement and a maximum frame size. The cost in Build Points is based on the starship’s size category (for the purposes of this calculation, Tiny = 1, Small = 2, Medium = 3, and so on). Also, most of these interstellar drives are typically only available to a specific group or organization.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
You can use your grasp of other realities to swap an outcome in your current existence with that of a more favorable reality. As a reaction once per day, you can reroll one attack roll, saving throw, ability check, or skill check that you attempt. Alternatively, you can expend a use of this ability as a reaction to cause a critical hit against you or an ally within 100 feet to instead be a normal hit.
You gain one additional daily use of this ability at 12th level and again at 18th level.
<<list-links "[tag[Alternate Traits]sort[title]]" class:index>>
As a standard action, you can spend 1 Resolve Point to transform a vehicle's mode of transport, granting it wheels, a hull, wings, and other features as needed. One vehicle you touch replaces one of its current movement speeds with an equal movement speed selected from the following: land speed, swim speed, or fly speed. This transformation lasts for a number of minutes equal to your witchwarper level, though you can extend the duration to 8 hours by spending 2 additional Resolve Points when you activate this ability.
As a move action, you can spend 1 Resolve Point to envision an alternate reality in which you trained differently, took different coursework in school, or just paid more attention in the classes you did take. Choose a skill to acquire; for 1 minute, all the ranks you have in the skill to which your [[compound sight]] feature applies, as well as the compound sight feature itself, instead apply to the skill you are acquiring. This skill also becomes a class skill for you, so you receive a trained class skill bonus when making checks with it. However, you have 0 ranks in the skill to which your compound sight usually applies for the duration of this ability.This effect lasts for 1 minute, though you can dismiss it at any time. If you use this ability to acquire a skill that requires you to make choices—such as [[Culture]], which grants an additional language for every rank—you make those choices when you spend the Resolve Point to activate this ability.
<div class="statblock">
* ''Tier'' 3; ''XP'' varies
* CE Medium starship monstrous humanoid
* ''Speed'' 10; ''Maneuverability'' average (turn 2)
* ''AC'' 16; ''TL'' 14
* ''HP'' 70; ''DT'' —; ''CT'' 14
* ''Shields'' basic shields 30 (forward 9, port 7, starboard 7, aft 7)
* ''Attack (Forward)'' particle beam (8d6; 20 hexes)
* ''Attack (Aft)'' micromissile battery (2d6; 20 hexes)
* ''Attack (Turret)'' light particle beam (3d6; 10 hexes), light particle beam (3d6; 10 hexes)
* ''Power Core'' Pulse Red (175 PCU); ''Drift Engine'' none
* ''Systems'' budget short-range sensors, mk 1 defenses, mk 1 trinode computer, mk 3 armor; ''Expansion Bays'' [[cargo holds]] (5)
* ''Modifiers'' +1 to any 3 checks per round
* ''Other Abilities'' fleet mind, living starship, void adaptation
!!! CREW ACTIONS
* ''Engineer (1 action)'' [[Engineering]] +8 (3 ranks)
* ''Gunner (2 actions)'' gunnery +7 (3rd level)
* ''Pilot'' Piloting +10 (3 ranks)
!!! ECOLOGY
* ''Environment'' any vacuum
* ''Organization'' solitary, pair, or clutch (3–8)
!!! SPECIAL ABILITIES
''Fleet Mind ([[Ex]])'' Like individual Swarm components, Swarm starships are bound together into a singular hive mind through a blend of radio, quantum, and telepathic communication. All Swarm starships within 10 hexes of each other are in constant communication; if one is aware of a threat, all are. (Such awareness can spread along a "chain" of Swarm starships under appropriate circumstances, potentially alerting distant Swarm vessels.) Swarm vessels can also communicate telepathically with all Swarm creatures within 10 hexes.
''Living Starship ([[Ex]])'' An altipheron is a colony of symbiotic creatures so immense that it functions as a starship (and thus engages in only starship combat). Three central brains (represented as a trinode computer) command a host of bioengineered Swarm components that act as a unified organism. These brains allow the altipheron to take crew actions using the skill bonuses, ranks, and level listed in Crew Actions above. Modifiers for the altipheron's size, speed, and maneuverability are already factored into its statistics. Critical damage to life support instead damages the central brains, with the listed effect applying to gunnery actions in addition to any penalties from weapons array critical damage. Critical damage to crew has no effect on an altipheron, due to the adaptability of its components.
</div>
Altipherons form a major component of many Swarm fleets. They are better armed and armored than Swarm [[fleetfuries]], but smaller than the mighty dreadlancers. Altipherons are quick to construct and require a relatively small output of resources, allowing the Swarm to launch a large number of these starships in a brief period of time.Altipherons are picket ships in function; they are often deployed in orbit around a planet the Swarm is devouring, repelling outsiders who might try to liberate the world before it can be consumed. Their fleet mind ability provides them unparalleled teamwork, meaning a detachment of altipherons is often as dangerous as a larger ship, if not more so. Occasionally, altipherons are used as troop transports, cramming many Swarm components into their cargo holds.
Altipherons lack any Drift capabilities of their own. When the Swarm prepares to move to a new system, altipherons are simply incorporated into larger vessels, ready to be deployed at the next target.
This small, metal bead syncs with a [[comm unit]] to transmit its relative location from a starting point. When dropped more than 10 feet, accelerometers inside the bead begin measuring how far the bead has fallen. Once it stops free falling, an app on the connected comm unit displays how far the bead fell and the bead's relative position from the user, to a range of 5 miles.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|altitude bead | 2 | 100 | — |
</div>
<div class="statblock">
* ''CR'' 4; ''XP'' 1,200
* NE Small outsider (daemon, evil, extraplanar)
* ''Init'' +5; ''Senses'' [[blindsense]] (life) 30 ft., [[darkvision]] 60 ft.; ''Perception'' +10
!!! DEFENSE
* ''HP'' 52
* ''EAC'' 16; ''KAC'' 17
* ''Fort'' +3; ''Ref'' +5; ''Will'' +7
* ''Immunities'' acid, death effects, disease, poison; ''Resistances'' cold 5, electricity 5, fire 5
!!! OFFENSE
* ''Speed'' 10 ft., fly 50 ft. ([[Su]], average)
* ''Melee'' slam +9 (1d4+6 B)
* ''Ranged'' electro discharge +11 (1d4+4 E; critical [[arc]] 1d4)
* ''Offensive Abilities'' virtual mortality
* ''Spell-Like Abilities'' (CL 4th)
** 1/day—//[[holographic image]]// (2nd level, DC 15), //[[laser net]]// (DC 15)
** 3/day—//[[magic missile]]//, //[[overheat]]// (DC 14), //[[remote operation]]//
** At will—//[[daze]]// (DC 13), //[[ghost sound]]// (DC 13)
!!! STATISTICS
* ''Str'' +2; ''Dex'' +5; ''Con'' +0; ''Int'' +1; ''Wis'' +1; ''Cha'' +3
* ''Skills'' [[Bluff]] +15, [[Computers]] +15, [[Culture]] +15, [[Engineering]] +10, [[Piloting]] +10
* ''Languages'' Abyssal, Infernal; [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any (Abaddon)
* ''Organization'' solitary, pair, or local-area network party (3–16)
!!! SPECIAL ABILITIES
''Electro Discharge ([[Su]])'' An alucidaemon can produce an electric discharge from their gauntlets. This is a ranged attack against EAC that has a range increment of 20 feet.
''Virtual Mortality ([[Su]])'' As a standard action, an alucidaemon can focus on a single living creature within 60 feet that has immediate access to a personal comm unit or datapad. Unless the target succeeds at a DC 15 Will save, the device immediately activates a vidgame that compels the target to play it. While the vidgame is active, the target takes a –2 penalty to AC and saving throws. The target can take a move action to play the vidgame, allowing it to attempt another DC 15 Will save to end the effect. At the end of each turn that the target doesn't take this move action, it begins to lose the vidgame and takes 2d6 damage from the vidgame as deadly feedback. Whether or not a creature succeeds at its saving throw against this ability, it's immune to further instances of this effect for 24 hours. This is a mind-affecting effect.
</div>
<<section 'Alorbidaemon'>>
Alucidaemons prey upon those who lose themselves in digital media, draining the life from those who grow obsessed with vidgames. Alucidaemons take the form of gaunt, child-like figures, their eyes covered by a visor feeding them various realities while they watch in slack-jawed awe. Nearly all of them move with the help of a floating pod that serves as an extension of their bodies; they control its movements with the mechanical gauntlets permanently locked onto their withered hands. A typical alucidaemon is 3 to 4 feet tall but weighs 200 pounds due to their mechanical components.
Especially dangerous, alorbidaemons arise from the souls of wicked sensates who perish while engrossed in virtual reality as their bodies withered from neglect. Alorbidaemons appear as horrible amalgams of several alucidaemons, joined together in a connected set of pods to form a single body. A typical alorbidaemon is 4–5 feet tall but can weigh 1,000 pounds.
<div class="statblock">
* ''CR'' 9; ''XP'' 6,400
* N Large animal
* Init +4; Senses blindsense (scent) 60 ft., low-light vision; Perception +17
!!! DEFENSE
* ''HP'' 145
* ''EAC'' 22; ''KAC'' 24
* ''Fort'' +13; ''Ref'' +13; ''Will'' +8
!!! OFFENSE
* ''Speed'' 50 ft. (45 ft. in armor); snow stride
* ''Melee'' gore +21 (2d10+15 P)
* ''Space'' 10 ft.; ''Reach'' 5 ft.
* ''Offensive Abilities'' spit (1/hour; ranged +19), [[trample]] (2d10+15 B, DC 16)
!!! STATISTICS
* ''Str'' +6; ''Dex'' +4; ''Con'' +3; ''Int'' –4; ''Wis'' +0; ''Cha'' –3
* ''Skills'' [[Athletics]] +22, [[Survival]] +17
* ''Other Abilities'' cold inured
* ''Gear'' pinion [[skyfire armor]]
!!! ECOLOGY
* ''Environment'' cold hills, mountains, or plains (Triaxus)
* ''Organization'' solitary, pair, or mounted (1 alural war wolliped and 1 ryphorian)
!!! SPECIAL ABILITIES
''Cold Inured ([[Ex]])'' As [[wolliped]].
''Snow Stride ([[Ex]])'' As [[wolliped]].
''Spit ([[Ex]])'' As [[wolliped]] (Fort DC 16; [[sickened]] 1d6 rounds).
</div>
AbadarCorp first manufactured //amber hyperboloids// as defensive devices for law enforcement agents. While this //aeon stone// orbits you, you have [[DR]] 1/— and energy [[resistance]] 1 against all energy types, but both apply only to damage from ranged attacks.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//amber hyperboloid// | 4 | 2,200 | — |
</div>
<div class="statblock">
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 13
* ''Track'' [[Wisdom|Wisdom Poison Track]] (special)
* ''Frequency'' 1/round for 3 rounds
* ''Effect'' Progression track is //Weakened—Impaired—Blinded//; no end state. When at the //blinded// stage, the victim gains the [[blinded]] condition.
* ''Cure'' 1 save
</div>
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|amblaree | 2 | 175 | 1 |
</div>
You are particularly skilled at attacking surprised targets.
''Benefit:'' When you act in a surprise round and attack a target that has not yet acted in the same combat, you gain a +1 bonus to your attack roll and a bonus to damage equal to half your base attack bonus.
You are particularly skilled at avoiding attacks when surprised.
''Benefit:'' If you are unable to act in the surprise round because you failed a [[Perception]] check, you can still act on your initiative count in the surprise round, but only to take the total defense action.
The ambusher fighting style focuses on stealth, tactical positioning, and superior reflexes to gain an edge. You must have [[Stealth]] as a class skill to select this fighting style.
!! Vigilance (1st)
You watch for danger and respond swiftly. You gain [[Improved Initiative]] as a bonus feat. Whenever you act before an enemy during the first round of combat, you gain a +1 insight bonus to weapon attack rolls against that enemy until the beginning of your next turn.
!! Cheap Shot (5th)
When you succeed at a [[Stealth]] check to hide opposed by a target's [[Perception]] check or when you have improved or total cover against a target, as a full action you can make one ranged attack against that target that deals additional damage equal to half your Dexterity bonus.
!! Deadly Reflexes (9th)
When an enemy attacks you before you have taken any actions in combat, you can use your quick reflexes to retaliate. As a reaction, you can spend 1 Resolve Point to make one attack with a ranged weapon you are wielding immediately after the enemy's attack.
!! Exploit Cover (13th)
When you attempt a [[Stealth]] check to hide from an enemy that can see you, you gain a +4 insight bonus to the check if you can move into improved or total cover. In addition, whenever you attempt a Stealth check to hide while sniping, the penalty to your Stealth check is only –10.
!! Ambusher's Edge (17th)
As a full action, you can make one attack that, in addition to dealing its normal damage and effects, causes the target to gain the [[off-target]] condition until the end of its next turn. You can also use this ability as a standard action against any creature that is [[flat-footed]].
In luxury cruise liners, residential starships, and other Huge or larger starships with large crews, some expansion bays are devoted to businesses that serve the population. An amenity might be a high-end restaurant or spa, a night club or theater, or a shopping center. If using downtime rules, an amenity can provide a +1 bonus to all skill checks for one downtime activity, selected when the amenity is installed.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|amenities | 4 | 2 |
</div>
If your stunt and strike skill check and attack roll both succeed, instead of causing a target to gain the [[flat-footed]] condition, you can reload one weapon you're carrying without requiring an action.
The mech stores an exceptional amount of ammunition for each of its weapons. The mech can reload each of its weapons two additional times.
<$list filter="[list[$:/StoryList]is[current]]">
Weapons often employ electrical charges (typically stored in batteries), cartridges of ammunition, or individual missiles. A weapon's capacity measures what size battery it uses or the number of cartridges it can hold, and its usage is how much ammunition it uses with each attack. You can use launchers to fire their corresponding missiles, which must be loaded individually. Reloading a weapon or inserting a new battery (including ejecting a spent cartridge or battery if necessary) takes a move action.
Weapons that use standard ammunition (arrows, charges, darts, mini-rockets, petrol, rounds, scattergun shells, etc.) are sold preloaded. For weapons with other forms of ammunition (such as grenades), ammunition must be purchased separately.
</$list>
<<list-links "[tag[Ammunition]sort[title]]" class:index>>
<$list filter="[list[$:/StoryList]is[current]]">
!! Cartridges
This type of ammunition includes bullets (often called rounds or shells), bolts, darts, mini-rockets, pellets, and other physical projectiles with any necessary casing and propellant. Cartridges are typically either contained in a multi-cartridge magazine or loaded into the weapon individually; a weapon is assumed to come with enough magazines that you can load spare ones for reloading the weapon in battle. If you buy more cartridges than can be held in a single magazine of your weapon, the purchase includes additional magazines of the same capacity, up to the number needed to fit all your cartridges into magazines. The same rules apply to petrol for flame weapons.
Rounds are standardized by weapon type. For example, small arms all use the same size of round, but you can't use a small arm round in a longarm. Most projectile weapons fire one cartridge per attack unless they have special firing modes that shoot multiple cartridges in a short time.
!! Charges
This ammunition powers energy or projectile weapons using charges stored in batteries. Since each energy weapon varies in intensity, stronger weapons use up more charges per shot. You can restore a weapon's charges by attaching it to a generator or a [[recharging station]] and thereby recharging its battery, or by swapping out its battery for another fully charged battery.
Recharging a weapon's battery from a generator takes 1 minute per charge restored, and using a recharging station takes 1 round per charge, but swapping out a battery takes only a move action. Most batteries can hold 20 charges, but some high-capacity versions made of rare materials can hold more.
A weapon's battery cannot be recharged to hold more charges than its capacity. A weapon that holds a high-capacity battery still works when a lower-capacity battery is inserted into it, but if a battery has fewer charges remaining than the minimum number required to fire a shot, the weapon doesn't fire.
In addition to weapons, batteries can be used to power a wide array of items, including powered armor and technological items.
!! Missiles
This special ammunition is loaded and fired one at a time, and it includes arrows and explosive rounds fired from launchers. Some weapons that fire missiles have the [[quick reload]] special property, allowing you to draw the ammunition and fire it as part of your attack or attacks. Attacks with missile weapons often have the [[explode]] special property.
</$list>
The creature's body is malleable and shapeless. It does not take double damage from critical hits, but it is affected by critical hit effects normally.
//Format:// ''Defensive Abilities'' amorphous.
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' transmutation (polymorph)
* ''Casting Time'' 1 standard action; see text
* ''Range'' personal
* ''Duration'' 1 round/level (D)
</div>
Your body briefly shifts into an amorphous form, enabling you to circumvent certain attacks and squeeze through tight spaces. You do not take double damage from critical hits, but critical hit effects apply against you normally. You gain a +4 circumstance bonus to your KAC against the grapple and reposition combat maneuvers. You can move through an area as small as one-quarter of your space without squeezing, or one-eighth your space when squeezing.To benefit from this spell, you must have the shapechanger subtype or be benefiting from a polymorph effect. You can cast this spell as a reaction when you are attacked by a grapple or reposition maneuver or hit by a critical hit, but when you do, you can't take a standard action on your next turn.
The creature has the aquatic subtype or [[water breathing]], but it can breathe air and survive on land.
//Format:// ''Other Abilities'' amphibious.
These craft travel just as easily on land or in water.
* ''Adjustments:'' Increase price by 10%. The vehicle becomes a land and water vehicle, gaining either a ground speed equal to its swim speed, or vice versa.
* ''Special:'' The vehicle must have the [[boat]] type graft or any type graft that grants a land speed.
You can create sudden distractions with technological devices.
''Prerequisites:'' [[Computers]] 3 ranks, [[Intimidate]] 3 ranks.
''Benefit:'' As a standard action, you can wirelessly introduce a fast-acting virus into nearby technological devices to briefly cause them to malfunction in loud, surprising ways. You can use this ability on one target creature per character level, no two of which can be more than 30 feet apart. Each target must either be carrying technological devices or be within sight and hearing of such devices. While the locations of such devices are up to the GM, most public spaces (aside from technologically underdeveloped areas) contain enough technology for this feat to function. Your glitch causes alarms to go off, automated devices to spin and flail, readouts to flash brightly, and so on. With a successful [[Computers]] check (DC = 15 + 1 per target + 1-1/2 × the CR of the highest-CR target), all targets are [[shaken]] for 1 round, plus 1 additional round for every 5 by which your result exceeds the DC.
Once you have targeted a creature with this feat, that foe is immune to this ability for 24 hours.
When you use the [[target system]] science officer action and exceed the [[Computers]] check's DC by 5 or more, you also identify a way for your starship's weapons to trigger additional disruptions. The next attack made by your starship that deals critical damage to the enemy starship also gives the [[glitching]] condition to one ther system, chosen randomly from systems that don't have a critical damage condition, as though it had been hit by an EMP weapon. This glitching condition lasts for 1 round.
Through profound pain and headaches connected to psychic contact has come wisdom. You have studied your own psychic reverb and can impose the effect on opponents.
''Prerequisites:'' Psychic reverb species trait, character level 5th.
''Benefits:'' You add 1 damage per damage die to your mind-affecting spells, weapons and other effects.
[[Shimreens]] can absorb and amplify energy within their crystalline bodies. Plates embedded in your skin allow you to do the same. Whenever you take energy damage, you can voluntarily take an additional 1d4 damage of the same type. The next time you hit with a melee attack, you release this energy, dealing an additional amount of damage equal to the extra damage you took (and of the same type). You can't take additional damage in this way again until you release your stored energy. If unused, the stored energy dissipates after 10 minutes. The amount of extra damage you take and deal increase to 2d4 when you reach 8th level and to 3d4 when you reach 16th level.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|amplify graft | 4 | 2,000 | skin |
</div>
You can attune to a Drift engine to amplify its powers. Attuning to a Drift engine is a 10-minute process, at the end of which you must spend 2 Resolve Points that you can’t recover until you’re no longer attuned to the Drift engine. The attunement ends when you leave the starship or spend a full action to end the attunement.
While you’re attuned to a Drift engine, you treat the engine rating as though it were one higher, though this can’t grant a starship an effective engine rating higher than its size would normally allow. This benefit doesn’t stack with other effects that increase a Drift engine’s effective engine rating. To gain this benefit, you must remain attuned to the Drift engine for the entirety of the starship’s Drift voyage; if you become unattuned, the travel time increases, instead using its base engine rating to calculate the trip’s duration. While attuned to a Drift engine, you also apply your [[techlore]] bonus to [[Piloting]] checks you make to control the starship.
You’ve discovered how to create specialized //[[spell ampoules]]// using ingredients in your [[custom microlab]]. Your selection of //spell amps// is limited to a number of spells equal to 3 + half your biohacker level; these spells must fulfill all the requirements for a //spell amp//. These spells comprise the list of //spell amps// you can create with this ability. Each time you gain a biohacker level, you can swap out one spell on this list for another spell that qualifies. Whenever you gain an even‑numbered biohacker level, you also select one additional spell to add to your list of //spell amps//.
The first time each day that you create your biohacks, you can create two 0-level //spell amps// and one 1st-level //spell amp// from your list. At 8th level, you also can prepare one 2nd-level //spell amp// from your list. Your //spell amps// are highly experimental and provide a benefit only when either consumed by you or when an imbiber also spends 1 Resolve Point as part of the action to consume the //spell amp//. You can inject these //spell amps// as though they were biohacks, though you must expend 1 Resolve Point and a biohack to do so.
You have surpassed conventional //[[spell ampoule]]// science, allowing you to prepare one 3rd-level //spell amp// each day from your list of known //spell amps// using the [[ampoule expertise]] theorem. When you gain this theorem, you also add one additional spell to your list of //spell amps// that you can prepare.
At 18th level, you can prepare one 4th-level //spell amp// each day from your list of known //spell amps//; this exceeds the normal level limit for //spell ampoules//, though any 4th-level spells you add to your list of //spell amps// must still follow all other rules for creating //spell amps//. You must have ampoule expertise to select this theorem.
Amrantahs are living machines made from highly advanced magitech and imbued with the soul of a long-dead person from Amran. These artificial beings are humanoid in appearance and most often resemble humans made of metal, with bluish energy visible from within their bodies. Amrantahs can easily modify their bodies with access to a ghost forge, and many take full advantage of this fact. Some take on appearances resembling draconic or bestial humanoids, while others adopt a blank-faced, enigmatic appearance. Amrantahs often choose a gender fitting the soul's identity. These amrantahs shape their bodies to reflect their gender, while others experiment with or reject gendered traits.
All amrantahs emerge from the ghost forges with the default imprint left behind by the machines' Gap-shattered programming. Originally meant to grant the amrantah a portion of their people's knowledge, this process instead causes amrantahs to emerge with naive, innocent, and somewhat undeveloped personalities, though each is still influenced by their preimprint personalities. Amrantahs tend toward chaotic good or chaotic neutral alignment as a result, with a whimsical, fun-loving bent. Amrantahs and gnomes get along very well.
Amrantah culture, such as it is, is largely defined by their environment. The pleasure-cities of Amran offer amrantahs an endless array of distractions, and many have short attention spans, though engrossing tasks can hold them rapt for as long as necessary. Even when away from their cities, amrantahs use their internal systems to play games or otherwise entertain themselves while performing other tasks. Accustomed to having their way, amrantahs can become petulant when a desire is denied, though most are too good natured to really make a fuss—another pleasure is around the corner, after all.
Given their origins, amrantahs have a casual relationship with religion. When an amrantah dies, regardless of their distance from a ghost forge, the soul travels back to be reborn. While this offers immortality of a sort, the amrantahs no longer have the mastery of magitech necessary to reprogram the ghost forges. Thus, souls reborn this way are inevitably reimprinted, emerging with a blank mind and personality. Most amrantahs have a healthy respect for death, if not quite the same fear other species possess. Most amrantahs see the process of reincarnation as the doorway to new adventures, so after living a full life, an amrantah sees death as little to fear.
Amrantahs vary from 5 to 7 feet tall, and they weigh from 120 to 350 pounds. The physical components of an amrantah degenerate over time, meaning each individual usually lives a bit more than a century.
!! Racial Traits
* ''Ability Adjustments:'' +2 Con, +2 Cha, –2 Wis
* ''Hit Points:'' 6
* ''Size and Type:'' Amrantahs are Medium constructs with the magical and technological subtypes.
* ''Constructed Body:'' An amrantah's body is made of magically and technologically enhanced metal housing a technomagical substance like ectoplasm that holds the soul, glowing with this spiritual energy. An amrantah has an internal, integrated standard [[datajack]] and personal [[comm unit]]. If an amrantah is [[helpless]], these items can be removed or destroyed without damaging the amrantah. They can be replaced or upgraded for the normal price of this equipment. This gear doesn't count against the systems in which an amrantah can install augmentations. In addition, an amrantah can install two extra augmentations overall, provided no one system has more than two.
* ''Exposed Soul:'' Amrantahs' souls are less protected than those of other creatures, and they take a –2 penalty to saving throws against necromancy effects. Additionally, amrantahs are as susceptible to mind-affecting effects as humanoids.
* ''Living Machine:'' Amrantahs are living creatures. Amrantahs have a Constitution score, benefit from natural and magical healing, and can be raised from the dead. They lack the [[construct immunities]] trait, are immune only to disease—their internal fluid can be disrupted by poison and affected by drugs and medicinals. Amrantahs replenish internal energy and fluid by eating and drinking, and they must rest and can dream. However, amrantahs don't breathe or suffer the environmental effects of being in a vacuum.
* ''Shapeable Hold:'' An amrantah's plating is slightly shapeable via the influence of the underlying fluid, allowing a better grip on or integration with objects. When wearing armor with which they have proficiency, amrantahs can integrate with the armor, reducing its armor check penalty by 1 and its speed penalty by 5 feet. In addition, amrantahs gain a +2 racial bonus to KAC against disarm combat maneuvers.
This modest amulet projects a simple pattern over your outer layers of armor, clothing, and equipment, which helps you blend into the background. When in an environment with a maximum distance at which [[Perception]] checks can be attempted, rolls to see at what range other creatures can attempt Perception checks against you are rolled twice, and the lower result applies. The amulet's magic isn't powerful enough to make you invisible or grant a bonus to [[Stealth]] checks. You can activate or deactivate this camouflage as a standard action.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//amulet of camouflage// | 3 | 1,400 | — |
</div>
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* LN Medium construct (technological)
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +13
!!! DEFENSE
* ''HP'' 90
* ''EAC'' 18; ''KAC'' 20
* ''Fort'' +3; ''Ref'' +3; ''Will'' +7
* ''Defensive Abilities'' retractable laser; ''Immunities'' [[construct immunities]]
* ''Weaknesses'' light dependency
!!! OFFENSE
* ''Speed'' 40 ft.
* ''Melee'' slam +13 (1d6+6 B)
* ''Ranged'' retractable laser +15 (1d6+6 F; critical [[burn]] 1d4)
!!! STATISTICS
* ''Str'' +0; ''Dex'' +3; ''Con'' —; ''Int'' +4; ''Wis'' +1; ''Cha'' +4
* ''Skills'' [[Bluff]] +13, [[Culture]] +18, [[Diplomacy]] +18, [[Sense Motive]] +13
* ''Languages'' Common, up to four others; shortwave 100 ft.
* ''Other Abilities'' language assimilation, [[unliving]]
!!! ECOLOGY
* ''Environment'' any (Aballon)
* ''Organization'' solitary or pair
!!! SPECIAL ABILITIES
''Language Assimilation ([[Ex]])'' An anacite ambassador can spend 1 minute accessing a planet's infosphere to learn any language commonly spoken on that planet. Alternatively, the anacite can learn a language by spending 1 day listening to it and reading it. An anacite ambassador can store knowledge of up to four languages at a time in this way, and it can choose which language to replace when it wants to learn a new one.
''Light Dependency ([[Ex]])'' An anacite ambassador can acquire power from dim or brighter light, and it can store power generated in this way. The anacite can operate in darkness for 2 hours. After this time, the anacite gains the [[sickened]] condition until it returns to an area of dim or brighter light.
''Retractable Laser ([[Ex]])'' An anacite ambassador's retractable laser has a range increment of 90 feet. When not in use, this weapon is folded inside the anacite's arm and hidden from sight. A creature unaware of the anacite's hidden weapon must succeed at a DC 24 [[Perception]] check to find its compartment. The anacite can deploy or retract this weapon as a swift action or as part of making an attack or full attack. The weapon is mounted and leaves the anacite's hands free, and the anacite can't be disarmed of it. While deployed, the laser can be sundered as an item with a level equal to the anacite's CR.
''Shortwave ([[Ex]])'' An anacite can communicate wirelessly. This acts as [[telepathy]], but only with other creatures with this ability or constructs with the technological subtype.
</div>
Anacite ambassadors travel to foster diplomatic relations. Most often members of Those Who Become, anacite ambassadors serve on Aballonian seedships as emissaries. Anacite ambassadors can easily learn languages. Further, although they are not warriors, ambassadors can protect themselves with built-in lasers. To avoid tension during diplomacy, ambassadors keep this weapon retracted until it's needed, though they usually notify their hosts about the laser unless there's a good reason to keep it a secret.
<div class="statblock">
* ''CR'' 1; ''XP'' 400
* N Small construct (technological)
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +10
!!! DEFENSE
* ''HP'' 17
* ''EAC'' 11; ''KAC'' 12
* ''Fort'' +0; ''Ref'' +0; ''Will'' +2
* ''Defensive Abilities'' concealed weaponry; ''Immunities'' [[construct immunities]]
* ''Weaknesses'' light dependency
!!! OFFENSE
* ''Speed'' 40 ft., climb 40 ft.
* ''Melee'' serrated edge +4 (1d4+1 S)
* ''Ranged'' polishing laser +7 (1d4+1 F; [[burn]] 1d4)
* ''Offensive Abilities'' innocuous trick
!!! STATISTICS
* ''Str'' +0; ''Dex'' +4; ''Con'' —; ''Int'' +2; ''Wis'' +0; ''Cha'' +1
* ''Skills'' [[Acrobatics]] +5, [[Athletics]] +5 (+13 when climbing), [[Bluff]] +10, [[Disguise]] +10, [[Stealth]] +10
* ''Languages'' Common (can't speak); shortwave 100 ft.
* ''Other Abilities'' [[unliving]]
!!! ECOLOGY
* ''Environment'' any (Aballon)
* ''Organization'' solitary or flock (2–12)
!!! SPECIAL ABILITIES
''Concealed Weaponry ([[Ex]])'' An anacite dustar can project a whirling and serrated edge around their circular frame and conceal their polishing laser within their carapace. When not in use, these weapons are hidden from sight. A creature unaware of the dustar's concealed weaponry must succeed at a DC 16 [[Perception]] check to notice them. The anacite can deploy or retract one of these weapons as a swift action or as part of making an attack or full attack with it. The anacite can't be disarmed of such a weapon, but while deployed, the retractable weapon can be [[sundered]] as an item with a level equal to the dustar's CR.
''Innocuous Trick ([[Ex]])'' An anacite dustar looks like a simple housecleaning tool, but is actually programmed to ambush intruders. As a full action, an anacite dustar can move up to their speed and then make an attack with one of their concealed weapons. After their movement, the dustar can attempt a [[Bluff]] check opposed by their target's [[Perception]] check; if the dustar is successful, their target is [[flat-footed]] against the attack and takes 1d4 additional damage on a hit.
''Light Dependency ([[Ex]])'' An anacite dustar can acquire power from dim or brighter light, and can store power generated in this way. The dustar can operate in darkness for 2 hours. After this time, the dustar gains the [[sickened]] condition until they return to an area of dim or brighter light.
''Polishing Laser ([[Ex]])'' The anacite dustar's pop-up laser is ostensibly used to polish metals as the dustar goes about their rounds, but can be lethal. The polishing laser has a range increment of 30 feet.
''Shortwave ([[Ex]])'' An anacite can communicate wirelessly. This ability acts as [[telepathy]], but only with other creatures with the shortwave ability or constructs with the technological subtype.
</div>
Anacites are truthful and peaceful by nature, but are surprisingly capable of deception or violence when necessary, especially when confronted by organic intruders from beyond Aballon. To safeguard their businesses, factories, homes, and public buildings, anacites developed the dustar.
These small constructs have domed shells and glide silently across the floor on dozens of tiny legs concealed beneath their carapace. Every day, they go about their work: sweeping floors and walls, sucking up dirt with tiny vacuums mounted on their underside, and disintegrating this debris in a specialized internal chamber. They even polish glass, metal, and other materials with a simple pop-up laser—but every anacite dustar is also a hidden spy and potential assassin. Typically communicating with higher-ranking anacites, such as [[monitors|Anacite Monitor]] or [[ambassadors|Anacite Ambassador]], the dustar keeps an eye on non-anacite visitors while pretending to be a simple cleaning robot. When intruders threaten to trespass into sensitive areas, the dustar doesn't issue a warning, which would blow their cover. Instead, they inform other anacites of the danger, coordinate with other dustars within communication range, and lay a trap to exterminate the threat.
This heavy weapon was designed by Aballonian law-enforcement agencies for capturing criminal constructs without completely destroying them.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|Anacite ion cannon, static | 3 | 1,550 | 1d10 E | 20 ft. | [[stagger]] | 20 charges | 2 | 2 |[[line]], [[lockdown]], [[unwieldy]] |
|Anacite ion cannon, aurora | 8 | 10,900 | 2d10 E | 45 ft. | [[stagger]] | 40 charges | 4 | 2 |[[line]], [[lockdown]], [[unwieldy]] |
|Anacite ion cannon, storm | 13 | 52,900 | 4d10 E | 75 ft. | [[stagger]] | 80 charges | 5 | 2 |[[line]], [[lockdown]], [[unwieldy]] |
|Anacite ion cannon, tempest | 18 | 441,000 | 6d10 E | 100 ft. | [[stagger]] | 100 charges | 10 | 2 |[[line]], [[lockdown]], [[unwieldy]] |
</div>
<div class="statblock">
* ''CR'' 7; ''XP'' 3,200
* LN Medium construct (technological)
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +19
!!! DEFENSE
* ''HP'' 100
* ''EAC'' 19; ''KAC'' 20
* ''Fort'' +4; ''Ref'' +4; ''Will'' +8
* ''Immunities'' [[construct immunities]]
* ''Weaknesses'' sunlight dependency
!!! OFFENSE
* ''Speed'' 40 ft.
* ''Melee'' plasma cutter +16 (1d8+12 F)
* ''Ranged'' electrical burst +14 (1d8+7 E)
!!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' —; ''Int'' +4; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Computers]] +19, [[Engineering]] +19, [[Piloting]] +14, [[Stealth]] +14
* ''Languages'' Common; shortwave 100 ft.
* ''Other Abilities'' reconfigure, [[unliving]]
!!! ECOLOGY
* ''Environment'' any (Aballon)
* ''Organization'' solitary, pair, or crew (3–8)
!!! SPECIAL ABILITIES
''Reconfigure ([[Ex]])'' Anacite laborers are capable of adapting and improving their designs. An anacite laborer has a number of built-in abilities equal to its CR divided by 3 (minimum 1), chosen from the list below. An anacite laborer can change these abilities by spending 1 uninterrupted hour for each ability it wants to change. The anacite laborer must also have access to an appropriate workspace for the duration. An ability can be gained only once unless stated otherwise. In addition, modifications other than those listed here might exist.
@@.special
* Advanced treads that increase its base speed to 60 feet.
* A sensor that grants [[blindsight]] (vibration) 120 feet.
* Elongated arms that extend its [[reach]] by 5 feet.
* A modified chassis that grants a burrow, climb, or swim speed equal to its base speed. This ability can be taken multiple times. Its effects do not stack. Each time it is taken, it applies to a new movement type.
* Reinforced systems granting [[resistance]] 10 against a single energy type (acid, cold, electricity, fire, or sonic). This ability can be taken multiple times. Its effects do not stack. Each time it is taken, it applies to a new energy type.
* Specialized plating that increases its AC by 2.
@@
''Shortwave ([[Ex]])'' An anacite can communicate wirelessly. This acts as [[telepathy]], but only with other creatures with this ability or constructs with the technological subtype.
''Sunlight Dependency ([[Ex]])'' Anacites are solar-powered constructs, although they can function at reduced capacity away from light. In areas of darkness, they gain the [[sickened]] condition.
</div>
The most common design for anacites is a basic arthropodan form of silvery metal, with multiple legs for efficient travel and claws or manipulators for accomplishing their assigned tasks. Depending on their role, however, an anacite might be anything from a bulldozer-sized mining specialist to a floating electronic brain designed for advanced problem-solving, and even those anacites who fit the stereotypical metal-insect design usually have a modification or two, and almost all anacites can reconfigure parts of themselves to adapt to their circumstances.
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* N Large construct (technological)
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +13
!!! DEFENSE
* ''HP'' 40
* ''EAC'' 14; ''KAC'' 16
* ''Fort +3''; ''Ref'' +3; ''Will'' +0
* ''Immunities'' [[construct immunities]]
* ''Weaknesses'' light dependency
!!! OFFENSE
* ''Speed'' 40 ft, fly 60 ft. ([[Ex]], perfect)
* ''Melee'' arm slash +9 (1d6+8 S)
* ''Ranged'' electric ray +12 (1d4+3 E; critical [[arc]] 1d6)
* ''Multiattack'' 4 electric rays +6 (1d4+3 E; critical [[arc]] 1d6)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
!!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' —; ''Int'' +1; ''Wis'' +1; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +8 (+16 to fly), [[Intimidate]] +8, [[Stealth]] +13
* ''Languages'' Common; shortwave 120 ft.
* ''Other Abilities'' chameleon circuit, [[unliving]]
!!! ECOLOGY
* ''Environment'' any (Aballon)
* ''Organization'' solitary, pair, or squadron (3–6)
!!! SPECIAL ABILITIES
''Chameleon Circuit ([[Ex]])'' An anacite monitor can fade into the background by assuming the colors around them. When an anacite monitor remains stationary for 1 round, they gain a +10 circumstance bonus to [[Stealth]] checks. If they take any action, they lose this bonus until they once again spend 1 round remaining stationary.
''Electric Ray ([[Ex]])'' An anacite monitor can fire electric rays from the pods on the side of their head. These rays have a range increment of 60 feet.
''Light Dependency ([[Ex]])'' An anacite monitor can acquire power from dim or brighter light, and can store power generated in this way. The monitor can operate in darkness for 2 hours. After this time, the monitor gains the [[sickened]] condition until they return to an area of dim or brighter light.
''Shortwave ([[Ex]])'' An anacite can communicate wirelessly. This acts as [[telepathy]], but only with other creatures with the shortwave ability or constructs with the technological subtype.
</div>
Monitors are one of the many specialized forms of intelligent anacites. They provide unobtrusive security wherever anacites anticipate physical violence but also desire to avoid an overt display of force. It is not unusual for anacite [[ambassadors|Anacite Ambassador]] to be assigned a pair of monitors as guards, for example, and anacite facilities with a large number of non-anacite visitors or employees—such as the Horse Eye Orbital Plate—are home to many of these silent, nearly-invisible warriors. A single monitor is often given authority over security in a given facility; there, they maintain shortwave communication with nearby anacites, extending the monitor's surveillance range and ability to observe threats. If necessary, the monitor can even direct nearby anacites to intercept security threats. An anacite monitor is mantis-like in shape, with two delicate-looking wings, six long legs, and a distinctive triangular head. Although they have the same unusual eye pattern that all anacites share, the monitor is further equipped with rotating pods on the side of their head, each armed with a deadly electric ray. Despite their large size, they are also surprisingly agile, with two powerful forelegs that end in slashing edges. A monitor's natural armor is burnished red, but through the use of their chameleon circuits, the anacite monitor can adopt any color or hue, making them surprisingly stealthy.
<div class="statblock">
* ''CR'' 10; ''XP'' 9,600
* LN Large construct (technological)
* ''Init'' +5; ''Senses'' [[blindsight]] (heat) 60 ft., [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +19
!!! DEFENSE
* ''HP'' 165
* ''EAC'' 23; ''KAC'' 25
* ''Fort'' +10; ''Ref'' +10; ''Will'' +7
* ''Defensive Abilities'' [[integrated weapons]]; ''Immunities'' [[construct immunities]]
* ''Weaknesses'' sunlight dependency
!!! OFFENSE
* ''Speed'' 30 ft., fly 60 ft. ([[Ex]], perfect)
* ''Melee'' horn +23 (2d10+18 P)
* ''Ranged'' integrated automatic laser +20 (4d4+10 F; critical [[burn]] 2d4) or integrated electric ray +20 (3d6+10 E; critical [[arc]] 2d6)
* ''Space'' 10 ft.; ''Reach'' 5 ft.
* ''Offensive Abilities'' target lock
!!! STATISTICS
* ''Str'' +8; ''Dex'' +5; ''Con'' —; ''Int'' +0; ''Wis'' +3; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +19 (+27 to fly), [[Athletics]] +24, [[Stealth]] +19
* ''Languages'' Common; shortwave 100 ft.
* ''Other Abilities'' [[tracking]] (heat), [[unliving]]
!!! ECOLOGY
* ''Environment'' any (Aballon)
* ''Organization'' solitary, pair, or squadron (3–6)
!!! SPECIAL ABILITIES
''Automatic Laser ([[Ex]])'' An anacite predator drone's automatic laser can fire in automatic mode each round at up to five targets. The weapon has a range increment of 60 feet.
''Electric Ray ([[Ex]])'' An anacite predator drone's electric ray has a range increment of 60 feet.
''Shortwave ([[Ex]])'' An anacite can communicate wirelessly. This acts as [[telepathy]], but only with other creatures with this ability or constructs with the technological subtype.
''Sunlight Dependency ([[Ex]])'' Anacites are solar-powered constructs, although they can function at reduced capacity away from light. In areas of darkness, they gain the [[sickened]] condition.
''Target Lock ([[Ex]])'' As a move action, an anacite predator drone can lock on to a target within 60 feet that it can see. The anacite can have only one locked target at a time. Against the anacite's attacks, a locked target gains no benefit from concealment less than total concealment, and a locked target reduces its bonus to AC due to cover by 2.
</div>
An anacite predator drone resembles a rhinoceros beetle made of silvery metal with a reddish shell that opens to reveal enormous wings. The drone's weapons are part of its body, leaving its wings and appendages free. Countless drones police the megaplexes of Aballon. Others serve as soldiers for anacites that have greater authority, fighting in places such as the Midnight Trenches.
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* LN Large construct (technological)
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +18
!!! DEFENSE
* ''HP'' 80
* ''EAC'' 18; ''KAC'' 19
* ''Fort'' +3; ''Ref'' +3; ''Will'' +7
* ''Immunities'' [[construct immunities]]
* ''Weaknesses'' light dependency
!!! OFFENSE
* ''Speed'' 40 ft., climb 30 ft.
* ''Melee'' pincer +13 (1d4+8 P) or slam +13 (1d6+8 B; critical [[push]] [5 ft.])
* ''Multiattack'' 3 pincers +7 (1d4+8 P)
* ''Ranged'' precision laser +15 (1d6+6 F; critical [[burn]] 1d4)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' assess variable
!!! STATISTICS
* ''Str'' +2; ''Dex'' +2; ''Con'' —; ''Int'' +5; ''Wis'' +3; ''Cha'' +1
* ''Skills'' [[Computers]] +18, [[Culture]] +13, [[Engineering]] +13, [[Life Science]] +13, [[Physical Science]] +18, [[Sense Motive]] +18
* ''Languages'' Common, up to 5 others; shortwave 100 ft.
* ''Other Abilities'' calculate outcome, [[unliving]]
!!! ECOLOGY
* ''Environment'' any (Aballon)
* ''Organization'' solitary, pair, or sum (3–9)
!!! SPECIAL ABILITIES
''Assess Variable ([[Ex]])'' As a move action, an anacite quantifier can assess a target within 60 feet that it can see. The quantifier gains a +1 circumstance bonus to attack rolls against the assessed target and a +2 circumstance bonus to EAC and KAC against the assessed target. The quantifier can have only one assessed target at a time.
''Calculate Outcome ([[Ex]])'' An anacite quantifier constantly calculates the most efficient course of action, considering countless variables. A quantifier can take 10 on any skill check, even during combat or if stress or distractions would normally prevent it from doing so. In addition, once per day, a quantifier can reroll a failed ability check, attack roll, or saving throw.
''Light Dependency ([[Ex]])'' An anacite quantifier can acquire power from dim or brighter light, and it can store power generated in this way. The anacite can operate in darkness for 2 hours. After this time, hours. After this time, the anacite gains the [[sickened]] condition until it returns to an area of dim or brighter light.
''Precision Laser ([[Ex]])'' An anacite quantifier’s precision laser has a range increment of 90 feet.
''Shortwave ([[Ex]])'' An anacite can communicate wirelessly. This acts as [[telepathy]], but only with other creatures with this ability or constructs with the technological subtype.
</div>
Anacite quantifiers are the assessors of Aballon. They quantify the odds of success and try to determine all potential outcomes, constantly estimating potential risk, reward, and payoff for myriad situations, from the viability of a new technology or policy to the financial success of stocks. Incredibly intelligent and quick thinkers, quantifiers perform advanced mathematical calculations and statistical analyses in fractions of a second. They use these calculations and assessments to determine potential outcomes in the physical world, digital spaces, cultural paradigms, and biological behavior.
Quantifiers are similar in shape to a praying mantis, with an enlarged cranial cavity and four dexterous pincers. The majority of them work in governance, determining the potential outcomes of proposals and policies, but others guide planetary economics and investments or even serve as bookies.
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* LN Tiny construct (technological)
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +13
!!! DEFENSE
* ''HP'' 30
* ''EAC'' 14; ''KAC'' 15
* ''Fort'' +0; ''Ref'' +2; ''Will'' +4
* ''Defensive Abilities'' chameleon circuit, [[integrated weapons]]; ''Immunities'' [[construct immunities]]
* ''Weaknesses'' sunlight dependency
!!! OFFENSE
* ''Speed'' fly 40 ft. ([[Ex]], perfect)
* ''Melee'' slam +6 (1d4+1 B)
* ''Ranged'' integrated frost [[subduer]] +9 (1d3+3 C [[nonlethal]]; critical [[stagger]])
* ''Offensive Abilities'' combined blast
!!! STATISTICS
* ''Str'' –2; ''Dex'' +4; ''Con'' —; ''Int'' +1; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +13, [[Computers]] +13, [[Engineering]] +8, [[Sense Motive]] +8, [[Stealth]] +13
* ''Languages'' Common; shortwave 100 ft.
* ''Other Abilities'' remote alert, [[unliving]]
* ''Gear'' frost [[subduer]] with 2 batteries (20 charges each)
!!! ECOLOGY
* ''Environment'' any (Aballon)
* ''Organization'' solitary, trio, or brigade (4–9)
!!! SPECIAL ABILITIES
''Chameleon Circuit ([[Ex]])'' An anacite sentry can fade into the background by assuming the colors around it. When an anacite sentry remains stationary for 1 round, it gains a +10 circumstance bonus to [[Stealth]] checks. If it takes any action, it loses this bonus until it once again spends 1 round remaining stationary.
''Combined Blast ([[Ex]])'' An anacite sentry can ready an action to fire its ranged weapon at the same time and at the same target as another anacite sentry within 10 feet. If at least two anacite sentries delay in this manner, the main sentry anacite can unleash a single powerful shot as a full action. Each attacking sentry makes a ranged attack roll against the target's EAC. If any of the attack rolls hit, the target takes 1d4+3 nonlethal cold damage per attacking anacite sentry. This is treated as a single attack for the purposes of energy resistance and critical hits. If all the attacks hit, the target must succeed at a DC 14 Fortitude save or be [[staggered]] for 1 round.
''Remote Alert ([[Ex]])'' Using wireless signals, an anacite sentry can activate a technological alarm system within 100 feet as a standard action. For example, it could set off an alarm keyed to a door or a security system that will sound throughout a facility. It can't activate magical alarms, nor can it activate traps or hazards this way. If the system the sentry is attempting to activate has been disabled, this ability fails.
''Shortwave (Ex)'' Anacites can communicate wirelessly. This acts as [[telepathy]], but only with other creatures with this ability or constructs with the technological subtype.
''Sunlight Dependency ([[Ex]])'' Anacites are solar-powered constructs, although they can function at reduced capacity away from light. In areas of darkness, they gain the [[sickened]] condition.
</div>
Anacite sentries are small, sentient constructs with spheroid bodies and metal-feathered wings. Due to their small size and chameleon circuits, these anacites are adept at blending into their surroundings. Although physically unimposing on their own, they're highly cooperative and pose a threat in groups. The vast majority of anacite sentries are adherents of Those Who Wait, viewing their guard duties as a personal and private version of their eventual purpose.
<div class="statblock">
* ''CR'' 1/2; ''XP'' 200
* N Small construct (technological)
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +4
!!! DEFENSE
* ''HP'' 13
* ''EAC'' 10; ''KAC'' 12
* ''Fort'' +0; ''Ref'' +0; ''Will'' –2
* ''Immunities'' [[construct immunities]]
* ''Weaknesses'' sunlight dependency
!!! OFFENSE
* ''Speed'' 40 ft., fly 40 ft. ([[Ex]], average)
* ''Melee'' bite +4 (1d6+2 P)
* ''Ranged'' laser ray +7 (1d4 F; critical [[burn]] 1d4)
* ''Offensive Abilities'' trill
!!! STATISTICS
* ''Str'' +2; ''Dex'' +3; ''Con'' —; ''Int'' –5; ''Wis'' +1; ''Cha'' –2
* ''Skills'' [[Athletics]] +9 (+17 when climbing), [[Stealth]] +4
* ''Languages'' Common (can't speak); shortwave 100 ft.
* ''Other Abilities'' [[unliving]]
!!! ECOLOGY
* ''Environment'' any (Aballon)
* ''Organization'' solitary or flock (2–6)
!!! SPECIAL ABILITIES
''Shortwave ([[Ex]])'' An anacite can communicate wirelessly. This acts as [[telepathy]], but only with other creatures with this ability or constructs with the technological subtype.
''Sunlight Dependency ([[Ex]])'' Anacites are solar-powered constructs, although they can function at reduced capacity away from light. In areas of darkness, they gain the [[sickened]] condition.
''Trill'' ([[Ex]]) An anacite wingbot can create a shrill trilling noise as a standard action. Any creature within 30 feet, other than anacite wingbots, must succeed at a DC 9 Fortitude saving throw or be sickened for 1d3 rounds. Whether successful or not, a creature can't be affected by the same anacite wingbot's trill for 24 hours.
</div>
While "[[anacite]]" officially refers only to the sentient varieties of Aballonian machines—those capable of learning and participating in Aballonian society—many offworlders use it as a catchall term for the world's mechanical life. Dragonfly-like wingbots are an example of Aballonian technobiology. These artificial creatures lack basic sentience yet nevertheless reproduce and fill one of the planet's ecological niches. These 4-foot-long machines whir from ridge to ridge on wings glittering with solar panels, feeding on the blazing light of the sun. Wingbots can be territorial, and they occasionally attack offworlders or other anacites.
Anacites are native to Aballon, the Pact World closest to the sun. A race of machines left behind by eons-departed masters, these constructs developed the capacity for evolution and self-improvement, creating an entire mechanical ecosystem.
In the uncounted millennia since the departure of the so-called "First Ones," anacites have not been idle. The two primary factions of anacites, Those Who Wait and Those Who Become, have very different ideas of their purpose in life, yet the two are more alike than different. While they variously wait for the First Ones to return or work toward taking on their progenitors' mantle, anacites endlessly strive to acquire wealth and influence in preparation for their great goal's fulfillment.
Anacites have varied general designs, but some have evolved for specialized tasks.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
!! Anacite Powered Armor
Arms manufacturers in the Aballonian megaplex of Pursuit produce powered armor that mimics the versatile and customizable capabilities of [[anacite laborers]]. Anacites who subscribe to the philosophy of Those Who Become promote this powered armor as a good way for non-anacites to experience the superiority of the constructed form.
{{Laborer Frame}}
An analgesic deadens sensory input and is used by medical professionals to reduce sensations of pain. If you take or are injected with an analgesic, you are [[flat-footed]] for 1 round per tier of the medicinal. You also gain a bonus (equal to the analgesic's tier) to saving throws against pain effects for 10 minutes per tier of the medicinal.
This weapon does not use any advanced electronics, computer systems, or electrical power sources. It is immune to abilities that target technology. While this use of the word "analog" is not technically correct when referring to technology, use of the term in this way has become common.
You have been taught to carefully consider your own assumptions, making it much less likely you assign false motives to other creatures. When using [[Sense Motive]] to [[detect deception]] or [[discern a secret message]], as long as your [[expertise]] die roll result is not a 1, you don't think a truthful statement contains deceptions or infer false information from a secret message even if you fail your check by 5 or more.
Whenever you attempt a [[Culture]] check as part of your stunt and strike and succeed, you can learn one of the following pieces of information about the target, plus one additional piece of information for every 5 by which your check's result exceeds the DC: archetypes*, class*, class features*, first language, place of origin, spells known*, or training in a [[Profession]] skill. For items marked with an asterisk (*), if the target has more than one of these features, each one you discover counts as one piece of information.
With time and a physical sample, you can learn a great deal.
''Activity:'' You spend the day analyzing a physical sample of a creature or material. The sample must have at least light bulk, and you must have access to a science lab or similar facilities for the whole day.
''Results:'' You learn information about the creature or material as if you had taken 20 on a skill check to identify it, using the appropriate skill for its creature type if it's a creature, [[Engineering]] if it's a technological or hybrid item, or [[Mysticism]] if it's a magic or hybrid item. You must be trained in the appropriate skill or you gain no benefit. The GM might rule that certain creatures or materials are too rare or unusual to be identified this way.
''Multiday:'' For each consecutive day you spend on this downtime activity, you gain a cumulative +1 circumstance bonus to your check, up to a maximum of +5.
The //anarchic// fusion imbues a weapon with divine energy from a chaotic deity. Any attacks with the weapon are chaotic-aligned. Damage from the weapon bypasses [[DR]]/chaotic and ignores the [[energy resistance]] of lawful dragons and lawful outsiders. The //anarchic// fusion can't be added to weapons that have the //[[axiomatic]]// fusion.
Anassanois are native to a distant star, Anassan, which they left in a generation ship named the Kahlannal. The typical anassanoi is staunchly loyal, sympathetic, and effusive with friends. However, by human standards, anassanoi body language and facial expressions lack animation and emotion, despite the fact that an anassnoi has three eyes and two (vertical) mouths. Anassanois are natural telepaths and extremely open when communicating with telepathy, suffusing such exchanges with the feelings their physical gestures lack. This openness translates into emotional honesty, offering others a ready sense of who the speaking anassanoi is. An anassanoi who wants to avoid this openness can learn to suppress it by becoming practiced in deception, but few anassanois do so. A typical anassanoi stands almost 8 feet tall but is slender, weighing around 200 pounds. They mature at about age 25 and live for around 150 years.
!! Racial Traits
* ''Ability Adjustments:'' +2 Wis, +2 Cha, –2 Con
* ''Hit Points:'' 4
* ''Size and Type:'' Anassanois are Medium humanoids with the anassanoi subtype.
* ''Blindsense:'' Anassanois can sense thinking creatures with a range of 30 feet. They cannot sense [[mindless]] creatures or those immune to mind-affecting magic with this awareness.
* ''Low-Light Blindness:'' Anassanois treat dim light as if it were darkness.
* ''Open:'' Other creatures receive a +6 bonus to [[Sense Motive]] checks against an anassanoi who is using telepathy to communicate with them. Anassanois gain a +2 bonus to [[Diplomacy]] checks when using telepathy to communicate.
* ''Telepathy:'' Anassanois have [[telepathy]] with a range of 30 feet.
* ''Third Eye:'' Anassanois gain a +2 racial bonus to [[Perception]] and [[Sense Motive]] checks.
Stone statuettes representing ancestors feature regularly in traditional maraquoi spirituality, serving as a conduit for deceased family to commune with the living. Some maraquoi have put a new twist on this tradition by creating drones to represent the ancestors instead. An //ancestor drone// is a Tiny, maraquoi-shaped [[domestic drone]] that functions as the hover drone of a 1st-level mechanic with no drone mods. The drone features a small display screen in its chest, typically showing a curated array of short videos and images of several ancestors. Once per day, you can ritually pose a question to the //ancestor drone//, which channels fragmented wisdom from your departed family to answer you; this functions as //[[augury]]// but doesn’t require spending Resolve Points.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//ancestor drone// | 7 | 6,500 | 4 |
</div>
<div class="statblock">
* <<levels>>
* ''School'' conjuration (summoning)
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' immobile object
* ''Duration'' 10 minutes/level (D)
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You conjure and attach a cable to an immobile object. When the spell ends, the cable returns to where it was summoned from. The cable has hardness 8, 8 Hit Points, and a length equal to the spell’s range. The cable can be pried free with an [[Athletics]] check equal to the spell’s DC. If the cable becomes unanchored or destroyed, the spell ends.
Blasts from this electromagnetic pistol create a magnetic field that hampers a foe's movement. Barathus working on Liavara developed these weapons, as the magnetic fields ensnare a target without causing it to fall—a useful feature when confronting the operators of illicit harvesting endeavors on a gas giant. Many parts of an anchor pistol are grown from living organisms, resulting in a lightweight pistol that gleams like mother-of-pearl. Voltaic anchor pistols employ typical electromagnetism, while the emergent and inductive anchor pistols use higher symmetries to produce aperiodic force. The flux anchor pistol relies on quantum-phase factors to generate extraordinarily powerful blasts.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|anchor pistol, voltaic | 4 | 2,100 | 1d6 E | 40 ft. | [[bind]] | 40 charges | 2 | L |[[nonlethal]] |
|anchor pistol, emergent | 9 | 13,200 | 2d6 E | 40 ft. | [[bind]] | 40 charges | 4 | L |[[nonlethal]] |
|anchor pistol, inductive | 15 | 108,000 | 4d6 E | 40 ft. | [[bind]] | 80 charges | 4 | L |[[nonlethal]] |
|anchor pistol, flux | 20 | 814,000 | 8d6 E | 60 ft. | [[bind]] | 80 charges | 5 | L |[[nonlethal]] |
</div>
A pair of well-articulated chitinous limbs bolstered with djezet alloy is fastened to your torso, usually near the pelvis or a similar anchor point. Your insectile arms function as additional normal limbs; you can use them to hold additional equipment, but they don't increase the number of attacks you can make in combat. The djezet alloy infused into the chitin fibers bores into your nervous system and increases your caster level by 1 when you're determining the range and duration of your spells and for caster level checks. This benefit doesn't stack with the benefit from djezet-enhanced armor.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|//anchored arms// | 16 | 170,700 | spinal column |
</div>
Your nanites are accustomed to maintaining their position regardless of external pressure and motion. Spaces occupied by your [[cloud array]] are difficult terrain.
A weapon with this special property fires ammunition tethered to a powerful chain, anchoring the attacking starship to its target. While anchored to each other, neither starship can move farther away from each other than the range at which the anchoring weapon was initially fired. While a starship is anchored and adjacent to its target, its crew can attempt to [[board|Boarding]] the anchored starship at the end of the starship combat round. An anchoring weapon can't be used to make additional attacks or anchor other vessels if it's currently being used to anchor a target.
As a special engineer action, an engineer can attempt to sever or dislodge another starship's anchor with an [[Engineering]] check (DC = 15 + 1-1/2 × the anchoring starship's tier). If they succeed, the effects of the anchoring weapon special property end. As a special stunt, a pilot can attempt to shake free of an anchor with a [[Piloting]] check at the same DC. If they succeed, the effects of the anchoring weapon special property end and the starship moves up to half its speed. If they fail, the starship moves in a straight line, though no farther than the range allowed by the anchoring weapon.
A starship's gunner or engineer can detach any number of their own weapons' anchors as a minor crew action.
A weapon with the //anchoring// fusion has a chance to immobilize its targets. The weapon gains [[immobilization]] as a critical hit effect. If the weapon already has a critical hit effect, choose each time whether to apply the weapon's normal critical hit effect or the immobilization effect.
{{Immobilization}}
As a full action, you can make a single attack with a magic weapon against a single foe. If the attack is a ranged attack, the target must be within the first range increment. Even if the attack normally affects an area or multiple targets, it affects only your selected target. If your attack hits, you can spend 1 Resolve Point to force the target to attempt a Will saving throw (DC = 10 + half your soldier level + your key ability score modifier). If the target fails its save, it can't voluntarily move from its current space for 1d4 rounds. This has no effect on involuntary movement, but it does prevent the creature from teleporting or moving to another plane. Once you've struck a foe with this attack, whether it succeeds at or fails its saving throw, it is immune to this ability for 24 hours.
<div class="statblock">
* ''CR'' 5; ''XP'' 1,600
* N Large plant
* ''Init'' +5; ''Senses'' [[low-light vision]]; ''Perception'' +11
!!! DEFENSE
* ''HP'' 70
* ''EAC'' 17; ''KAC'' 19
* ''Fort'' +9; ''Ref'' +7; ''Will'' +4
* ''Immunities'' [[plant immunities]]; ''Resistances'' fire 10
!!! OFFENSE
* ''Speed'' 10 ft., climb 10 ft.
* ''Ranged'' laser spines +14 (1d4+5 F; critical [[burn]] 1d4 F)
!!! STATISTICS
* ''Str'' +2; ''Dex'' +5; ''Con'' +3; ''Int'' –4; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +11, [[Athletics]] +11 (+19 to climb), [[Survival]] +16
* ''Other Abilities'' dye capsules, [[mindless]]
!!! ECOLOGY
* ''Environment'' temperate and warm forests
* ''Organization'' solitary or colony (3–8)
!!! SPECIAL ABILITIES
''Dye Capsules ([[Ex]])'' See [[lumocantha]]; the dye deals 2d4 acid damage and the Reflex save is DC 13.
''Laser Spines ([[Ex]])'' See [[lumocantha]]; as a full action, the ancient lumocantha can attack three
times with its laser spines with a –6 penalty to each attack.
</div>
Complex technological creations crafted to resemble humans, androids were originally a servitor race, but they have since broken free to form their own society. Unlike ordinary robots or ship AIs, androids do not simply respond according to their programming; rather, they have independent consciousnesses and are animated by souls—a distinction crucial to their generally accepted status as people rather than property.
!! Racial Traits
* ''Ability Adjustments:'' +2 Dex, +2 Int, –2 Cha
* ''Hit Points:'' 4
* ''Size and Type:'' Androids are Medium humanoids with the android subtype.
* ''Constructed:'' For effects targeting creatures by type, androids count as both constructs and humanoids (whichever type allows an ability to affect them for abilities that affect only one type, and whichever is worse for abilities that affect both types). They receive a +2 racial bonus to saving throws against disease, mind-affecting effects, poison, and sleep, unless those effects specifically target constructs. In addition, androids do not breathe or suffer the normal environmental effects of being in a vacuum.
* ''Exceptional Vision:'' Androids have [[low-light vision]] and [[darkvision]]. As a result, they can see in dim light as if it were normal light, and they can see with no light source at all to a range of 60 feet in black and white only.
* ''Flat Affect:'' Androids find emotions confusing and keep them bottled up. They take a –2 penalty to [[Sense Motive]] checks, but the DCs of Sense Motive checks attempted against them increase by 2.
* ''Upgrade Slot:'' Androids have a single armor upgrade slot in their bodies. Regardless of whether androids are wearing physical armor, they can use this slot to install any one armor upgrade that could be installed into light armor.
!!! Alternate Ability Adjustments
* ''Companion:'' A niche but lucrative market before android emancipation was the construction of androids to serve as companions, often as supplemental members of a family. These androids have better personality matrices and might have fewer signs of artificial construction. A companion android has an ability adjustment of +2 Charisma.
* ''Laborer:'' Laborer androids were created to perform menial tasks and endure the hardships of space. In many regions, they were considered corporate property for far longer than typical androids. A laborer android's ability adjustments are +2 Strength, +2 Constitution, and −2 Charisma.
!!! Alternate Racial Traits
* ''Easily Augmented:'' As artificial creatures, androids are compatible with a wide array of cybernetics. Androids who have this racial trait can install one additional cybernetic augmentation into one system that already has an augmentation. This replaces upgrade slot.
* ''Impersonation Matrix:'' Although most androids stand out as artificial beings, some have intricate personality matrices and physical alterations that downplay their constructed nature. Androids who have this alternate racial trait don't take any penalty to [[Disguise]] checks to change their appearance to a creature of a different race or type if they are disguising themselves as a human. If the android also has the xenometric android alternate racial trait (see below), this benefit instead applies to Disguise checks to change appearance to that of the race chosen along with the xenometric android alternate racial trait. This replaces the +2 racial bonus to saving throws against disease, mind-affecting effects, poison, and sleep from the constructed trait. The android retains all the other features of the constructed trait.
* ''Infosphere Integration:'' The artificial brain an android possesses can allow better compatibility with infospheres and direct downloads of information. An android with this trait has a built-in [[comm unit]] that can be accessed without needing to use their hands. Once per day, whenever the android takes a 10-minute rest to regain Stamina Points, they can choose one Intelligence-, Wisdom-, or Charisma-based skill. The chosen skill becomes a class skill for them, and they gain [[Skill Focus]] as a bonus feat with that skill. This decision lasts until the next time the android uses this trait. This replaces exceptional vision.
* ''Multilingual:'' New languages are easy for some androids to learn. An android with this racial trait knows four additional languages at 1st level. In addition, whenever such an android invests a skill rank into [[Culture]], they learn two new languages instead of one. This replaces upgrade slot.
* ''Nanite Upgrade:'' Specialized nanites maintain an android body, but they can be upgraded to perform additional tasks. Androids who have this racial trait gain [[Nanite Integration]] as a bonus feat, ignoring the feat's Prerequisites. This replaces upgrade slot.
* ''Xenometric Android:'' Although most androids are manufactured to resemble humans, those crafted in the likenesses of other species exist. Such "xenometrics" possess abilities that mirror those of other races, sometimes even using hybrid tech to duplicate magic abilities. An android with this trait selects one of the species detailed in the table below. This choice cannot be changed. In addition to possessing physical features resembling those of the chosen species, the android's size categoryand reach changes to match the chosen race. In addition, xenometric androids gain some of the chosen species' racial traits, which are noted in parentheses next to the race's name. If a gained racial trait determines land speed, the android uses the speed as defined by that racial trait instead of that of the android. If the chosen species has a different type than humanoid, the xenometric android's type changes to match. This replaces upgrade slot and exceptional vision.
<div class="table-wrapper" style="margin-left:2em;">
|Race |Racial Traits Gained |h
|[[dwarf]] |darkvision, slow but steady |
|[[dragonkin]] |draconic immunities, flight |
|[[elf]] |elven immunities, low-light vision |
|[[formian]] |limited telepathy, natural weapons |
|[[gnome]] |gnome magic, low-light vision |
|[[haan]] |firespray, slow fall |
|[[half-elf]] |adaptability, low-light vision |
|[[half-orc]] |darkvision, intimidating, self-sufficient |
|[[halfling]] |keen senses, sneaky, sure-footed |
|[[hobgoblin]] |fearsome, sneaky |
|[[kalo]] |kalo movement, kalo vision |
|[[kasatha]] |four-armed, natural grace |
|[[lashunta]] |lashunta magic, limited telepathy |
|[[maraquoi]] |blindsense, prehensile tail |
|[[nuar]] |natural weapons, swift |
|[[orc]] |fierce survivalist, orc ferocity|
|[[pahtra]] |nimble, talented |
|[[shirren]] |blindsense, limited telepathy |
|[[strix]] |nightborn, strix mobility |
|[[verthani]] |skill focus, skin mimic |
|[[vesk]] |low-light vision, natural weapons |
|[[vlaka]] |cold resistance, perceptive |
|[[wrikreechee]] |snag, wrikreechee movement |
|[[ysoki]] |cheek pouches, darkvision |
</div>
!! Physical Description
Androids are biomechanical constructs created in technological crèches called foundries. While the first androids are believed to have been mostly biological, difficult to distinguish from the humans they lived among, modern designs are more varied, and many favor metal skeletons and processors that support synthetic organs and living flesh. Nearly all androids feature a humanoid body shape and tattoo-like circuits that glow through their skin when operating at full power, but beyond this commonality, variations in physical appearance reflect an android's design, role, and personality. Some take pains to blend into human society, while others deliberately display their mechanical nature. Though some androids are constructed or customize themselves to look like other races, such models are relatively rare. Due to their biological components, androids need to eat and sleep, but as constructed beings they do not reproduce in the human fashion and have no biological need for gender—some identify strongly as male or female, while others shift fluidly or ignore it altogether, and still others actively reject it on philosophical grounds as a relic of their former slavery.
Though android bodies are assembled using tiny machines called nanites, their complex nervous systems attract and integrate souls in the same way organic creatures do. Most androids are fully grown at the time of their birth, and can technically live forever through constant repair, though most androids voluntarily release their bodies after a century or so to allow new souls to inhabit them—a process called renewal that's viewed more as procreation than suicide.
!! Home World
Android technology in the Pact Worlds is generally believed to have developed on Golarion in the time before the Gap, though there are strong indications that the first androids there were actually travelers from a distant star system. In the modern era, various corporations throughout the Pact Worlds system unraveled the secret to android creation and began mass-producing androids as cheap, skilled labor perfect for hazardous work. This practice lasted until about 150 years ago, when the Thyst Rebellion and subsequent android revolts across the system, combined with the now legendary speech known as "The Automaton's Polemic" by android revolutionary Serphaeus-6, led governments system-wide to officially recognize all androids as independent citizens. This ruling, however, has not completely stopped unscrupulous corporations in less regulated parts of the system from crafting illegal android slaves or forcing newborn androids to "work off" the expense of their creation. Though androids can be found anywhere in the Pact Worlds, many gravitate toward cosmopolitan Absalom Station, the machine cities of Aballon, and the freedom of the Diaspora.
!! Society and Alignment
Android society tends to be insular. While androids are treated equitably in most settlements, especially Absalom Station, many androids have not forgotten their people's bondage and remain keenly aware of prejudice from other races based on their "unnatural" origin or jealousy over the androids' freedom from aging. This leads most androids to feel a sense of kinship with others of their kind and to go out of their way to help each other, though they may also bond with members of other races who treat them well. Despite popular belief, androids' impressive deductive reasoning abilities do not preclude sentiment, and most androids feel emotions keenly—they simply don't always express them well, and different individuals may have trouble processing and communicating particular feelings. The average android alignment is a practical neutrality; they are focused on their own welfare and that of their friends.
!! Relations
Often cautious around strangers, androids have the most strained relationship with [[humanity]], which built them in its image and remains their most frequent oppressor. They feel closest to [[shirrens]], who also know what it is to be enslaved and misunderstood, and respect [[kasathas]]' self-sufficiency. They generally dislike [[vesk]], whom they see as slavers, and only grudgingly tolerate [[ysoki]]'s antics.
!! Adventurers
Androids adventure for many reasons: to earn a living, trace the origins of their race, or rescue androids and other creatures from servitude. Their quick thinking under fire makes them natural operatives and soldiers, while their affinity for machines makes them excellent mechanics and technomancers.
!! Names
Androids have no single naming convention. Many take names from the cultures in which they first awoke, or from media they enjoy. Some accept call sign–like names based on appearance, personality, or exploits. Still others go by numbers as a deliberate reminder of their mechanical nature, or a combination of name and number denoting how many times the body their soul inhabits has been renewed. Some sample android names include Asha, Blue-17, Emene-3, Flick, Garro, Iseph, Melody, Naga, Olas, Stringer, Twenty, and Yose.
!! Upgrade Slot Graft
{{Upgrade Slot}}
Androids were recognized as free citizens of the Pact Worlds more than a century ago, but nefarious corporations, the Azlanti Star Empire, and other bad actors still conscript them into forced labor. Android abolitionists are freedom fighters dedicated to liberating such androids and combating the oppression of created peoples.
Only some who have this archetype are members of the Android Abolitionist Front, an organization dedicated to fighting against android slavery. Likewise, not all Android Abolitionist Front agents have this archetype. Individuals with this archetype who join the Android Abolitionist Front are secretly inducted into a clandestine cell of local liberators, who train new recruits in the subtle arts of infiltration, manipulation, and protection. Once ready, abolitionists infiltrate and disrupt android trafficking operations or free enslaved androids.
The android abolitionist grants alternate class features at 4th, 9th, and 18th levels.
!! Cunning Liberator (4th)
You understand the methods that android slavers use to track created peoples, and you have become adept at avoiding these villains. Whenever you attempt a [[Culture]] check to [[recall knowledge]] about a location where you're trying to lie low and avoid attention, reduce the DC by 5. Additionally, [[Bluff]] and [[Diplomacy]] are class skills for you. For each of these skills that are already class skills for you (or becomes a class skill for you) from a source other than this archetype, you can choose an additional class skill from among [[Disguise]], [[Intimidate]], [[Sense Motive]], [[Sleight of Hand]], [[Stealth]], and [[Survival]].
!! Abolitionist Aegis (9th)
Your guidance is instrumental in keeping others safe. As a move action, you can designate a creature as your ward. Once you do so, that creature remains your ward for the rest of the day, and you cannot designate a different creature as your ward for 24 hours. You can have only one ward at a time. Once per minute as a reaction to when your ward is adjacent to you and would take damage, you can expend 1 Resolve Point and grant your ward [[DR]] 10/— or [[resistance]] 10 against one energy damage type (acid, cold, electricity, fire, or sonic). This damage reduction or resistance is applicable only against the triggering attack and ends as soon as the damage from the triggering attack is resolved.
At 18th level, the amount of damage reduction or energy resistance this class feature grants increases to 15.
!! Traceless Persona (18th)
You are exceptional at masking your digital and physical appearance, and you can help your ward to do the same. Once per day, you can take 20 on an attempt to use [[Computers]] to [[create or detect a forgery|Create or Detect Forgery]]. Anyone attempting to use Computers to track the digital signature of you or your ward (if you have designated one using your abolitionist aegis class feature) must roll twice and use the lowest result when doing so.
This feature provides a number of other benefits. The DC for another creature to [[find or follow your tracks|Follow Tracks]] is 20 + 1-1/2 × your ranks in [[Stealth]] or [[Survival]] (your choice), no matter what circumstances, surfaces, or conditions you travel in. If you mask or cover allies' tracks, taking at least a full action to do so, this DC also applies to checks to find or follow those tracks. In addition, when you attempt a [[Disguise]] check to change your appearance, you can affect yourself and up to six allies. When you attempt to change your appearance and that of your allies, you can ignore DC modifiers for altering major features, being disguised as a different race of the same creature type, and being disguised as a different creature type.
<div class="statblock">
* ''CR'' 12; ''XP'' 19,200
* LN Fine construct (magical, technological; air, swarm)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +22
!!! DEFENSE
* ''HP'' 170
* ''EAC'' 25; ''KAC'' 26
* ''Fort'' +11; ''Ref'' +11; ''Will'' +15
* ''Defensive Abilities'' [[swarm defenses]]; ''Immunities'' [[construct immunities]], [[swarm immunities]]; ''Resistances'' acid 10
!!! OFFENSE
* ''Speed'' fly 60 ft. ([[Su]], perfect)
* ''Melee'' [[swarm attack]] (1d12+16 B & E)
* ''Ranged'' electroshock +21 (2d8+12 E)
* ''Spell-like Abilities'' (CL 12th)
** 1/day—//[[corrosive haze]]//, //[[destruction protocol]]//
** 3/day—[[infect blood]], //[[nanite form]]//
** At will—//[[know coordinates]]//, //[[smog bank]]// , //[[manipulate tech]]//
* ''Space'' 10 ft.; ''Reach'' 0 ft.
* ''Offensive Abilities'' [[distraction]] (DC 21)
!!! STATISTICS
* ''Str'' +4; ''Dex'' +5; ''Con'' —; ''Int'' —; ''Wis'' +8; ''Cha'' —
* ''Skills'' [[Acrobatics]] +27 (+35 to fly), [[Stealth]] +22
* ''Other'' [[mindless]], polymorphic defragmentation, reconstruction protocol, [[unliving]]
!!! ECOLOGY
''Environment'' Weydana-6
''Organization'' solitary
!!! SPECIAL ABILITIES
''Polymorphic Defragmentation ([[Ex]])'' An anemonite communicant breaks down and reconstructs its victims
in simpler, condensed forms. When an anemonite communicant kills a creature, the creature’s corpse disappears into the swarm. One round later, the anemonite communicant leaves behind a single cube of undifferentiated matter that includes all the material once found in that creature, including all its possessions.
''Reconstruction Protocol ([[Ex]])'' A communicant retains data records of all the creatures it has killed. A character with a custom rig or computer with a range upgrade can attempt to hack the communicant to recreate creatures it has slain. The hacker must take a full action and succeed at a DC 33 [[Computers]] check; on a failure, the hacker activates the communicant’s defense protocols, and the swarm moves toward the hacker as quickly as possible, targeting them with its attacks and spell-like abilities in an attempt to destroy them. On a success, the last creature slain by the communicant and not already reconstructed is returned to life in a space adjacent to the communicant, as if subjected to the //[[raise dead]]// spell.
</div>
Anemonites are nanomachines that ride the preprogrammed storms of Weydana-6 in swarms called communicants. These nanomachines maintain Weydana-6’s dormant computer, defragmenting errant data worldwide and cataloging that data. Unfortunately for travelers exploring the mystery of Weydana-6, the mindless communicants register them as errant data and seek to eliminate them while simultaneously storing their engrams.
Creatures defragmented by an anemonite communicant are subjected to excruciating pain as their bodies are broken down and reordered to be read more efficiently. If killed, these hapless individuals are reconfigured into cubes of matter that bear no resemblance to the living beings they once were. Those fortunate enough to survive anemonites have complained of splintered recall, a memory disorder in which the memories of one individual are transferred to another.
Each communicant stores all data relevant to creatures it has killed, presumably for uploading to Weydana-6’s cosmic computer. However, that computer remains dormant, leaving this data within each anemonite swarm. Computer scientists have had some success hacking a swarm and using its own nanomachines to reconstruct individuals the swarm has defragmented.
Anesthesiology is the study of how to reduce sensation, awareness, and pain sensitivity. While normally used to prepare patients for surgical procedures, you can creatively apply principles of anesthesiology in combat to help your allies work through pain or to inhibit your opponents.
''Booster:'' You inject a living creature with a substance that confers insensitivity to pain. That creature gains a +2 enhancement bonus to saving throws against pain effects and gains [[DR]] 1/—. This DR increases by 1 for every 5 biohacker levels you have, and it stacks with one other source of DR, to a maximum DR value up to your biohacker level.
''Inhibitor:'' You deliver a chemical compound that makes the target tired and weak, dealing nonlethal damage equal to your biohacker level and giving the target the [[fatigued]] condition (Fortitude negates fatigue and halves the nonlethal damage). If the target is already fatigued and becomes fatigued again, it becomes [[exhausted]] instead. This is a poison effect.
!! Breakthrough
Anesthesiology provides the following breakthrough ability.
''Ignore Pain:'' As a standard action, you can create and deliver a formula that allows a living creature to overcome pain and injury. When injected, the formula grants the target a number of temporary Hit Points equal to twice your biohacker level for 1 minute. The first time during that minute that the target is reduced to 0 Hit Points but not killed outright, it can continue to act normally until the end of its next turn or until it takes additional damage, at which point it becomes unconscious, as normal.
<div class="statblock">
* ''Level'' 16; ''Price'' 191,000
* ''EAC Bonus'' +18; ''KAC Bonus'' +22
* ''Max Dex Bonus'' +6; ''Armor Check Penalty'' –2; ''Speed'' 30 ft.; fly 60 ft. (perfect)
* ''Strength'' 20 (+5); ''Damage'' 2d6 P
* ''Weapon Slots'' 1; ''Upgrade Slots'' 2
* ''Capacity'' 100; ''Usage'' 1/minute
* ''Size'' Medium; ''Bulk'' 18 (deployed), 1 (undeployed)
</div>
This surprisingly light suit of hybrid powered armor uses technomagical microthrusters to grant you flight and incredible mobility. In its undeployed form, an angel frame looks and functions as a specific kind of clothing
Angels are celestials, or good outsiders, native to the good-aligned Outer Planes.
* ''Traits:''
** [[darkvision]] 60 ft., [[low-light vision]]
** protective aura (see below)
** +4 to saving throws against poison
** [[immunity]] to acid, cold, and petrification
** [[resistance]] 10 to electricity and fire
** [[truespeech]]
* //Protective Aura ([[Su]]):// For angels of CR 3 to CR 15, this ability grants creatures within the [[aura]] (usually 20 feet), including the angel, a divine bonus (usually +2) to AC against attacks made by evil creatures and a divine bonus (usually +4) to saving throws against effects created by evil creatures. The protective aura of a more powerful or a weaker angel might grant a larger or smaller bonus and have a larger or smaller radius, respectively.
Summoned angels are called forth from any good-aligned Outer Plane. They appear as winged forms made of living light that are vaguely humanoid in shape, though they usually lack distinguishing features.
* ''Type:'' outsider (angel, extraplanar, good).
* ''Alignment:'' change to NG
* ''Traits:''
** [[low-light vision]]
** base speed increases to 30 ft.
** supernatural fly speed of 30 ft. (perfect) or if CR 7 or greater, supernatural fly speed of 60 ft. (perfect)
** +4 to saving throws against poison; [[immunity]] to petrification; [[resistance]] equal to creature's CR to acid, cold, electricity, and fire
** if base stat block has [[DR]], change to DR/evil.
* ''Skills:'' add [[Diplomacy]] and [[Mysticism]]
* ''Languages:'' Common and Celestial
* ''Attack:'' change melee attack to sword of light (slashing damage), which acts as a [[natural weapon]]
Though it appears as an extended sword hilt when still, the angel wing takes its name from the uncontained plasma that trails in an arc following the leading edge when the blade is swung. The weapon is favored by followers of Sarenrae, who take pride in mastering the sophisticated art of its use. Movanic angel wings have darker, almost shadowy blades; monadic angel wings have golden plasma trails; and the astral angel wing burns white hot.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|angel wing, movanic | 4 | 1,890 | 1d6 E & F | [[burn]] 1d6 | L |[[powered]] (capacity 20, usage 2), [[unwieldy]] |
|angel wing, monadic | 7 | 5,500 | 2d6 E & F | [[burn]] 2d6 | L |[[powered]] (capacity 20, usage 2), [[unwieldy]] |
|angel wing, astral | 10 | 17,100 | 4d6 E & F | [[burn]] 2d6 | L |[[powered]] (capacity 20, usage 2), [[unwieldy]] |
</div>
<div class="statblock">
* ''CR'' 7; ''XP'' 3,200
* NG Large outsider (angel, extraplanar, good)
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft., [[detect alignment]], [[low-light vision]]; ''Perception'' +14
* ''Aura'' protective aura (20 ft.)
!!! DEFENSE
* ''HP'' 95
* ''EAC'' 21; ''KAC'' 22
* ''Fort'' +8; ''Ref'' +6; ''Will'' +10; +4 vs. poison
* ''Immunities'' acid, cold, petrification; ''Resistances'' electricity 10, fire 10; ''SR'' 18
!!! OFFENSE
* ''Speed'' 50 ft., fly 100 ft. ([[Su]], average)
* ''Melee'' [[holy]] sintered [[longsword]] +16 (2d8+12 S)
* ''Ranged'' [[holy]] corona [[laser rifle]] +14 (2d6+7 F; critical [[burn]] 1d6)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Spell-Like Abilities'' (CL 7th; melee +16)
** 1/day—//[[arcing surge]]// (DC 18), //[[interplanetary teleport]]// (self only)
** 3/day—//[[inject nanobots]]// (DC 17), //[[microbot assault]]//
* ''Offensive Abilities'' firewall
!!! STATISTICS
* ''Str'' +5; ''Dex'' +4; ''Con'' +4; ''Int'' +1; ''Wis'' +2; ''Cha'' +2
* ''Skills'' [[Computers]] +19, [[Culture]] +19, [[Engineering]] +19, [[Mysticism]] +14, [[Sense Motive]] +14
* Languages Celestial, Draconic, Infernal; [[truespeech]]
* ''Other Abilities'' upgrade
* ''Gear'' [[holy]] corona [[laser rifle]] with 2 high-capacity batteries (40 charges each), [[holy]] sintered [[longsword]]
!!! ECOLOGY
* ''Environment'' any good-aligned planes
* ''Organization'' solitary or pair
!!! SPECIAL ABILITIES
''Firewall ([[Su]])'' A barachius can summon a wall of digitally empowered divine fury within 30 feet as a standard action. This wall takes the shape of a line 10 feet high and 20 feet long; though it doesn't need to emanate from the angel, the angel must be able to see every square the wall passes through. The wall lasts until the beginning of the angel's next turn. An
evil creature caught within or that enters one of the wall's squares takes 2d6 damage (Will DC 17 half). An evil creature with the technological subtype takes twice this amount of damage.
''Protective Aura ([[Su]])'' Any creature within 20 feet of a barachius (including the angel itself) gains a +2 divine bonus to its AC against attacks made by evil creatures and a +4 divine bonus to saving throws against effects created by evil creatures.
''Upgrade ([[Su]])'' As a standard action, a barachius can touch a willing ally who is wielding a technological weapon or wearing technological armor. That creature receives a +1 divine bonus to attack rolls or to its AC (target's choice). This bonus last for 3 rounds and cannot be dispelled.
</div>
While tools and technology are often considered neutral in their own right, able to be used for good or ill purposes depending on the natures of their wielders, some good-aligned deities have long preached caution regarding those technologies that can allow single individuals to cause great havoc. The ascension of the artificially intelligent god Triune, who now holds technology and artificial life as its domains, has not eased such fears. Despite Triune's claim of neutrality, the ubiquity of technology throughout the Pact Worlds and beyond has spurred many divine powers to keep careful watch over both the ways in which current technology is employed as well as rapid technological progress that could threaten all life.
As angels have always been the messengers and enactors of the gods' will, a particular order of angelic beings, known as barachii, oversees technological advances and ensures these creations don't fall into the wrong hands or become twisted to serve evil gods and their minions. Outfitted with divinely blessed armor, weapons, and abilities, barachius angels are tasked with monitoring the planes both to protect mortal existence from technology gone awry and to quash technologically advanced cultures that present an explicit threat to all good creatures and causes. While all angels might be expected to protect the innocent from harm, barachiuses specialize in defending against subtle technological threats that might go unnoticed by the rank-and-file troops of the celestial legions. When a rapidly developing AI suddenly veers into true evil, when a new invention threatens to destroy countless innocents, when Hell's hacker devils feed insidious viruses into mortal mainframes—these are when barachiuses truly shine.
A barachius is an imposing figure, standing in what appears to be sleek, glowing armor and wielding a sword that pulses with the light of the stars or a glowing laser rifle. Its wings appear to be made of pure electricity, though a closer look reveals patterns within the feathery arcs that mimic digital arrays and computer wiring. Its face is often hidden behind an elaborate helm, and its voice—when it deigns to speak—is clipped and rapid-fire.
Yet a barachius's true strength resides not within its presence or arms but in its near-prescient ability to understand the nature of any technological object or being that it encounters. Exactly how and why the angels deem some technology not just dangerous but immoral is a great mystery, as it's not based solely on sheer destructive capacity. For instance, barachiuses have been known to hunt down and destroy individual robots with extreme determination while leaving similar models—and silos of nuclear missiles—entirely untouched.
A barachius might serve its purpose in a wide variety of ways. It could secretly patrol a settlement that is already rife with technology, constantly on the search for malicious computer code, machines run amok, or creatures bent on using technology for nefarious ends. Alternatively, one could be found searching for scientists and laboratories where cutting-edge research is being conducted. Even researchers with the best of intentions may come under the scrutiny of a barachius that deems the ongoing work or latest invention too threatening to the society's ongoing moral health. Barachii also keep watch over some planets and species that lack advanced technology to ensure that they're not enslaved or annihilated by races with greater resources—though again, why they perform this action for some races and not others is a mystery deeply vexing to scholars and mystics. Many believe their choices are based on an ability to see lines of probability stretching into the future and the angels' need to make minor course corrections now and then to avoid catastrophe. Rarely, a barachius might take a more redemptive approach. Rather than destroying evil-aligned devices and technological life-forms, it might seek to turn a target to the path of good. Barachii minister to androids and robots in particular, hoping that merciful actions might inspire the artificial creatures to similar acts.
!! Barachius Helm
What looks like a magnificent helmet on a barachius is actually an extension of its being, and thus it can never be taken from it by force. On occasion, however, a barachius particularly impressed by a mortal might offer that champion a magical copy of its own helm that's imbued with a sliver of its essence and grants the wearer some of its own power.
{{Barachius Helm}}
<div class="statblock">
* ''CR'' 17; ''XP'' 102,400
* NG Medium outsider (angel, good, extraplanar)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft., //[[detect alignment]]//, [[low-light vision]]; Perception +29
* ''Aura'' protective aura (100 ft.)
!!! DEFENSE
* ''HP'' 340
* ''EAC'' 31; ''KAC'' 33
* ''Fort'' +19; ''Ref'' +17; ''Will'' +19; +4 vs. poison
* ''DR'' 10/evil; ''Immunities'' acid, cold, petrification; ''Resistances'' electricity 10, fire 10; ''SR'' 28
!!! OFFENSE
* ''Speed'' 30 ft., fly 60 ft. ([[Su]], average)
* ''Melee'' //[[holy]] inferno [[skyfire sword]]// (7d8+22 F; critical burn 4d12)
* ''Ranged'' //[[holy]] zenith [[laser pistol]]// (8d4+17 F; critical burn 4d4)
* ''Offensive Abilities'' side swipe
* ''Spell-Like Abilities'' (CL 17th)
** 1/day—//[[mass suggestion]]// (DC 22)
** 3/day—//[[resistant aegis]]//
** At will—//[[make whole]]//, //[[shield other]]//
!!! STATISTICS
* ''Str'' +5; ''Dex'' +5; ''Con'' +8; ''Int'' +1; ''Wis'' +11; ''Cha'' +3
* ''Skills'' [[Culture]] +29, [[Disguise]] +29, [[Piloting]] +34
* ''Languages'' Celestial, Draconic, Infernal; [[truespeech]]
* ''Other Abilities'' [[change shape]] (any Small, Medium, or Large humanoid), holy chariot
* ''Gear'' bespoke [[echelon fashion]], //[[holy]] inferno [[skyfire sword]]// with 2 batteries (20 charges each), //[[holy]] zenith [[laser pistol]]// with 1 super-capacity battery (80 charges)
!!! ECOLOGY
* ''Environment'' any (Heaven)
* ''Organization'' solitary, pair, or caravan (3–6)
!!! SPECIAL ABILITIES
''Holy Chariot ([[Su]])'' As a move action, an exodus angel can conjure a celestial motorcycle called a holy chariot as per //[[phantom cycle]]// (CL 17th) that has a speed of 75 feet, a full speed of 1,100 feet, and an overland speed of 110 mph. This holy chariot also has an item level of 12th, EAC of 26, a KAC of 28, 200 Hit Points, and a hardness of 10; it can also traverse difficult terrain without penalty and deals 11d10 bludgeoning damage on a collision (Reflex DC 19). The angel can board the holy chariot as part of conjuring it. Due to its divine connection with the holy chariot, the exodus angel doesn't suffer attack roll penalties while riding the vehicle. An exodus angel must be driving their holy chariot to use their side swipe ability and can dismiss the vehicle as a swift action.
''Side Swipe ([[Ex]])'' When an exodus angel takes any full action to pilot their celestial motorcycle ([[race]], [[ram]], or [[run over]]), the angel can make a single melee attack against any one creature the vehicle is adjacent to at any point during its movement, though the angel cannot attack any creatures they target using ram or run over with this full action.
</div>
Whether by choice or by force, many communities throughout the galaxy have ventured from their homes, risking the unknown to seek out new lands and opportunities for their people. Exodus angels serve as the guardians of these communities, watching over migrant groups as they wander. The angels remain within these new societies for several generations, disguised as mundane citizens, before returning to Heaven. As a result, these angels are sometimes considered by their wards to be spiritual embodiments of their associated diasporas—both a reminder of the community's roots and a guardian of the new society that has been created.
Exodus angels are highly varied in their appearance, often taking on cultural aspects from the community they guard. Though they seek to avoid undue influence on their mortal neighbors, their quiet efforts to aid these communities and preserve unique cultural roots often means they become important, if niche, community leaders.
Angels are celestials, or good outsiders, native to the good-aligned Outer Planes.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
This enhancement adds an antenna-like bioluminescent pod of photobacteria that extends from the top of the spinal column to provide light. Its original purpose was for asteroid miners who needed both hands for hefty equipment, but it has also grown popular among rave communities. An angler's light increases the light level from darkness to dim light, or from dim light to normal light, either in a 20-foot cone or a 10-foot radius; altering the shape of the light's illumination is a move action. The effects of multiple angler's lights do not stack.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|angler's light | 2 | 560 | spinal column |
</div>
An animal is a living, nonhumanoid creature, usually a vertebrate with no magical abilities and no innate capacity for language or culture.
* ''Traits:''
** [[low-light vision]]
** set Intelligence modifier to –4 or –5
* ''Adjustments:'' +2 to Fortitude and Reflex saving throws
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 round
* ''Range'' touch
* ''Targets'' one unattended suit of armor
* ''Duration'' concentration, up to 1 round/level
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You temporarily infuse a suit of armor with a magic force that allows it to move on its own and that directs its mechanisms. When you cast this spell, the armor acts and responds to your mental control for as long as you concentrate. Each round on your turn, the armor can perform either a move action or a standard action to attack. The armor can move up to 30 feet (or its listed speed using any of its available modes of movement, if powered armor or containing an armor upgrade that alters movement). When the armor attacks, it can either make an unarmed attack, dealing 4d8 + your caster level bludgeoning damage (or the listed damage plus its Strength modifier, for powered armor) or make an attack with any of the weapons mounted in its weapon slots or weapons with the [[integrated]] special property installed in its upgrade slots (if any); this deals the weapon's base damage for ranged attacks and the weapon's base damage plus the armor's Strength modifier for melee attacks. The armor has a bonus to attacks equal to 6 + your caster level. If the armor has no listed Strength score, it can apply a Strength bonus equal to your caster level.
Should the animated armor be attacked, its EAC and KAC are equal to 10 + the EAC and KAC bonus the armor provides. It uses your saving throw bonuses when it is the target of spells and other targeted effects, and it has the typical hardness and Hit Points for an item of its level. For the purpose of spells and effects that target the armor, it is treated as a construct with the technological and magical subtypes while the spell lasts.
This spell has no effect if cast on powered armor with a depleted battery or powered armor of an item level that exceeds your caster level.
<div class="statblock">
* <<levels>>
* ''School'' necromancy
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one or more corpses
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
This spell turns corpses into undead creatures that obey your spoken commands. The undead can be made to follow you, or they can be made to remain in place and attack any creature (or a specific kind of creature) entering the area. They remain animated until they are destroyed. A destroyed undead can't be animated again.
You can create one or more undead creatures with a total CR of no more than half your caster level. You can only create one type of undead with each casting of this spell. Creating undead requires special materials worth 1,000 credits × the total CR of the undead created; these materials are consumed as part of casting the spell.
The undead you create remain under your control indefinitely. No matter how many times you use this spell, however, you can control only a number of undead whose total CR is no greater than your caster level. If you exceed this number, all the newly created creatures fall under your control and any excess undead from previous castings become uncontrolled. You choose which creatures are released. Once released, such undead have no particular feelings of loyalty to you, and in time they may grow in power beyond the undead you can create.
The corpses you use must be as intact as the typical undead of the type you choose to create. For example, a skeleton can be created only from a mostly intact corpse (that has bones) or skeleton. A zombie can be created only from a creature with a physical anatomy.
Spellcasters and engineers have developed techniques to animate suits of armor indefinitely, instilling sentience—or even sapience—into these defensive tools.
Spellcasters animate armor through various supernatural approaches, including some akin to techniques used for making magic items. Infamously, Hellknight mages cover the inside of the armor with an infernal contract, infusing the creation with a minor devilish being forced into submission. Such armors serve as decorative sentinels in Hellknight facilities or disposable shock troops on the battlefield. The Knights of Golarion and Xenowardens use similar means to infuse armor with quiescent fragments of angelic will, elementals, or nature spirits. Eoxian technomancers instead instill armor with rudimentary unlife, sometimes using the remains of undead too damaged to operate without the artificial casing armor provides.
More technologically minded factions have similarly diverse approaches to creating animated armor. Technicians at the Qabarat University of Psychic and Technological Excellence have built on the psychically charged circuits of [[lashunta mind mail]] to create a sort of hybrid robot. These suits of mind mail combine artificial intelligence with psychic potential to become animated. Other groups, such as the Android Abolitionist Front, have a fondness for animated and sapient armor. Perceptionist members of the Front claim such armors, among other advanced artificial intelligences, must be protected as created people. One such Perceptionist, a zealot named 8-Karat, has begun liberating these constructs, using violence if necessary.
On Akiton, VitariTech Industries engages in unmonitored research into animated armor. The company recently claimed a long-abandoned shrine to Triune, using heavy security forces to keep interlopers out. Rumors indicate the corporation is using what it found within the site to build advanced constructs, including robot-like troops of animated heavy armor led by suits of powered armor. Devotees of various factions faithful to the All-Code want to know what VitariTech is up to within this holy place, as do members of the Perceptionists and the Augmented.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
!! Animated Armor Template Graft
Use an existing suit of armor to create animated armor, setting the CR to equal the armor's item level.
* ''Required Creature Type and Subtype:'' Construct. Some animated armors are mindless constructs. Others are not, functioning either as a robot or with magical awareness (perhaps from a supernatural force). Most often, animated armor has the magical and technological subtypes. Some suits are wholly technological constructs akin to robots.
* ''Suggested Array:'' Combatant, although animated armor that lacks the [[mindless]] trait could have the expert array.
* ''Traits:'' Size is typically Medium but it can be smaller or larger, depending on the size of the armor that is animated. Set land speed to 30 feet, adjusted for the armor's speed adjustment or to powered armor's speed; add a slam attack with bludgeoning damage according to the array; add comm and [[integrated weapons]].
* ''Suggested Ability Score Modifiers:'' For heavy or powered armor, set Strength highest and Dexterity next highest. Light animated armor should have Dexterity highest and Strength next highest. Charisma is usually –2, although animated armor that isn't mindless might have higher Charisma.
* ''Skills:'' Most animated armor has [[Acrobatics]] and [[Perception]] as good skills, with [[Athletics]] as a master skill. Animated armor that isn't mindless might have other skills.
* ''Languages:'' Animated armor that isn't mindless usually speaks one or two languages, including Common.
* ''Gear:'' One weapon can be of an item level equal to the animated armor's CR + 1, but other gear should be of item levels equal to or less than the CR. Animated armor can have as many armor upgrades as the armor has upgrade slots. Each upgrade should be of the armor's CR or lower, with no more upgrades of item levels equal to the armor's CR than the array's number of special abilities.
<div class="statblock">
* ''CR'' 16; ''XP'' 76,800
* N Medium construct (magical, technological)
* ''Init'' +10; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +28
!!! DEFENSE
* ''HP'' 300
* ''EAC'' 30; ''KAC'' 32
* ''Fort'' +16; ''Ref'' +16; ''Will'' +12
* ''Defensive Abilities'' [[integrated weapons]]; ''Resistances'' cold 15, fire 15; ''Immunities'' [[construct immunities]]
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' slam +28 (6d10+23 B) or integrated //[[returning]]// tenor [[singing disk]] +31 (7d6+23 So; critical [[confuse]] [DC 22])
* ''Ranged'' integrated //[[returning]]// tenor singing disk +31 (7d16+16 So; critical [[confuse]] [DC 22])
!!! STATISTICS
* ''Str'' +7; ''Dex'' +10; ''Con'' —; ''Int'' +5; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +33, [[Athletics]] +28, [[Mysticism]] +28
* ''Languages'' Castrovelian, Common
* ''Other Abilities'' comm, [[unliving]]
* ''Gear'' 2 //[[returning]]// tenor [[singing disks]], mk 3 [[thermal capacitor]], mk 1 //[[spell reflector]]//, red [[force field]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or pair
!!! SPECIAL ABILITIES
''Comm ([[Ex]])'' Animated Lashunta mind mail III can receive wireless communications (and thus commands from its allies and creator) at planetary range.
<div class="statblock">
* ''CR'' 5; ''XP'' 1,600
* N Medium construct (magical, technological)
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +11
!!! DEFENSE
* ''HP'' 70
* ''EAC'' 17; ''KAC'' 19
* ''Fort'' +5; ''Ref'' +5; ''Will'' +2
* ''Defensive Abilities'' [[integrated weapons]]; ''Resistances'' cold 5, fire 5; ''Immunities'' [[construct immunities]]
!!! OFFENSE
* ''Speed'' 20 ft., fly 30 ft. ([[jetpack]], average)
* ''Melee'' slam +15 (1d6+10 B)
* ''Ranged'' integrated corona [[laser pistol]] +13 (2d4+5 F; critical [[burn]] 1d4)
!!! STATISTICS
* ''Str'' +5; ''Dex'' +3; ''Con'' —; ''Int'' —; ''Wis'' +0; ''Cha'' –2
* ''Skills'' [[Acrobatics]] +11, [[Athletics]] +16
* ''Other Abilities'' comm, [[mindless]], [[unliving]]
* ''Gear'' corona [[laser pistol]] with 4 batteries (20 charges each), [[jetpack]], mk 1 [[thermal capacitor]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or troop (3–6)
!!! SPECIAL ABILITIES
''Comm ([[Ex]])'' Animated lictor Hellknight plate can receive wireless communications (and thus commands from its allies and creator) at planetary range.
</div>
<div class="statblock">
* ''CR'' 11; ''XP'' 12,800
* N Fine construct (magical, swarm, technological)
* ''Init'' +8; ''Senses'' [[blindsight]] (vibration) 60 ft.; ''Perception'' +20
!!! DEFENSE
* ''HP'' 180
* ''EAC'' 23; ''KAC'' 25
* ''Fort'' +11; ''Ref'' +11; ''Will'' +8
* ''Defensive Abilities'' birefringence, deactivation, [[swarm defenses]]; ''Immunities'' [[construct immunities]], [[swarm immunities]]
* ''Weaknesses'' [[vulnerable]] to acid
!!! OFFENSE
* ''Speed'' fly 40 ft. ([[Su]], perfect)
* ''Melee'' swarm attack (2d6+16 B & E)
* ''Space'' 10 ft.; ''Reach'' 0 ft.
!!! STATISTICS
* ''Str'' +5; ''Dex'' +8; ''Con'' —; ''Int'' —; ''Wis'' +3; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +25 (+33 to fly), [[Athletics]] +20
* ''Other Abilities'' [[mindless]], piezoelectric, [[unliving]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Birefringence ([[Ex]])'' An animated quartz swarm bends light in nonintuitive directions, making it hard to target. The animated quartz swarm has [[concealment]] against
all attacks that use visual targeting, and its space also provides concealment.
''Deactivation ([[Su]])'' An animated quartz swarm that's reduced to 0 Hit Points isn't destroyed; instead, the gems' runes are rendered inactive for 1d4 hours. It reactivates with full Hit Points. The only way to permanently destroy an animated quartz swarm is to smash each gem or deface each rune, a process that takes about an hour of work.
''Piezoelectric ([[Ex]])'' An animated quartz swarm converts mechanical pressure into electric potential and vice versa. When the animated quartz swarm takes bludgeoning, piercing, or slashing damage, it deals 2d6 electricity damage to each creature in or adjacent to its space. When the animated quartz swam takes electricity damage, it deals 2d6 bludgeoning damage to each creature in or adjacent to its space. In either case, each affected creature can attempt a DC 18 Reflex save to take half damage.
</div>
Though commonly found on many planets, quartz has unusual physical properties, making it a prime target for experimentation by scientists and technomancers. Powerful individuals with advanced training in both magic and science have unlocked the secrets of creating animated quartz swarms, often to serve as sentries that can perform their duties without the need for rest. Often integrated into traps, animated quartz swarms can suddenly turn beautifully decorated chandeliers, fountains, and other seemingly benign installations into deadly defenses when the swarms incorporated into these objects fly into action.
Each crystal of an animated quartz swarm is a hexagonally cut gem 2 to 3 inches wide, sometimes with a tint of color. Each crystal must have runes painstakingly inscribed on its surface. A single crystal presents no threat at all, but a swarm of them can obliterate many would-be trespassers. Creatures that get stuck in the swarm's space soon learn that the piezoelectric properties of the quartz make it a dangerous place to be—as the whirling crystals alternately bludgeon and electrocute them.
Animated quartz swarms don't occur naturally; they're always intentionally created. The runes on the crystals' surfaces contain simple programs with instructions for the quartz swarms, typically defining a specific area to defend or a password or visual sign by which they can identify authorized individuals.
[[Shimreens]], crystalline humanoids from the planet Shimrinsara, are the first documented creators of animated quartz swarms. So advanced were these early swarms that the individual quartz crystals didn't require inscribed runes; shimreens could simply issue commands to the quartz. Legend has it that the very first, albeit tiny, animated quartz swarm utilized pieces derived from the inventor's crystalline crown, left over from when she changed her appearance. Many expensive homes and corporate buildings in Shimrinsara's domed cities have an animated quartz swarm somewhere on the premises, ready to defend the property. Visitors to Shimrinsara observed the ever-vigilant sentries and word quickly spread about the swarms, leading to researchers throughout the galaxy developing similar techniques for animating quartz. However, these secondhand methods require the time-consuming step of inscribing runes on hundreds or even thousands of crystals to program the swarm, though magic can speed up the process. Shimreens initially objected to their technology being replicated by outsiders, but the swarms have proven so useful that their manufacture still spread rapidly; shimreens have since largely grown resigned to the appropriation and object only to having outside societies' swarms brought onto Shimrinsara. Other societies believe that shimreens' animated quartz swarms are more powerful than those developed by anyone else, but shimreens don't sell their technology to outsiders and instead pursue anyone who attempts to steal one of their swarms.
Vesk technomancers took to animated quartz swarms quickly, as the reptilian warriors can always use sentries that don't need food, water, or rest. They often add additional runes that prevent permanent deactivation by causing tampered-with crystals to explode, which sends shards of crystalline shrapnel to pelt whoever would dare destroy a vesk's animated quartz swarm. This explosive and potentially deadly modification is often looked down on as an excessive response, but their use isn't officially banned yet. AbadarCorp has several quartz swarm animators on its payroll, and rumor has it that each creator knows only a portion of the instructions to be inscribed for maximum possible security. Each creator fills in their section and then passes on the crystal to the next stage, which prevents anyone from knowing how to bypass—or recreate—the whole system.
Animated quartz swarms aren't always programmed as guards, though that's certainly the most popular application. Other swarms help perform search-and-rescue missions in dangerous areas, vibrating rapidly to send a radio signal to their programmers when they find their objectives. The swarms are even sometimes used for aesthetics, such as being programmed to fly into complex patterns to accompany high-production concerts by musicians. This use does require a significant financial investment for the special effects, as only extremely talented creators can fabricate animated quartz swarms. The dangerous effects of an animated quartz swarm are typically engineered out for these alternate uses by using crystals with slightly different molecular structures that produce unique effects.
Individual swarm creators tend to rely on particular sources for the quartz crystals used to construct their swarms, with varying hues and cuts for the gems. This practice tends to give swarms distinctive appearances that a clever detective can use to identify the creator. The manufacturers for the cut crystals typically agree not to sell the exact same design to anyone else.
Some solarians have experimented with using inscribed crystals as weapon crystals, though to inconsistent results. While some have found benefits, such as occasional concealment or additional electricity damage, others find themselves continually being electrocuted by their own weapons. As such, these crystals haven't found widespread use among solarians. Others have integrated the crystals into different technologies, such as on vehicles to prevent hit and runs.
!! Quartz Refractor Armor Upgrades
Adding a small number of animated quartz crystals to armor for their birefringent effect has become a relatively popular use of the rune-inscribed crystals.
{{Quartz Refractor}}
When you whisper a command word to these otherwise normal trapsmith's tools, they begin to
move on their own. You can use these tools to arm explosives or disarm a trap at a distance of 10 feet, using your total skill bonus in the appropriate skill (though the circumstance bonus provided by the tools is decreased to +2 when used in this way).
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//animated trapsmith's tools// | 4 | 2,000 | L |
</div>
People often have superstitions regarding whether objects have a spirit or intelligence, and //animistic tools// were made with such beliefs in mind. Each of these tool kits has the power to communicate a user's intentions to inanimate objects. When you use //animistic tools// with the appropriate skill and you fail a check, you can use the tool's magic to reroll the check and take the higher result. In addition, as a move action, you can tap or bang a tool from the kit on a [[broken]] object, causing the object to ignore the penalties of being broken for a time. An item can benefit from //animistic tools// in this way only once per day, causing some engineers to joke that no one likes percussive maintenance.
The model of the tools determines the number of rerolls per day and the time an item ignores the [[broken]] condition. Once you use a set of //animistic tools//, you can't benefit from a different set for 24 hours.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Rerolls/Day | Ignore Broken<br/>Condition For |h
|//animistic tools//, mk 1 | 3 | 1,350 | L | 1 | 1 minute |
|//animistic tools//, mk 2 | 7 | 5,500 | L | 2 | 10 minutes |
|//animistic tools//, mk 3 | 11 | 22,000 | L | 3 | 1 hour |
</div>
A weapon with the //annihilator// fusion looks corroded, worn, and crudely formed. If a target is slain by an attack with an //annihilator// weapon, the target disintegrates entirely (as though by the //[[disintegrate]]// spell).
The far reaches of the galaxy contain a plethora of additional phenomena and anomalies that can have a variety of effects on starships.
''Temporal Rift:'' Waves of tachyon particles or damage from powerful gravitational forces can leave temporal scars in the fabric of space-time. These areas have unpredictable effects on time and can leave unlucky crews stranded. Mark an area 5 to 10 hexes long that varies from 1 to 3 hexes wide. When a starship begins a phase inside a temporal rift, time shudders and shifts; roll 1d4 for each crew member when they attempt an action. On a roll of a 1, they lose their action for this round. On a 2 or 3, they act normally. On a 4, they can take 10 on their action.
''Wormhole:'' These anomalies are bridges in space-time, linking two different points in space, two different moments in time, or a combination of the two. When a starship flies through a wormhole, its crew often experiences flying through a tunnel in a luminescent nebula. Mark 2 hexes on the grid that are linked to each other; you can choose either or both locations or determine either or both at random. Whenever a starship enters one of these hexes, it immediately enters the wormhole; remove it from the combat grid. On the next round of starship combat during the helm phase, when it is that starship's turn to move, it first appears in the linked hex with a random facing.
There are parts of space that are undefined, unexplained, and sometimes even impossible. While most stay far away from these dangerous places, some actively seek them out. Whether to feel the thrill of harnessing the unknown, to understand what’s at the heart of such a phenomenon, or to simply make a profit, anomaly hunters risk their lives in these pursuits. These anomaly hunters live dangerously, but they are devoted to their cause and are driven, resilient individuals.
The anomaly hunter grants alternate class features at 2nd, 4th, 6th, and 12th levels.
!! Expedition Leader (2nd)
An expedition into unknown and dangerous parts of space needs to be well outfitted or it’s doomed before it even starts. As an experienced explorer, you know where to look for the best deals, whom to shake down for pieces of equipment, and whom to sweet-talk for research grant money. Three times per day when you attempt one of the following skill checks, you can roll 1d6 and add the result to your skill check as an insight bonus. At 10th level, you can roll a 1d8 instead of a 1d6.
* [[Culture]] checks to [[recall knowledge]] about local laws, customs, merchants, research institutes, or universities
* [[Diplomacy]] checks to [[gather information]] about the route you’re planning, space ports, merchants, and goods
* [[Profession]] checks to help outfit your expedition, gather supplies, ready your starship, arrange for enough credits, or any other use of a Profession skill the GM approves
* [[Bluff]], [[Diplomacy]], or [[Sense Motive]] checks to negotiate the price for goods and services
!! Anomaly Expert (4th)
You excel at extrapolating from little information, and space anomalies are your specialty. When studying an anomaly, you keep an open mind and try multiple approaches to find a theory that fits in explaining it. [[Life Science]], [[Mysticism]], and [[Physical Science]] become class skills for you, if they aren’t already. Once per day when you attempt a Life Science, Mysticism, or Physical Science skill check, you can roll twice and use the better result. You can use this ability additional times per day by expending 1 Resolve Point for each use after the first.
!! Miracle Worker (6th)
You’ve been in enough tough spots that you’ve picked up a trick or two, through a mix of careful study and a little exposure to strange phenomena. You gain access to the spell //[[jury-rig]]//. If you have the spells class feature, you add //jury-rig// to your list of spells known and treat it as a spell on your class spell list. If you already know //jury-rig//, you instead gain an additional 2nd-level spell of your choice from your class spell list. If you don’t have a class spell list or spells known, you gain //jury-rig// as a spell-like ability that you can cast three times per day. In addition, you can take 10 minutes and spend 1 Resolve Point to restore Hit Points equal to twice your class level to one vehicle, piece of equipment, or creature if you have sufficient materials or tools at hand (at the GM’s discretion). This doesn’t count as resting to restore Stamina Points.
!! Vacuum Inoculation (12th)
Throughout your career as an anomaly hunter, you’ve been exposed to unknown types of radiation, wild magic, or even strange experiments. This has altered your body in unforeseen yet beneficial ways. You’re immune to the harmful environmental effects of outer space and of vacuum.
Popular with long-term visitors to Hibb, this cybernetic chip does only one thing; as a swift action, or as a reaction when you would be affected by a scent-based effect, you can choose to lose your sense of smell. You lose any abilities dependent on scent but become immune to sense-dependent effects that rely on scent. You can deactivate the anosmatic shunt and regain your sense of smell as a swift action.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|anosmatic shunt | 1 | 120 | lungs |
</div>
You have learned how to gain your opponents' attention, drawing fire away from your allies and toward yourself. You gain [[Antagonize]] as a bonus feat. You do not need to meet its prerequisites. This is not a language-dependent ability for you, but it does not work on [[mindless]] targets. If you are at least 6th level, when you successfully use Antagonize on a foe, the duration of the penalty the foe takes is 3 rounds longer than usual (though it still ends after the foe attacks you, forces you to attempt a saving throw, or damages you), and the target takes a –2 penalty to attack rolls (in addition to the normal –2 for being [[off-target]]).
You know how to make foes extremely angry with you.
''Prerequisites:'' [[Diplomacy]] 5 ranks, [[Intimidate]] 5 ranks.
''Benefit:'' As a standard action, you can antagonize a foe that can see and hear you by attempting a [[Diplomacy]] or [[Intimidate]] check (DC = 10 + your opponent's total [[Sense Motive]] skill bonus, or 15 + 1-1/2 × the opponent's CR, whichever is higher). If you succeed, the foe is [[off-target]] and takes a –2 penalty to all skill checks for 1 round plus 1 additional round for every 5 by which your result exceeds the DC, or until it makes an attack against you, forces you to attempt a saving throw, or damages you (whichever comes first). Once you have attempted to antagonize a foe, that foe is immune to this ability for 24 hours. This is a language-dependent ability.
You can use the [[taunt]] captain action against the same starship up to twice per starship combat.
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* CE Small monstrous humanoid
* ''Init'' +4; ''Senses'' [[blindsense]] (vibration) 30 ft., [[darkvision]] 60 ft.; ''Perception'' +13
!!! DEFENSE
* ''HP'' 33
* ''EAC'' 14; ''KAC'' 15
* ''Fort'' +2; ''Ref'' +4; ''Will'' +8
* ''Defensive Abilities'' [[Swarm mind]]; ''Immunities'' acid, fear effects
!!! OFFENSE
* ''Speed'' 30 ft., fly 45 ft. ([[Ex]], average)
* ''Melee'' claw +8 (1d4+4 S)
* ''Ranged'' stinger +10 (1d4+3 P plus paralytic neurotoxin)
!!! STATISTICS
* ''Str'' +1; ''Dex'' +4; ''Con'' +0; ''Int'' +1; ''Wis'' +2; ''Cha'' –2
* ''Skills'' [[Acrobatics]] +13, [[Athletics]] +8, [[Life Science]] +8, [[Physical Science]] +8, [[Stealth]] +13
* ''Languages'' Shirren; [[telepathy]] 300 ft.
* ''Other Abilities'' [[tracking]] (blindsense)
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or advance (2–5)
!!! SPECIAL ABILITIES
''Stinger ([[Ex]])'' As a ranged attack, a Swarm antecursor can launch a poisoned stinger from its tail with a range increment of 50 feet. Each stinger is coated with a paralytic neurotoxin (see below).
!!! Paralytic Neurotoxin
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 14
* ''Track'' [[Dexterity|Dexterity Poison Track]]
* ''Frequency'' 1/round for 4 rounds
* ''Cure'' 2 consecutive saves
</div>
A Swarm antecursor's lithe body bears two pairs of large wings and oversized compound eyes. The creature's scorpion-like tail keeps it stable in flight and can launch an organic stinger at foes. An antecursor is frequently dull green and brown with matte-gray wings, but those scouting urban areas are sometimes gray, with iridescent markings resembling electric lights.
Antecursors often form the first wave of any Swarm onslaught, infiltrating target worlds and gathering intelligence to send back to the hive mind. Swift and stealthy, they avoid engaging opponents; if attacked, they use their neurotoxin to incapacitate enemies so they can escape. Antecursors usually appear to be alone, but due to their long-range telepathy, attacking one often means several more antecursors will soon arrive as backup. Antecursors are somewhat more intelligent than most Swarm components, and thanks to the hive mind's shared memories, they can capably operate in nearly any planetary environment even if they haven't have experienced it firsthand.
By increasing the security of the starship's computer, these systems increase the DC to hack into it by 1. This upgrade can be purchased up to four times.
<div class="table-wrapper">
|System | PCU | Cost (in BP) |h
|anti-hacking systems | 0 | 3 |
</div>
An antibiological weapon damages only living targets. Objects and creatures with the unliving special quality, such as robots and undead, are immune to its effects.
Antibiotics help patients fight off disease. When you take or are injected with an antibiotic, you gain a bonus (equal to 3 + the medicinal's tier) to saving throws against disease for a number of days equal to 2 × the antibiotic's tier.
An antiemetic settles your stomach, stopping the symptoms of illness or ameliorating your body's response to the environment. When you take or are injected with an antiemetic, you gain a bonus (equal to the medicinal's tier) to saving throws to avoid becoming [[sickened]] or [[nauseated]] for 10 minutes per tier of the medicinal. If you are currently suffering one of these conditions and the effect allows a saving throw to negate, an antiemetic allows you to immediately attempt a new saving throw.
Most commonly used by those brave enough to travel to the high-gravity world of Aucturn, this belt uses a form of graviton levitation to essentially reduce gravitational pull. You can activate the belt as a swift action, and it operates until you spend another swift action to deactivate it or until it runs out of charges. You treat areas of extreme gravity as having high gravity, areas of high gravity as having standard gravity, and areas of standard gravity as having low gravity. This belt has no effect in areas that naturally have low gravity or zero gravity.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|antigravity belt | 7 | 6,500 | L | 20 | 1/round |
</div>
These explosives create temporary fields of reduced gravity, upending foes, helping move large objects, and enabling extraordinary acrobatic feats. Each grenade reduces the area's gravity strength by a number of steps based on the grenade's model: extreme gravity to high gravity to standard gravity to low gravity to microgravity (effectively zero gravity with some exceptions, listed below). The grenade has no effect in zero gravity conditions; it cannot reduce gravity to less than microgravity conditions, and the effects of multiple antigravity grenades are not cumulative.
Ranged attacks made through a microgravity area ignore any affected squares they pass through for the purpose of calculating their penalty to attack due to range increment. Such attacks traveling through low gravity or high gravity areas respectively count every third affected square or count each affected square three times when calculating the attack's penalty due to range.
The first time a creature enters or starts its turn in an area of microgravity, it can attempt a Reflex save. If successful, it automatically gains its bearings enough to fly, can move at half speed along any surface on which it was already standing, can take [[guarded steps]], and can move along that surface as though the surface had sufficient handholds (or gains a +5 bonus to [[Acrobatics]] and [[Athletics]] checks to navigate the surface if it already had such handholds). If it fails the save, it is affected by zero gravity conditions normally and becomes [[off-kilter]].
<div class= "table-wrapper">
|Weapon | Level | Price | Range | Capacity | Bulk |Special |h
|antigravity grenade I | 2 | 140 | 20 ft. | drawn | L |[[explode]] (1 step for 2 rounds, 10 ft.) |
|antigravity grenade II | 6 | 575 | 20 ft. | drawn | L |[[explode]] (1 step for 2 rounds, 10 ft.) |
|antigravity grenade III | 10 | 2,650 | 20 ft. | drawn | L |[[explode]] (2 steps for 2 rounds, 10 ft.) |
|antigravity grenade IV | 14 | 9,500 | 20 ft. | drawn | L |[[explode]] (3 steps for 2 rounds, 10 ft.) |
|antigravity grenade V | 19 | 83,000 | 20 ft. | drawn | L |[[explode]] (4 steps for 2 rounds, 15 ft.) |
</div>
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' 20-ft.-radius burst
* ''Duration'' instantaneous
* ''Saving Throw'' Will partial, see text
* ''Spell Resistance'' yes, see text
</div>
You detonate a bubble of antimagic in the area, temporarily unraveling magical effects. This spell works like an area dispel from //[[greater dispel magic]]//, but your dispel check applies to every spell, supernatural effect, hybrid item, magic item, and magical effect in the area. For supernatural effects, the DC for your check equals 11 + the CR or level of the creature that created the effect. If the dispel check would end a summoning effect, it sends only those summoned creatures in the area back from whence they came. The antimagic suppresses an affected magic item’s magical capabilities for 1d4 rounds. Creatures and objects only partially within the area are unaffected.
Creatures, including summoned ones that remain because the effect that summoned them isn’t dispelled, can attempt a Will saving throw against this effect, and their [[spell resistance]] applies. If a creature is affected, it can’t use its spells, spell-like abilities, and supernatural abilities for 1d4 rounds. A magical construct that fails the save is also [[staggered]] for this time. Any creature affected by this spell can attempt a Will saving throw at the end of each round to shrug off the effect on itself. This spell has no effect on artifacts or deities.
An //antimagic grenade// creates a temporary field that inhibits magic in its radius. Upon detonation, everything in the grenade’s radius is affected by an area dispel as //[[greater dispel magic]]//, using the grenade’s item level as the caster level. Second, each creature in the explosion radius must make a Will save each time they attempt to cast a spell or use a spell-like ability for a number of rounds equal to the grenade’s model number, or lose the spell or spell-like ability. A creature, object, or area can be affected by only one //[[antimagic grenade]]// every 24 hours.
<div class= "table-wrapper">
|Weapon | Level | Price | Range | Capacity | Bulk |Special |h
|//antimagic grenade// I | 15 | 27,500 | 20 ft. | drawn | L |[[explode]] (20 ft.; see text) |
|//antimagic grenade// II | 19 | 172,000 | 20 ft. | drawn | L |[[explode]] (20 ft.; see text) |
</div>
Your skin is infused with alchemical components extracted from fey, hags, and other highly magic-resistant creatures. As a move action, you can gain [[spell resistance]] according to your model of //antimagic skin// for 1 minute. You can also gain this spell resistance as a reaction, but you then can't take a move action on your next turn. Once you use your [[antimagic skin]], you can't use it again until you've rested for 10 minutes to regain Stamina Points, though you can spend 1 Resolve Point at any time to recharge it immediately.
<div class="table-wrapper">
|Augmentation | Level | Price | System | Spell Resistance |h
|//antimagic skin//, mk 1 | 15 | 109,400 | skin | 20 |
|//antimagic skin//, mk 2 | 16 | 170,800 | skin | 22 |
|//antimagic skin//, mk 3 | 17 | 263,000 | skin | 24 |
|//antimagic skin//, mk 4 | 18 | 388,000 | skin | 26 |
|//antimagic skin//, mk 5 | 19 | 587,000 | skin | 28 |
|//antimagic skin//, mk 6 | 20 | 891,000 | skin | 30 |
</div>
An //antipathy transponder// repels sensor scans with a mind-affecting compulsion. To activate this device, you must deactivate your normal transponder, rendering your starship unable to send or receive communications. The //antipathy transponder// then allows you to evade notice from passive sensors (but not the visual senses of creatures) that might detect you, provided the pilot handling your starship succeeds at a [[Piloting]] check with a DC of 10 + 1-1/2 × the tier of the vessel to be fooled. To fool a fleet, use the highest starship tier among them, then increase the Piloting DC by 2. The pilot gains a bonus to this check equal to the bonus your starship gains from defensive countermeasures. However, any attempt to actively scan from your vessel while an //antipathy transponder// is on eliminates that bonus and increases the [[Computers]] DC for that scan by 2.
Anyone your //antipathy transponder// fools avoids actively scanning for your vessel. However, if a fooled crew has a reason to scan the area your starship is in, the //antipathy transponder// doubles the bonus against active scans your vessel has from defensive countermeasures. If the check to scan fails, the crew scanning the area your ship is in fails to detect your vessel.
If your starship does anything other than move or actively scan, such as attack or attempt to enter the Drift, the //antipathy transponder// fails to work. Also, activating an //antipathy transponder// has no effect on those who already know your starship is present—once creatures are aware of your ship, an //antipathy transponder// aboard your vessel can work against them only after they have been unaware of your starship's location for 1 hour or more. However, if starship combat starts while you have an //antipathy transponder// active and your enemies become aware of your starship only due to the initiation of hostilities, your pilot gains a bonus equal to your bonus from defensive countermeasures to the Piloting check to determine order of actions during the first round of that starship combat.
Any penalty due to critical damage to sensors applies to Piloting checks to utilize an active //antipathy transponder//, as well as to the DCs for foes to successfully scan for a ship that's using an //antipathy transponder//. In addition, crew members exposed to an active //antipathy transponder// more than once or 1 hour during a 24-hour period become [[fatigued]].
<div class= "table-wrapper">
|System | PCU | Cost (in BP) |h
|//antipathy transponder// | 5 | 3 |
</div>
An //antipathy unit// is a large device designed to telepathically repel intruders with a mind-affecting compulsion. When activated, the unit broadcasts a signal that most beings find subtly repulsive without being able to discern why the repulsion is occurring. The field affects an area with a radius of up to 100 feet, which you set. Upon entering the field, a creature feels the urge to leave—to remain in the area, the creature must attempt a DC 19 Will saving throw. On a failure, the creature cannot willingly return to the area for 24 hours or until the //antipathy unit// deactivates. Even if the save succeeds, creatures in the area are uncomfortable, taking a –1 penalty to attack rolls and [[Perception]] checks while they remain within it. You can use the biometric parameters on an //antipathy unit's// controls to exclude creatures from the effect, but unless you have available biometric data that you can input into the unit for specific absent creatures, excluded creatures must be present when the unit is activated. An //antipathy unit// functions for 24 hours before needing to be recharged for 24 hours. The activation need not be continuous, but any activation consumes 1 hour of the unit's power.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//antipathy unit// | 10 | 20,000 | 5 |
</div>
An antipersonnel weapon must be mounted near the boarding ramp of a Medium or smaller starship. This weapon can be any longarm whose item level is equal to or less than the starship's tier. By spending 5 additional Build Points, the installed weapon can be a heavy weapon (of creature scale, not starship scale).
When an antipersonnel weapon is activated, if a hostile creature approaches within the weapon's range increment, it begins firing with an attack roll modifier equal to the ship's tier (minimum 1). It fires once per round during combat until its ammunition is depleted or the hostile creature is disabled or flees. The weapon can't detect [[invisible]] (or similarly hidden) creatures. This weapon can't be removed and used by characters. Anyone with access to the starship's computer system can activate or deactivate the weapon, as well designate what kind of targets are considered hostile. Once installed, this weapon can't be removed from the starship without destroying it.
<div class= "table-wrapper">
|System | PCU | Cost (in BP) |h
|antipersonnel weapon (heavy) | 0 | 5 + item level of weapon |
|antipersonnel weapon (longarm) | 0 | item level of weapon |
</div>
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' 10-ft.-radius spread; see text
* ''Duration'' instantaneous
</div>
You permeate [[radiation]] with mitigations from other realities, dissipating radiation effects in the spell's area; the radiation level you affect depends on your caster level, as shown on the table below. Once radiation has been dissipated, the environment in the area has no harmful effects from radiation, although this spell does not remove ongoing radiation-creating effects. An //antiradiation// spell counters an //[[irradiate]]// spell, as long as your caster level is greater than the caster level of the creature or effect that created the //irradiate// effect.
<div class= "table-wrapper">
| Caster Level | Radiation Level |h
| 6th or lower | Low |
| 7th–9th | Medium |
| 10th–16th | High |
| 17th or higher | Severe |
</div>
An antitoxin is a broad-spectrum medicinal designed to weaken all poisons in your system. When you take or are injected with an antitoxin, you gain a bonus (equal to 3 + the medicinal's tier) to saving throws against poison for a number of hours equal to its tier.
An antitoxin membrane consists of a colony of nanobots that operate on the molecular level to counter certain toxins. An antitoxin membrane provides a +4 circumstance bonus to saving throws against contact and injury diseases and poisons.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|antitoxin membrane | 5 | 3,000 | skin |
</div>
<div class="statblock">
* ''Tier'' 8
* Large destroyer
* ''Speed'' 8; ''Maneuverability'' average (turn 2); ''Drift'' 1
* ''AC'' 20; ''TL'' 21
* ''HP'' 190; ''DT'' —; ''CT'' 38
* ''Shields'' light 60 (forward 15, port 15, starboard 15, aft 15)
* ''Attack (Forward)'' heavy torpedo launcher (5d8)
* ''Attack (Port)'' light particle beam (3d6)
* ''Attack (Starboard)'' light particle beam (3d6)
* ''Attack (Aft)'' light EMP cannon (special)
* ''Attack (Turret)'' chain cannon (6d4)
* ''Power Core'' Pulse Orange (250 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' advanced short-range sensors, anti-hacking systems, crew quarters (common), mk 3 armor, mk 4 defenses, mk 3 trinode computer, self-destruct system; ''Expansion Bays'' [[cargo holds]] (2), [[escape pods]], [[passenger seating]]
* ''Modifiers'' +3 to any three checks per round, +4 [[Computers]] (sensors only)
* ''Complement'' 6 (minimum 6, maximum 20)
!!! CREW
* ''Captain'' [[Bluff]] +16 (8 ranks), [[Computers]] +13 (8 ranks), [[Diplomacy]] +16 (8 ranks), [[Engineering]] +13 (8 ranks), [[Intimidate]] +16 (8 ranks)
* ''Engineer'' [[Engineering]] +16 (8 ranks)
* ''Gunners (2)'' gunnery +14
* ''Pilot'' [[Piloting]] +21 (8 ranks)
* ''Science Officer'' [[Computers]] +16 (8 ranks)
</div>
A holdover from the company's days as a defense contractor during the Pact Worlds' war with the Swarm, Eclipse Innovations' Antumbra Division produces a small line of armed starships. The Antumbra Overseer is designed to protect high-profile sites and ferry individuals from one dangerous area to another. It boasts an impressive array of weapons and a durable hull, though its shields are less powerful than those of other vessels of the same size. The Overseer usually maintains a perimeter patrol near a single location, constantly scanning for potential threats. Antumbra has begun installing self-destruct systems in its ships to prevent its technology from falling into other companies' hands, but even if that system is compromised or bypassed, the Overseer's anti-hacking systems mean that any potential thieves won't have an easy time of it.
//Anvils of Torag// are extremely rare and highly valued relics that are believed to have come from the Five Kings Mountains of lost Golarion. Each anvil consists of a heavy iron block anchored to a 5-foot-diameter stone base engraved with magical runes and symbols. //Anvils of Torag// are much prized by dwarf collectors and the crafting guilds of dwarven star citadels, as the anvils are seen as a tangible link to Torag, the patron god of the dwarves, who disappeared during the Gap. While non-dwarf collectors often consider an //anvil of Torag// too precious to use, most dwarves think it's ridiculous to have a crafting relic and not actually use it.
An //anvil of Torag// aids in crafting equipment and magic items. If you use an //anvil of Torag// while crafting an item, you are considered to have 2 additional ranks in the appropriate crafting skill, allowing you to craft items of higher level than you would normally be able to create. A given //anvil of Torag// can be used to craft only one item per day.
Due its bulk and size, an //anvil of Torag// is generally not portable and must be properly anchored before use. An //anvil of Torag// can be installed on a starship in an arcane laboratory, a [[cargo hold]], or a [[tech workshop]], or it can be placed anywhere with room to store a Large vehicle.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//anvil of Torag// | 9 | 12,000 | 50 |
</div>
An anykey is a lock-picking device, consisting of a handle and a thin metal strip. As a standard action, you can insert the strip into a physical lock and activate the anykey. Doing so causes the device to analyze the lock and extrude polyfluid into the mechanism. The fluid then hardens. This process creates a key that reduces the DC of [[Engineering]] checks to open that lock by 10. Resetting the anykey takes a standard action.
An anykey comes with a charger that can take a standard battery and that holds the device when it's not in use. Each use of the anykey, including resetting it, takes 1 charge.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|anykey | 4 | 1,750 | L | 20 | 1/use |
</div>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links "[contains:source<currentTiddler>sort[title]]" class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<<list-links '[all[current]listed[source]]' class:index>>
<div class="statblock">
* ''CR'' 7; ''XP'' 3,200
* N Large vermin
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +14
!!! DEFENSE
* ''HP'' 105; ''RP'' 4
* ''EAC'' 19; ''KAC'' 21
* ''Fort'' +11; ''Ref'' +6; ''Will'' +9
* ''Defensive Abilities'' mutable; ''Immunities'' critical hits
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' claw +17 (2d6+11 S)
* ''Ranged'' spike +14 (2d8+7 P)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' spawn constituents
!!! STATISTICS
* ''Str'' +4; ''Dex'' +2; ''Con'' +5; ''Int'' —; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +19, [[Intimidate]] +14, [[Survival]] +14
* ''Other Abilities'' [[mindless]]
!!! ECOLOGY
* ''Environment'' temperate or warm plains
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Mutable ([[Ex]])'' Virtually every part of an apari's internal physiology can be effectively repaired or replaced at a moment's notice as constituents rush to fill the needed role. An apari is immune to critical hits, and when an apari would take ability damage or drain to a particular ability score, it can instead distribute that ability damage or drain as it wishes across all of its ability scores (though it must take at least 1 point in the targeted ability score).
''Spawn Constituents ([[Ex]])'' Most aparis retain a force of combat-ready constituents waiting on call to defend the hive—or in dire circumstances, to sacrifice themselves to give the apari a better chance of escape. As a move action, an apari can spend 1 Resolve Point and lose 20 Hit Points to spawn a constituent in an empty adjacent square. An apari can use this ability only if it has 40 or more Hit Points.
''Spike ([[Ex]])'' An apari's ranged attack has a range increment of 30 feet.
</div>
<<section 'Apari Constituent'>>
An apari is a living hive, its gigantic beetle-like carapace animated by generations of tiny insects for whom it serves as both home and queen. Nestled within every apari's exoskeleton is a mass of millions of writhing gray maggots, each no larger than a grain of rice. A constant stream of chemical signals, ferried by the living neurological system of the apari, directs the development of these maggots into the myriad forms needed both to support the hive's gestalt biological functions and to maintain a flexible population of individual bugs, each of which has an extremely specialized role. Aparis can be found on multiple worlds with various climates throughout the galaxy. So far no Pact Worlds entomologists have been able to trace their evolution back to a particular planet, though the fossil record seems to indicate that their original diaspora must have happened well before the Gap. A few fringe theories posit that aparis are progenitors of the Swarm, though this claim is contentious at best. How the unintelligent creatures might have traveled between solar systems is anyone's guess: some scholars believe they were deliberately seeded as livestock by a spacefaring race, others theorize they may have been placed there by planar travelers (likely insectile spellcasters from the city of Axis), and still others think they are the deliberately devolved children of a spacefaring race that chose regression into unthinking beings rather than face some species-wide threat or existential quandary.
Aparis quickly become a formidable force in almost any ecosystem to which they are introduced. Their constituents can forage for food (usually rotting vegetable material or carrion), while the hive itself hunts animals. Perhaps most disconcerting is when the two methods combine, with the apari tearing into a beast while its constituents stream into the wounds and devour it from the inside out. Additionally, aparis' considerable mutability provides them protection from threats that would seriously endanger more sedentary collective species, such as flooding or an intelligent competitor's targeted attempts at extermination.
When the resources available to a single apari permit it to create more constituents than its body can efficiently support, it travels to a location in the center of its feeding territory and becomes temporarily stationary. Some of its constituents burrow into the ground beneath it and begin ferrying portions of the parent apari's key biological systems—including half of its maggot core—while others continue to forage in the surrounding area to provide a steady stream of nutrients to the nascent hive. When the new hive is ready, the two aparis split the current hunting ground and expand the territories outward from that core, never explicitly working together but also not directly competing. Additionally, these aparis remain chemically linked, so that if disaster befalls one of them, surviving constituents can potentially join a linked hive and continue to thrive. In this way, entire planets have fallen to supercolonies of aparis whose influence spread across continents. Despite their mysterious presence on a variety of worlds, including both Triaxus and the insect moon of Nchak, aparis in the modern era are unable to colonize new worlds without an intelligent race to assist them. Fortunately for them, fried apari grubs are a delicacy in many Pact Worlds cultures, and attempts to hunt or ranch the creatures are dangerous but lucrative.
!! Encountering Constituents
It is possible for PCs to encounter constituents on their own, as they range from their hives to scavenge for food. While constituents spawned by an apari during a combat grant no additional XP, a single constituent is a CR 2 creature (worth 600 XP) and is usually encountered as a solitary creature or in a group of two to four.
<div class="statblock">
* ''CR'' —; ''XP'' —
* N Tiny vermin
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +7
!!! DEFENSE
* ''HP'' 20
* ''EAC'' 13; ''KAC'' 15
* ''Fort'' +6; ''Ref'' +4; ''Will'' +1
* ''Weaknesses'' hive dependency
!!! OFFENSE
* ''Speed'' fly 30 ft. ([[Ex]], perfect)
* ''Melee'' claw +10 (1d6+4 S)
* ''Offensive Abilities'' fungible
!!! STATISTICS
* ''Str'' +2; ''Dex'' +4; ''Con'' +1; ''Int'' —; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +12 (+20 when flying), [[Intimidate]] +7, [[Survival]] +7
* ''Other Abilities'' [[mindless]], reincorporate
!!! ECOLOGY
* ''Environment'' any land
* ''Organization'' collective (10+ plus 1 apari)
!!! SPECIAL ABILITIES
''Fungible ([[Ex]])'' An apari constituent can change its physiology to take advantage of its opponent's weaknesses. As a move action, it can alter the type of kinetic damage it deals with its claw attack (bludgeoning, piercing, or slashing).
''Hive Dependency ([[Ex]])'' An apari constituent can't voluntarily travel more than 200 feet from the apari that spawned it. If taken beyond that range against its will, it gains the [[sickened]] condition and becomes single-minded in its focus on returning to its apari. An apari constituent can survive for only 1 hour after the apari that spawned it dies (unless it finds another apari).
''Reincorporate ([[Ex]])'' As a standard action, an apari constituent adjacent to an apari can become part of the hive once again. The constituent's current Hit Points are added to the apari's, and the constituent is removed from play.
</div>
<div class="statblock">
* ''CR'' 15; ''XP'' 51,200
* CN Medium outsider (native)
* ''Init'' +7; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +26
!!! DEFENSE
* ''HP'' 275
* ''EAC'' 29; ''KAC'' 31
* ''Fort'' +19; ''Ref'' +17; ''Will'' +13
!!! OFFENSE
* ''Speed'' 30 ft., fly 30 ft. ([[Su]], perfect)
* ''Melee'' solar weapon +29 (8d6+24 S)
* ''Ranged'' thrown solar weapon +26 (8d6+24 S)
* ''Offensive Abilities'' [[flashing strikes|Flashing Strikes (solarian)]], solar storm, [[solarian's onslaught]], stellar revelations ([[black hole]] [35-ft. radius, pull 25 ft., DC 21], [[supernova]] [15-ft. radius, 16d6 F, DC 21])
!!! STATISTICS
* ''Str'' +9; ''Dex'' +7; ''Con'' +5; ''Int'' +3; ''Wis'' +1; ''Cha'' +5
* ''Skills'' [[Acrobatics]] +26 (+34 to fly), [[Athletics]] +26, [[Mysticism]] +31
* ''Languages'' Common, Kasatha
* ''Other Abilities'' perfect alignment, [[solar manifestation]] (solar weapon)
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, cluster (2–4), or constellation (5–8)
!!! SPECIAL ABILITIES
''Flashing Strikes ([[Ex]])'' This functions as the [[flashing strikes|Flashing Strikes (solarian)]] solarian class feature.
''Perfect Alignment ([[Su]])'' An apastra is always both fully [[graviton attuned|Stellar Mode]] and fully [[photon attuned|Stellar Mode]].
''Solar Manifestation ([[Su]])'' This functions as the [[solar manifestation]] solarian class feature.
''Solar Storm ([[Su]])'' Once a day, an apastra can give in to the gravitonic and photonic forces that rage within it, expelling this energy in a cataclysmic storm. The solar storm has a range of 60 feet and a 15-foot radius. Creatures that enter the storm or that begin their turns in it take 8d6 fire damage (Fortitude DC 21 half) and must succeed at a DC 21 Reflex save or be hurled 1d6×10 feet in a random direction and fall [[prone]] (creatures that hit a wall or other barrier take no additional damage). The storm is difficult terrain and obscures all sight beyond 5 feet. Creatures within 5 feet of an attacker while in the storm have concealment. When the apastra uses solar storm, it can maintain the storm for up to an additional 1d3 rounds. An apastra must take a full action each round to maintain the storm, and it can move the storm up to 30 feet as part of that full action. An apastra is immune to the effects of its own or any other apastra's solar storm.
''Solarian's Onslaught ([[Ex]])'' This functions as the [[solarian's onslaught]] solarian class feature.
''Stellar Revelations ([[Su]])'' An apastra can use the [[black hole]] and [[supernova]] solarian stellar revelations. It can use either stellar revelation once before that revelation needs to recharge. Once it has used each stellar revelation once, they both recharge in 1d4 rounds.
''Throw Solar Weapon ([[Ex]])'' An apastra can throw its solar weapon at a foe as a ranged attack with a 40-foot range increment. This does not cause the weapon to be dismissed. An apastra's thrown solar weapon returns to its hand just before its next turn.
</div>
Those equinoxians who cannot maintain balance are driven mad, becoming the tragic and powerful figures known as apastras. Apastras seek to cause imbalance and collapse wherever they can, and solarians justly fear the enraged creatures.
You embody the cataclysmic distortion and acceleration of natural entropy when exposed to reality-warping magic.
!! Aspect Insight
You gain [[Improved Combat Maneuver]] (grapple) as a bonus feat and a +2 insight bonus to [[Mysticism]] checks.
!! Aspect Embodiment
Once per combat, when a spell or spell-like ability that requires an attack roll misses you, or you succeed at a saving throw to negate the effects of a spell or spell-like ability, you can gain 1 Entropy Point without taking any additional actions.
!! Aspect Catalyst
Each foe within 30 feet takes damage equal to your vanguard level and is subject to an additional effect (Fortitude negates). Roll 1d6 for each affected foe, using the result to determine the damage type and effect.
''Improved:'' The damage increases to twice your vanguard level. You can roll 1d6 twice for each affected foe, choosing one of the two results to apply.
<div class= "table-wrapper">
| d6 |Damage and Effect |h
| 1 |Acid damage and [[entangled]] for 1 round |
| 2 |Bludgeoning damage and knocked [[prone]] |
| 3 |Cold damage and [[fatigued]] for 1 round |
| 4 |Electric damage and [[staggered]] for 1 round |
| 5 |Fire damage and [[burning]] 1d6 per 4 vanguard levels |
| 6 |Sonic damage and [[sickened]] for 1 round |
</div>
!! Aspect Finale
When you’re affected by a hostile spell that you have identified with a Mysticism check, you can spend 3 Entropy Points as a reaction to reflect some of the magic back at the spellcaster (Fortitude negates), causing them to also be affected by the spell as though they were one of its original targets.
Defying lasers' reputation for pinpoint accuracy, an apocalypse beam is a portable artillery laser cannon that, when braced, carves furrows across landscapes and enemy formations alike.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|apocalypse beam, corona | 8 | 9,500 | 3d6 F | 60 ft. | burn 1d6 | 40 charges | 10 | 2 |[[line|Line (weapon property)]], [[sniper]] (150 ft.), [[unwieldy]] |
|apocalypse beam, perihelion | 14 | 75,000 | 7d6 F | 60 ft. | burn 2d6 | 80 charges | 10 | 2 |[[line|Line (weapon property)]], [[sniper]] (200 ft.), [[unwieldy]] |
|apocalypse beam, zenith | 20 | 875,000 | 14d6 F | 60 ft. | burn 4d6 | 100 charges | 20 | 2 |[[line|Line (weapon property)]], [[sniper]] (250 ft.), [[unwieldy]] |
</div>
Magically resonant crystals sometimes develop in regions ravaged by supernatural cataclysms. When carefully heated and incorporated into a bow’s construction, these crystals impart destructive force to the weapon’s arrows, creating an apocalypse bow.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Bulk |Special |h
|apocalypse bow, tactical | 5 | 3,300 | 1d8 P | 60 ft. | [[corrode]] (1d4) | drawn | 1 |[[analog]], [[force]], [[quick reload]] |
|apocalypse bow, advanced | 9 | 13,600 | 2d8 P | 60 ft. | [[corrode]] (1d6) | drawn | 1 |[[analog]], [[force]], [[quick reload]] |
|apocalypse bow, elite | 13 | 40,000 | 4d8 P | 60 ft. | [[corrode]] (2d6) | drawn | 1 |[[analog]], [[force]], [[quick reload]] |
|apocalypse bow, paragon | 17 | 363,000 | 7d8 P | 60 ft. | [[corrode]] (3d6) | drawn | 1 |[[analog]], [[force]], [[quick reload]] |
</div>
An //apocalypse crystal// causes the damage dealt by your solarian weapon to function as a force effect. On a critical hit, your target's molecules begin to lose cohesion, inflicting terrible damage.
<div class="table-wrapper">
|Weapon | Level | Price | Damage | Critical | Bulk |h
|//apocalypse crystal//, shard | 1 | 150 | +1 | [[corrode]] 1d4 | — |
|//apocalypse crystal//, least | 5 | 3,050 | +1d4 | [[corrode]] 1d6 | — |
|//apocalypse crystal//, minor | 8 | 9,500 | +1d6 | [[corrode]] 1d6 | — |
|//apocalypse crystal//, lesser | 11 | 24,900 | +2d6 | [[corrode]] 1d6 | — |
|//apocalypse crystal//, standard | 14 | 74,000 | +3d6 | [[corrode]] 2d6 | — |
|//apocalypse crystal//, greater | 17 | 265,000 | +4d6 | [[corrode]] 3d6 | — |
|//apocalypse crystal//, true | 20 | 776,000 | +6d6 | [[corrode]] 5d6 | — |
</div>
Upon drinking this elixir, your coloration and the general form of your features instantly and permanently changes. Within the range that is normal for your race and sex, you can select any skin tone, hair and eye color, and alter the nature of such things as the shape or your nose or chin, the length of your fingers, broadness of your frame, and so on. You are still recognizable as yourself unless you attempt a [[Disguise]] check to alter your features enough to conceal your identity (comparing the result of this Disguise check to any effort to determine if you are the same person as your original appearance). In no case can you take on the exact appearance of another creature (even with a Disguise check; the level of control is not that fine).
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//appearance change serum// | 1 | 75 | — |
</div>
<<tabs "[contains:tab[Appendices]]" "Tables" "$:/state/tabIndex" "Index Template">>
You can repurpose your entropic abilities to cast several minor spell-like abilities, each of which you can cast 3 times per day: //[[detect magic]]//, //[[energy ray]]// (acid only), and //[[token spell]]//. You can’t use your //token spell// spell-like ability to create objects.
[[Contemplatives]] can apply their extreme intelligence to just about any situation. This augmentation overstimulates your brain with tiny electrical charges when you need it most. Once per day before attempting a skill check or saving throw against a creature, you can use your bonus for the skill associated with that creature's type (such as [[Life Science]] for an ooze or [[Mysticism]] for an outsider) in place of your normal bonus.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|applied knowledge graft | 1 | 400 | brain |
</div>
The //apprehending// fusion causes the weapon to grow spikes and overwrought iron fixtures, as befits its use by the Hellknights. When an //apprehending// weapon hits an enemy, you can activate the fusion as a reaction to perform a trip combat maneuver against that target with the same attack bonus as for the weapon attack. Additionally, the target must succeed at a Fortitude saving throw (DC = 10 + half the weapon's item level + the ability score modifier you apply to attack rolls with the weapon) or be unable to cast spells or spell-like abilities for 1 round. Once the weapon has used this ability, it cannot use it again until you take a 10-minute rest to regain Stamina Points.
Headteachers are prestigious scholars who have become revered experts in their fields after decades of dedication. Like these famous osharu scholars, you pride yourself in exuding not only confidence but warmth, which helps you mentor others in their fields.
''Prerequisites:'' [[Life Science]] or [[Physical Science]] 5 ranks.
''Benefit:'' Three times per day, you can automatically succeed at an attempt to aid another on an Intelligence- or Wisdom-based check. Additionally, each time you succeed at a [[Diplomacy]] check to [[gather information]], you can learn one additional piece of information.
<div class="statblock">
* ''CR'' 16; ''XP'' 76,800
* N Large monstrous humanoid
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft; ''Perception'' +28
!!! DEFENSE
* ''HP'' 300; ''RP'' 6
* ''EAC'' 30; ''KAC'' 32
* ''Fort'' +20; ''Ref'' +18; ''Will'' +16
* ''Defensive Abilities'' [[ferocity]]; ''Immunities'' cold; ''Resistances'' acid 10
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' gore +31 (6d10+26 P)
* ''Ranged'' ice shard +28 (7d6+16 C & S; critical [[stagger]] [DC 22])
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' psychic horns
* ''Spell-Like Abilities'' (CL 16th)
** 1/day—//[[mass inflict pain]]// (DC 22)
** 3/day—//[[mind thrust]]// (5th level; DC 21)
** At will—//[[hold monster]]// (DC 20), //[[share language]]//
!!! STATISTICS
* ''Str'' +10; ''Dex'' +4; ''Con'' +7; ''Int'' +3; ''Wis'' +5; ''Cha'' +2
* ''Skills'' [[Athletics]] +33, [[Mysticism]] +28, [[Survival]] +28
* ''Languages'' Aqlathian
!!! ECOLOGY
* ''Environment'' any (Lathlath IV)
* ''Organization'' solitary, pair, or squad (3–6)
!!! SPECIAL ABILITIES
''Ice Shard ([[Su]])'' As a ranged attack, an aqlath can psychically manifest and hurl a shard of ice. This attack targets EAC and has a range of 40 feet.
''Psychic Horns ([[Su]])'' An aqlath's crown of horns is a psychic manifestation that allows them to wrench revitalizing energy from an enemy's mind. An aqlath's crown always has as many protrusions as their current number of Resolve Points. When a creature fails a saving throw against one of the aqlath's mind-affecting spell-like abilities, the aqlath can spend 1 Resolve Point as a reaction to regain 40 Hit Points. When an aqlath has 0 Resolve Points (and therefore no more horns in their crown), they can't use their spell-like abilities.
</div>
Aqlaths resemble shaggy, humanoid boars with large tusks and three legs. As the predominant species on Lathlath IV, these creatures have adapted to the perpetual winter caused by the inhospitable planet's distant position from its sun. Aqlaths value physical might and insight, and over thousands of generations, their people have grown strong and developedvpowerful communal bonds. Good sites to build large cities on Lathlath are rare; yet long ago, aqlaths learned to hew the permafrost and stone of their cold world, working together to create settlements and fortifications. Aqlaths warm their buildings by tapping into geothermal heat beneath the thick planetary crust. Centuries of digging for heat have made qlaths skilled miners, and they've learned that the crust of their world contains many rare and valuable elements. Their sudden arrival in interplanetary trading markets has attracted many enemies who wish to subjugate the aqlaths and steal their planet's wealth—including sivvs.
Even a young aqlath towers several feet taller than a human. Aqlaths grow ever larger as they age, reaching heights of 15 feet or more. As they mature, aqlaths develop psychic abilities that allow them to inflict their will on others. These abilities manifest as a crown of psychically charged bone horns sprouting from their furry heads. Larger aqlaths have bigger and more numerous horns, therefore possessing stronger psychic abilities. Only the most misanthropic aqlaths use their psychic abilities against others of their species; as with their great strength, aqlaths hone their mental powers only to defend their world against alien aggressors.
Your brain has been modified with an additional lobe that grants you a limited form of telepathic communication with aquatic creatures. You can communicate with animals, magical beasts, plants, and vermin that don’t have a language and are native to aquatic biomes; this includes such creatures with the aquatic subtype and might also include other creatures at the GM’s discretion. This ability doesn’t make these creatures friendly. The range of this ability is 30 feet or the range of your [[telepathy]] or [[limited telepathy]], whichever is larger. You can use language-dependent effects on these creatures, attempt [[Intimidate]] checks to [[bully]] them, and attempt [[Diplomacy]] checks to [[change their attitude|Change Attitude (diplomacy)]].
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|aqua-empathic lobe | 4 | 2,000 | brain |
</div>
By tinkering with a weapon, you improve its underwater performance.
''Activity:'' You spend the day modifying a piece of weaponry to work well underwater, sealing joints and improving its aquadynamics. You must spend UPBs equal to 10% of the item's value.
''Benefit:'' A single weapon gains the [[underwater]] special property—when you use it underwater, you ignore the normal –2 penalty to attack rolls, and the weapon deals full damage on a hit.
<div class="statblock">
* ''Level'' 8; ''Price'' 32,000
* Huge land and water vehicle (20 ft. wide, 20 ft. long, 12 ft. high)
* ''Speed'' 30 ft., full 350 ft., 40 mph (climb and land); 20 ft., full 260 ft., 30 mph (swim)
* ''EAC'' 20; ''KAC'' 22; ''Cover'' total cover (enclosed)
* ''HP'' 130 (65); ''Hardness'' 11
* ''Attack (Collision)'' 8d10 B (DC 14)
* ''Attack'' [[underwater]] heavy [[sonic bolter]] (2d10 So; critical [[sicken]])
* ''Modifiers'' –2 [[Piloting]], –3 attack (–5 at full speed)
* ''Systems'' autopilot ([[Piloting]] +16), clingers, enhanced sensors ([[darkvision]] 120 ft.), manipulator, planetary comm unit
* ''Passengers'' 5
!!! SPECIAL ABILITIES
''Enclosed ([[Ex]])'' In addition to having total cover, the pilot and passengers in an enclosed vehicle can't use their personal weapons to attack creatures and objects outside the vehicle, though they can use the vehicle's weapons (if any).
</div>
Similar in design to other crawlers, this walker traverses ocean floors, the underside of sea ice, and other terrain too tight for submarines to maneuver around.
An aquatic creature lives much, if not all, of its life in the water.
* ''Aquatic Subtype:'' Most aquatic creatures have the [[aquatic|aquatic subtype graft]] subtype, meaning they breathe water. A creature that can breathe air and water has the aquatic subtype and the [[amphibious]] special ability. If an aquatic creature lacks the aquatic subtype, it has the [[hold breath]] special ability.
* ''Depth Inured:'' You can make aquatic creatures immune to the dangers of extreme depths without counting it against their special abilities.
* ''Senses:'' You can add one sense for free if you wish. Among aquatic creatures, [[blindsense]] (scent, sound, or vibration) is common. Some such creatures have sonar, granting them [[blindsight]] (sound) out to 120 feet. A few aquatic predators have [[tracking]] (scent), normally representing the ability to sense blood in the water.
* ''Skills:'' [[Athletics]]. The creature might have penalties to such checks on land.
* ''Swimming:'' Aquatic creatures normally have a swim speed based on their CR. This swim speed is typically 20 feet for creatures with a CR of 2 or less, 30 feet for CR 3–6, 40 feet for CR 7–9, 50 feet for CR 10–12, and 60 feet for CR 13 or higher (though you can make creatures faster or slower, based on the creature's concept and other abilities). Many aquatic creatures have no other form of movement, though you can make flying, walking, or burrowing aquatic creatures if you wish.
These creatures are often native to environments that are mostly or entirely underwater.
* ''Traits:''
** swim speed
** [[water breathing]]
** [[Athletics]] as a master or good skill
** if it can breathe air, it also gains the [[amphibious]] special ability.
Aquatic terrain can be one of the least hospitable to PCs because most can't breathe underwater. The ocean floor holds many marvels, including undersea analogues of any of the other terrain elements described in this chapter, but if characters find themselves in the water because they were bull-rushed off the back of a transport ship, the kelp beds or volcanic vents hundreds of feet below them don't matter. The most common rules sections to reference when using aquatic terrain are [[Suffocation and Drowning]], [[Extreme Depths]],and [[Underwater Combat]]. The rules for swimming with the [[Athletics]] skill are also critical for many creatures operating in an aquatic environment.
!! Deep Water
Lakes and oceans simply require a swim speed or successful Athletics checks to move through (typically, DC 10 in calm water, DC 15 in rough water, DC 20 in stormy water, and DC 30 in maelstrom water). Characters need a way to breathe if they're underwater; lacking that, they risk drowning. When underwater, characters can move in any direction, including up and down.
!! Stealth And Detection Underwater
How far a character can see underwater depends on the water's clarity. As a guideline, creatures can see 4d8×100 feet if the water is clear and 1d8×10 feet in murky water. Running water is always murky, unless it's in a particularly large, slow-moving river. It is hard to find cover or concealment to hide underwater (except along the sea floor).
<div class="statblock">
* <<levels>>
* ''School'' transmutation (water)
* ''Casting Time'' 1 standard action; see text
* ''Range'' personal
* ''Duration'' see text (D)
</div>
You temporarily transform part or all of your body into water, gaining unique abilities.
''1st:'' When you cast //aqueous form// as a 1st-level spell, you gain a swim speed of 30 feet for 1 round, and changing direction while swimming doesn't cost additional movement.
''2nd:'' When you cast //aqueous form// as a 2nd-level spell, you're affected as per the 1st-level version. Also for 1 round, you reduce the amount of bludgeoning, slashing, and fire damage you take by an amount equal to half your caster level (this reduction doesn't stack with [[DR]] or [[resistances|Energy Resistance]] you might already have), and you gain [[vulnerability]] to electricity.
''3rd:'' When you cast //aqueous form// as a 3rd-level spell, you're affected as per the 2nd-level version except the spell lasts 1 minute per caster level. In addition, you gain a +4 circumstance bonus to AC against combat maneuvers while you're completely submerged in water.
''4th:'' When you cast //aqueous form// as a 4th-level spell, you're affected as per the 3rd-level version except the spell lasts 10 minutes per caster level, and you gain [[concealment]] while you're completely submerged in water.
''5th:'' When you cast //aqueous form// as a 5th-level spell, you're affected as per the 4th-level version except the spell lasts for 1 hour per caster level. You can cast the 5th-level version of //aqueous form// as a purely defensive reaction when you're about to take damage, but when you do so, you can't take a standard action on your next turn.
Aqueous creatures are native denizens of the Elemental Plane of Water or similar landless environments, able to survive both in and out of water.
* ''CR:'' 1+
* ''Grafts:'' add the water subtype graft (swim speed should equal creature's fastest movement speed)
* ''Traits:''
** [[amphibious]]
** natural attacks that deal bludgeoning or slashing damage deal piercing damage instead
** natural attacks that deal electricity or fire damage deal cold damage instead
** if the creature is from the Elemental Plane of Water, it gains the extraplanar subtype when it isn't on that plane
Arabani Arms has an exclusive ranged-weapon line called Karkaken. These high-impact weapons are modified to cause maximum discomfort, adding the [[demoralize|Demoralize (critical)]] critical hit effect to the weapon. If the weapon already has a critical hit effect, you choose whether to apply the weapon's normal critical hit effect or the demoralize effect each time. A weapon that already has the demoralize critical hit effect can't benefit from this upgrade. A Karkaken weapon costs 20% more than normal.
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* N Large animal
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +16
!!! DEFENSE
* ''HP'' 125
* ''EAC'' 20; ''KAC'' 22; (+4 against combat maneuvers in home territory)
* ''Fort'' +12; ''Ref'' +12; ''Will'' +7
* ''Defensive Abilities'' territorial pride; ''Immunities'' cold; ''Resistances'' sonic 10
!!! OFFENSE
* ''Speed'' 60 ft.
* ''Melee'' bite +19 (3d4+14 P) or antlers +19 (3d4+14 B plus 1d6 So)
* ''Multiattack'' antlers +13 (1d6+14 P plus 1d6 So), bite +13 (1d6+14 P), 2 claws +13 (1d6+14)
* ''Ranged'' antler reverberation +16 (2d8+8 So plus [[stagger]] [DC 16]; critical [[deafen]] [DC 16])
* ''Offensive Abilities'' [[pounce]]
!!! STATISTICS
* ''Str'' +6; ''Dex'' +4; ''Con'' +2; ''Int'' –4; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Athletics]] +21, [[Stealth]] +16 (+8 in home territory), [[Survival]] +16
* ''Other Abilities'' arctic guardian
ECOLOGY
* ''Environment'' arctic (Akiton)
* ''Organization'' solitary, mating pair, or glaring (1 plus 2–4 [[arabuk yearlings]])
!!! SPECIAL ABILITIES
''Antler Reverberation ([[Ex]])'' Using its antlers to amplify its chattering, an arabuk can make a ranged attack as a standard action against a single target. This attack has a range increment of 40 feet, targets EAC, and has the [[deafen]] critical hit effect. A creature hit by the attack must succeed at a DC 16 Fortitude save or become [[staggered]] for 1 round.
''Arctic Guardian ([[Ex]])'' An arabuk ignores difficult terrain and visibility penalties from snow and heavy snow.
''Territorial Pride ([[Ex]])'' An arabuk rarely masks its presence, taking a –8 penalty to [[Stealth]] while in its home territory. Instead, it becomes a pillar of obstinacy, gaining a +4 circumstance bonus to AC against combat maneuvers unless the attacker is two or more size categories larger than the arabuk.
</div>
<<section 'Arabuk Yearling'>>
In the snowy landscape of Akiton's Winterlands, the carnivorous, deerlike arabuks bellow and chatter as they stride across drifts of snow and ice. Once docile and regal guardians of Akiton's prehistoric wilds, arabuks have evolved into stalking predators that feast upon the planet's remaining fauna. Their mouths brim with sharp, flesh-cutting teeth, pointed like dozens of long needles. Their four eyes are forward set with two on each side and slit pupils for exceptional night vision. All arabuks have a set of large antlers, curved symmetrically in a crown above their heads. Their patterned, leopard-like bodies assist them in blending in with the rugged tundra. When hunting, the creatures' padded and clawed front feet allow them to evenly spread their weight as they traverse precarious snowbanks. Arabuks can also leap great distances and balance on the jagged edges of mountains with their sturdy and powerful hoofed back legs.
Most arabuks live in solitude except to mate, due to their tendency to obsessively guard their territory. The ancient Ice Clans of Akiton took advantage of this trait by using the beasts to protect their vulnerable settlements. Few Ice Clans have held onto their arabuk herds, and those that have must exercise great caution in managing the temperamental yearlings to harvest the antlers they shed each year.
Thanks to the unique composition of arabuks' antlers, they vibrate with high intensity in the presence of sound waves. This effect enables arabuks to amplify their vocalizations into deafening attacks. When hunting, they chatter and click their jaws while eyeing their prey intensely, producing a swelling sound from their antlers that they unleash in a concentrated assault. Their amplified yowls can have enough power to shake entire mountains and cause avalanches, but producing such intense vocalizations is painful for arabuks. Consequently, they exercise careful control over their sonic attacks.
Arabuks occasionally form groups called glarings, usually composed of several similarly aged arabuk yearlings following the guidance of a more established elder arabuk. Due to the harsh nature of their arctic environs, few arabuks survive for more than 5 years, but a fierce and lucky few live up to 25 years.
Mature arabuks are a regal sight to behold, as they appear much larger than their younger counterparts and stride with confidence through their territories. The plush manes of white fur surrounding their necks make them easily identifiable. While younger arabuks keep their heads low as they stalk the snow drifts, mature arabuks keep their heads upright, and the wind through their antlers produces a haunting song that echoes across the snow-muted landscape. When lost in a blizzard, travelers can rely on this song to follow the arabuk, who's undoubtedly traveling to fairer weather.
The Ice Clans and other conservation groups often stay on the lookout for hardy freelancers to capture potential mating pairs of arabuks. The frigid weather, competition against poachers, and the arabuks themselves make this lucrative opportunity dangerous, however. Arabuks' sonic attacks rarely affect the environment when they hunt, but when acting in defense, they unleash desperate bursts that gradually weaken the surrounding terrain's integrity and cause ever more frequent and dangerous avalanches. Xenowardens and other protectors of nature insist that with protection and a careful breeding program, these majestic creatures might one day return to their role as the respected and regal guardians of Akiton's poles.
<<section 'Reverberation Amplifier'>>
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* N Medium animal
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +8
!!! DEFENSE
* ''HP'' 40
* ''EAC'' 14; ''KAC'' 16
* ''Fort'' +7; ''Ref'' +7; ''Will'' +2
* ''Resistances'' cold 10, sonic 5
!!! OFFENSE
* ''Speed'' 40 ft.
* ''Melee'' bite +11 (1d6+7 P) or antlers +11 (1d4+7 B plus 1d6 So)
* ''Ranged'' antler reverberation +8 (1d4+3 So plus [[stagger]] [DC 12]; critical [[deafen]] [DC 12])
* ''Offensive Abilities'' [[pounce]]
!!! STATISTICS
* ''Str'' +4; ''Dex'' +2; ''Con'' +1; ''Int'' –4; ''Wis'' +1; ''Cha'' +0
* ''Skills'' [[Athletics]] +13, [[Stealth]] +8, [[Survival]] +8
* ''Other Abilities'' arctic guardian
!!! ECOLOGY
* ''Environment'' arctic (Akiton)
* ''Organization'' solitary, pair, or glaring (2–4 plus 1 [[arabuk]])
!!! SPECIAL ABILITIES
''Antler Reverberation ([[Ex]])'' See [[arabuk]]; the save DC is 12.
''Arctic Guardian ([[Ex]])'' See [[arabuk]].
An //Araznian crusader helm// replaces a suit of armor’s normal helmet (if any) and is incorporated into the armor’s normal environmental protections; these protections don’t function if the helmet is removed. If the armor has an available upgrade slot, the helm takes up one of them; otherwise, the helm counts as one of two worn magic items.
While wearing an Araznian crusader helm, the first time each day you attempt a Will saving throw against a magical effect created by an undead, roll the saving throw twice and take the best result. You can’t gain the effects of more than one //Araznian crusader helm// each day.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//Araznian crusader helm// | 4 | 2,100 | L |
</div>
A creature is arboreal if it not only lives in forests but also lives primarily in the trees.
* ''Climbing:'' Arboreal creatures are great climbers and gain a climb speed equal to at least half their land speed.
* ''Flying:'' Some arboreal creatures fly. You can give arboreal creatures a typical fly speed, as flying creatures find shelter high and plentiful in forests.
* ''Senses:'' You can optionally add senses to an arboreal creature. Keen hearing is common among arboreal creatures, which can't rely on sight in dense vegetation. You can grant them [[blindsense]] (scent) or [[blindsight]] (sound), generally with a 30-foot range.
* ''Skills:'' [[Acrobatics]], [[Athletics]]
The attack's energy leaps to a second creature. This secondary target must be within 10 feet of your original target and must be the creature closest to the original target (you choose if multiple creatures are equidistant). Roll the amount of damage listed in the weapon's arc—the secondary target takes this damage (not multiplied by the critical hit), of whatever type the weapon deals.
Flanked by large handles, an arc caster bristles with capacitors and antennae that release more energy than it can realistically control. While many shock weapons have a chance to arc to a second target on a hit, the arc caster is designed to achieve that feat on every shot, and particularly well-aimed strikes can sometimes arc twice. The storm and tempest models feature improvements that build upon the capabilities of static and aurora arc casters. Since there is little way to control which creatures are struck on the subsequent arcs, arc casters are generally used only by solo combatants or those with little regard for their allies' well-being. More rarely, party members may take particular precautions against electricity damage, such as with a //[[resistant armor]]// spell or an [[electrostatic field]] armor upgrade, to protect themselves from an ally wielding an arc caster.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|arc caster, static | 1 | 375 | 1d8 E | 60 ft. | [[second arc]] 1d6 | 20 charges | 2 | 2 |[[first arc]] 1d6, [[unwieldy]] |
|arc caster, aurora | 5 | 3,160 | 2d6 E | 60 ft. | [[second arc]] 1d6 | 40 charges | 2 | 2 |[[first arc]] 1d6, [[unwieldy]] |
|arc caster, storm | 11 | 25,600 | 5d6 E | 80 ft. | [[second arc]] 2d6 | 40 charges | 4 | 2 |[[first arc]] 2d6, [[unwieldy]] |
|arc caster, tempest | 17 | 261,000 | 10d6 E | 80 ft. | [[second arc]] 4d6 | 40 charges | 5 | 2 |[[first arc]] 4d6, [[unwieldy]] |
</div>
Arc emitters discharge a cone of electrical energy that can damage and stun anyone within its area. Advanced arc emitters can be used at a longer range and are used by military forces to stun and subdue groups of enemies.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|arc emitter, tactical | 2 | 750 | 1d4 E | 15 ft. | — | 20 charges | 4 | 1 |[[blast]], [[stun]], [[unwieldy]] |
|arc emitter, advanced | 9 | 13,200 | 2d4 E | 30 ft. | — | 40 charges | 10 | 1 |[[blast]], [[stun]], [[unwieldy]] |
</div>
Arc pistols fire deadly, stunning blasts of electricity at ranged targets. They have a two-pronged emitter that directs the electrical blast and a bulky chamber that holds the capacitor.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|arc pistol, static | 2 | 750 | 1d6 E | 50 ft. | [[arc]] 2 | 20 charges | 2 | L |[[stun]] |
|arc pistol, aurora | 13 | 45,700 | 3d6 E | 50 ft. | [[arc]] 2d6 | 40 charges | 2 | L |[[stun]] |
|arc pistol, storm | 18 | 365,500 | 3d12 E | 50 ft. | [[arc]] 4d6 | 100 charges | 10 | L |[[stun]] |
</div>
Arc rifles fire deadly electrical blasts and have a longer range than arc pistols. Like arc pistols, arc rifles can stun targets that are not killed outright by the electricity damage.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|arc rifle, static | 6 | 4,200 | 1d12 E | 70 ft. | [[arc]] 1d6 | 40 charges | 1 | 2 |[[stun]] |
|arc rifle, aurora | 11 | 24,500 | 2d12 E | 70 ft. | [[arc]] 2d6 | 40 charges | 1 | 2 |[[stun]] |
|arc rifle, storm | 16 | 190,300 | 4d12 E | 80 ft. | [[arc]] 4d6 | 80 charges | 2 | 2 |[[stun]] |
|arc rifle, tempest | 19 | 622,000 | 6d12 E | 80 ft. | [[arc]] 6d6 | 100 charges | 2 | 2 |[[stun]] |
</div>
As a standard action, you create a devastating energy stream that arcs between your custom rig and your drone, creating a line effect; to use this ability, your custom rig must be in your possession and your drone must be within 30 feet of you. For each advanced drone mod your drone has, the arc deals 1d8 electricity damage to each creature in the line; affected creatures can attempt Reflex saving throws to halve the damage (DC = 10 + half your mechanic level + your Intelligence modifier). The damage increases by 1d8 at 4th level and every three levels thereafter. You can instead activate this ability as a full action to increase the damage dice to d10s.
Once you’ve activated this drone mod, you can’t do so again until you’ve rested for 10 minutes to regain Stamina Points.
Much like the pre-Gap arcane academy of the same name, the Arcanamirium on Absalom Station is a prestigious institution of magical learning. Numerous ancient and alien artifacts are stored in the university's vaults, and many sages trained at the institution thus specialize in studying magic items. Arcanamirium sages learn to hack an item's magical field, which allows them to unlock powers unavailable to normal users.
Most Arcanamirium sages are mystics and technomancers who studied at the university, but other characters can be Arcanamirium sages, such as explorers who investigate ancient sites of magical power or adventurers who want to augment their abilities with magic.
The Arcanamirium sage archetype grants alternate class features at 2nd, 6th, 9th, 12th, and 18th levels.
!! Magic Item Scholar (2nd)
As an Arcanamirium sage, you have an almost instinctual grasp over magic and hybrid items. You gain an insight bonus equal to half your class level to [[Engineering]] and [[Mysticism]] checks to [[identify|Identify Magic Item]] and [[repair|Repair Magical Item]] hybrid and magic items, and you don't need //[[detect magic]]// to determine whether an object is a magic item or to identify a magic item. You can also decipher magical inscriptions that would otherwise be unintelligible or, as a full action, identify any spells encoded in a [[spell gem]], even if you aren't a spellcaster.
You gain access to the spell //[[identify]]//. If you have the spells class feature, you add //identify// to your list of spells known, and treat it as a spell on your class spell list. If you already have //identify// as a spell known, you instead gain an additional 1st-level spell known of your choice from your class spell list. If you do not have a class spell list or spells known, you gain //identify// as a spell-like ability you can cast twice per day.
Additionally, in typical settlements, you can find and purchase any hybrid or magic item with an item level up to your character level + 2. As normal, the GM can restrict access to some items regardless of their level.
!! Spell Gem Manipulation (6th)
Once per day, while holding a spell gem in your hand, you can cast the spell encoded within the gem using a spell slot of the same level or higher, just as though you were casting one of your spells known. The spell must be on your class's spell list and cannot require expensive materials as part of its casting. If the spell normally requires an expenditure of Resolve Points to cast, you must expend the same number of Resolve Points to use this ability. Using a spell gem this way doesn't expend the magic encoded within the gem. If you aren't a spellcaster, once per day you can instead cast a spell from a spell gem as though you were a spellcaster (expending the magic normally), as long as the spell gem's item level isn't higher than your character level.
You also gain access to //[[augury]]//, using the same rules as for gaining access to //identify// in the magic item scholar alternate class feature.
!! Magic Item Attunememt (9th)
You can wear up to three hybrid or magic items at a time and have them all function normally.
You also gain access to //[[arcane sight]]//, using the same rules as for gaining access to identify in magic item scholar.
!! Recharge Magic Item (12th)
Once per day, you can expend 1 Resolve Point to refresh a magic item's daily charges, even if the magic item has already refreshed its charges for that day. The item level of this magic item can't be higher than your character level. This doesn't affect magic items that don't have charges that refresh each day.
!! Greater Magic Item Attunememt (18th)
You can wear up to four hybrid or magic items at a time and have them all function normally.
You tap into the universe’s raw magic, channeling this energy to empower your spellcasting, suppress others’ magic, and protect yourself from harm. You’re a magical innovator, capable of tweaking and manipulating magical energy to suit your needs.
* ''Associated Deities:'' Eloritu, Lissala, Nyarlathotep, Pharasma
* ''Associated Skills:'' [[Intimidate]] and [[Mysticism]]
* ''Spells:'' 1st–//[[identify]]//, 2nd–//[[dampen spell]]//, 3rd–//[[dispel magic]]//, 4th–//[[mystical aegis]]//, 5th–//[[greater dispel magic]]//, 6th–//[[greater magic seal]]//
!! Scouring Aura (1st)
Whenever you cast a spell, you emanate magical energy for a number of rounds equal to your Wisdom modifier (minimum 1). During this time, enemies that enter or begin their turn in a space adjacent to you take fire damage equal to the level of the spell you cast. When you would take damage from an attack or spell, you can end your scouring aura as a reaction to reduce the damage dealt by an amount equal to twice the level of the spell you cast (minimum 0 damage).
!! Spell Echo (3rd)
As a reaction whenever you cast a spell that has no effect (such as the affected creatures all succeeding at saving throws or being immune), you can spend a number of Resolve Points equal to half the spell’s level (rounded up) to capture the spell’s magical energy and retain it as a spell echo for a number of rounds equal to your Wisdom modifier (minimum 1). Once during this time, you can cast the captured spell a second time by expending the spell echo instead of expending a spell slot. You can have only one spell echo at a time.
!! Arcane Manipulation (6th)
You can spend 1 Resolve Point when casting a spell to augment it in one of the following ways: the spell’s duration increases by 50%, the spell’s range increases by 50%, or the spell’s damage increases by an amount equal to half your mystic level.
!! Eldritch Sense (9th)
Whenever your scouring aura is active, you can sense magical energy. This grants you [[blindsense]] (magic) for a range of 10 feet × the level of the spell that triggered scouring aura, which senses nearby magic in the area as //[[detect magic]]//.
!! Spell Consumption (12th)
You gain [[spell resistance]] equal to 6 + your mystic level. As a reaction when you would be the target of a spell, you can increase your spell resistance to 11 + your mystic level against that spell. Once you’ve used this reaction, you can’t use it again until you take a 10-minute rest to recover Stamina Points. Once per hour, when a spell fails to overcome your spell resistance, you absorb part of that spell’s energy and use it to fuel your spellcasting; you regain an expended 1st-level mystic spell slot.
!! Unleash Magic (15th)
Once per day as a standard action, you unleash a burst of raw magic in a 30-foot radius around you, dealing 12d6 damage to every creature in the area (Reflex half). Each time you use unleash magic, you decide if it deals acid, cold, electricity, fire, or sonic damage. You can expend a mystic spell slot when using this ability to exclude a number of squares up to the level of the spell slot expended from the area of unleash magic. You can activate unleash magic additional times per day by expending 1 Resolve Point each time after the first.
!! Suppressing Aura (18th)
Once per day, you can end your scouring aura as a standard action to cast //[[greater dispel magic]]//. You can spend 2 Resolve Points to use this as a reaction instead.
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* N Medium construct (magical, technological)
* ''Init'' +2; ''Senses'' [[blindsense]] (scent) 60 ft., [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +13
!!! DEFENSE
* ''HP'' 75
* ''EAC'' 17; ''KAC'' 18
* ''Fort'' +3; ''Ref'' +3; ''Will'' +7
* ''Defensive Abilities'' [[fast healing]] 5; ''Immunities'' [[construct immunities]]; ''Resistances'' acid 5
* ''Weaknesses'' [[vulnerable]] to fire
!!! OFFENSE
* ''Speed'' 30 ft., climb 20 ft.
* ''Melee'' bite +13 (1d6+11 P plus [[grab]])
* ''Ranged'' acid spit +11 (1d6+6 A; critical [[corrode]] 1d4)
* ''Offensive Abilities'' constrict (1d6+11 B), overheated circuits
* ''Spell-Like Abilities'' (CL 6th; ranged +11)
** 1/day—//[[caustic conversion]]//, //[[hold person]]// (DC 18)
** 3/day—//[[detect tech]]//, //[[fear]]// (1st level, DC 17), //[[magic missile]]//
** At will—//[[psychokinetic hand]]//, //[[token spell]]//
!!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' —; ''Int'' +3; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +13, [[Intimidate]] +18, [[Mysticism]] +18, [[Stealth]] +13
* ''Languages'' Common and up to 3 others
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or nest (3–6)
!!! SPECIAL ABILITIES
''Acid Spit ([[Ex]])'' As a ranged attack, an arcane asp can spit a gob of acid with a range increment of 30 ft. On a critical hit, the acid inflicts the [[corrode]] critical hit effect for 1d4 additional acid damage.
''Constrict ([[Ex]])'' When an arcane asp successfully renews a [[grapple|Grapple (combat maneuver)]] or a pin against an opponent, it automatically deals 1d6+11 bludgeoning damage to that creature.
''Overclocked Circuits ([[Ex]])'' Engineering shortcuts taken during arcane asps' creation cause the constructs processing and circuitry to overclock when exposed to extreme heat. When arcane asps take fire damage, they get a +10-foot enhancement bonus to their speeds.
</div>
The Aspis Consortium's leading technomancers designed arcane asps to be part guardian, part magical research assistant. Their mystically developed programming includes an advanced form of virtual intelligence that is nearly indistinguishable from sentience. Each arcane asp has its own personality, though they're commonly haughty and condescending, sometimes even to their Aspis users. Aspis agents are usually assigned an arcane asp that is tasked with keeping track of hundreds of small details about the project at hand, such as schedules, plans, and contact information. Agents with arcane asps keep close watch on these valuable assets, as the information held within the constructs is a prime target for a talented hacker—but the asp must be defeated, first.
Because of their distinctive serpentine appearance, these unique constructs generally remain out of sight while working; even in legal and publicly claimed venues, arcane asps prefer not to show themselves to outsiders, and they often pose as glittering statues unless they're needed. Intruders who have overstayed their welcome often see a serpentine statue snap to life—right before they're neutralized. In combat, arcane asps insult their opponents, and they analyze their victims' failings aloud as they squeeze them to death.
The arcane assailant fighting style supplements its combat effectiveness with magic powers, drawing on traditions of warrior-wizards dating back to well before the Gap. This allows you to use magic runes to augment your weapons and call on legendary powers, giving you access to arcane options even when you don't have a magic weapon in your possession.
!! Rune of the Eldritch Knight (1st)
You can imbue a weapon with a magic sigil, the rune of the eldritch knight, allowing the weapon to act as a magic weapon for the purposes of bypassing [[DR]] and affecting [[incorporeal]] creatures. This takes 10 minutes, and you can imbue only a single weapon at a time. If you imbue a new weapon with the rune of the eldritch knight, any previously imbued weapon loses this benefit. When calculating the Hit Points and hardness of a weapon imbued with the rune of the eldritch knight, treat its item level as 5 higher.
!! Secret of the Magi (5th)
When you imbue a weapon with the rune of the eldritch knight, in addition to its normal benefits, the rune grants the weapon one of the following weapon fusions of your choice: //[[flaming]]//, //[[frost]]//, //[[ghost killer]]//, //[[merciful]]//, or //[[shock]]//. The weapon can't gain a fusion it already has, and this bonus fusion doesn't count toward the maximum total level of fusions the weapon can have at once. The bonus fusion ends when the weapon ceases to be imbued with the rune of the eldritch knight.
!! Power of Legend (9th)
You can call on the link between you and the legendary heroes who wielded powerful magic weapons eons ago to overcome adversity. As a move action when wielding a magic weapon or a weapon imbued with the rune of the eldritch knight, you can spend 1 Resolve Point to end one of the following conditions affecting you: [[bleeding]], [[burning]], [[confused]], [[exhausted]], [[fatigued]], [[flat-footed]], [[off-target]], [[shaken]], or [[sickened]]. Alternatively, you can spend 1 Resolve Point to change the [[cowering]] condition to the [[frightened]] condition or change the frightened condition to the [[shaken]] condition. In this case, the new condition lasts for the same duration the original condition would have and can't be further affected by this ability.
!! Secret of the Archmagi (13th)
You can imbue two weapons with the rune of the eldritch knight. If you attempt to imbue a third weapon, the weapon infused first loses its rune and all benefits. In addition to the normal benefits, the runes grant the weapons one or more of the following weapon fusions of your choice: //[[bane]]//, //[[corrosive]]//, //[[flaming]]//, //[[frost]]//, //[[ghost killer]]//, //[[holy]]//, //[[merciful]]//, //[[shock]]//, //[[thundering]]//, or //[[unholy]]//. You can grant no more than 10 total levels' worth of fusions between the two weapons, and the bane fusion counts as a 10th-level fusion for this purpose.
!! Arcane Attack (17th)
As a standard action, you can spend 1 Resolve Point to use a weapon imbued with the rune of the eldritch knight to make an attack that strikes true. This attack ignores all cover and concealment, including total concealment (though you must at least be aware of a creature's presence to target it with this attack). If the attack is a ranged attack, the target must be within the first range increment. The attack only affects your selected target, even if it normally affects an area or multiple targets. You still must make a normal attack roll, and if your attack misses, it has no effect.
<div class="statblock">
* <<levels>>
* ''School'' divination (scrying)
* ''Casting Time'' 10 minutes
* ''Range'' planetary
* ''Effect'' magical sensor
* ''Duration'' 1 minute/level (D)
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You create an invisible magical sensor that sends you visual information. The sensor appears at any point within line of sight, but it can then travel beyond your line of sight without hindrance. An //arcane eye// travels at 30 feet per round (300 feet per minute) if viewing an area ahead as a humanoid would (primarily looking at the floor) or 10 feet per round (100 feet per minute) if examining the ceiling and walls as well as the floor ahead. The //arcane eye// sees exactly as you would see if you were there.
The //arcane eye// can travel in any direction as long as the spell lasts. Solid barriers block its passage, but it can pass through a hole or space as small as 1 inch in diameter. The //arcane eye// can't enter another plane of existence, even through Drift travel or a magical gate or similar magical portal.
You must concentrate to use an //arcane eye//. If you do not concentrate, the sensor is inert until you concentrate again.
An arcane laboratory contains all the tools and space necessary to craft magic items, though the crafter must still provide the necessary raw materials. Such a laboratory reduces the crafting time by half.
<div class="table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|arcane laboratory | 1 | 1 |
</div>
Psychically active crystals replace the lenses of your eyes. You gain //arcane sight//, per the spell, as a continuous ability.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|//arcane lenses// | 11 | 25,900 | eyes |
</div>
An arcane mortuary contains equipment that aids spellcasters in creating undead. A spellcaster using this mortuary must still provide any special materials required for undead creation. Undead created in an arcane mortuary have 10% more Hit Points than a typical undead creature of the same CR. An arcane mortuary can also store up to five Medium or smaller corpses without them deteriorating due to time. One Large corpse can be stored in place of two Medium ones.
<div class="table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|arcane mortuary | 1 | 2 |
</div>
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Range'' personal
* ''Duration'' 1 minute/level (D)
</div>
This spell allows you to see magic sources within 120 feet of you. The effect is similar to that of a //[[detect magic]]// spell, but //arcane sight// does not require concentration and discerns information more quickly.
You know the location and caster level of all magic sources within your sight. If the magic sources are in line of sight, you can attempt a DC 28 [[Mysticism]] check (one check per source) to determine the school of magic involved in each source.
If you concentrate on a specific creature within 120 feet of you as a standard action, you can determine whether it has any spellcasting or spell-like abilities and the caster level of the most powerful spell or spell-like ability the creature currently has available for use.
You can attempt a [[Mysticism]] skill check to identify the properties of magic or hybrid items (but not artifacts), as if you were using //[[identify]]//.
An //arcane signet// allows users to communicate clandestinely and mark paths to meeting sites. Once per day, this ring can be used to create an invisible magical symbol that can still be seen by those wearing another //arcane signet//. The symbol must be drawn with the wearer's hand in one round on whatever surface the wearer touches, but may also be drawn in the air. The symbol persists for 72 hours. Alternatively, the wearer may choose to touch a creature; for one day, that creature can see symbols created by any //arcane signet//.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//arcane signet// | 2 | 500 | — |
</div>
As a standard action, you can spend 1 Resolve Point while touching a single technological item (including a weapon or a suit of armor) and infect it with a sly program that seeks out a user's secrets on your behalf. The spyware can be instructed to attack the very next user or remain dormant, waiting for a specific target. The spyware lasts for a number of hours equal to your technomancer level or until it is activated, at which point it targets the user as per //[[mind probe]]// with a caster level equal to your technomancer level. The duration of this effect is 1 minute per level and the spyware can attempt to extract information only once per minute. The spyware is subtle, but a user may notice it each time it attempts to extract a memory with a successful [[Perception]] check (DC = 15 + 1-1/2 × your technomancer level), and the spyware can't continue to target a user who puts the item down or walks away. You are aware of the spyware's activity and what information it extracts, and you can direct its line of questioning, as long as you are within 1 mile of the infected item.
You can program a virus into a technological item or weapon that delivers a spell effect, similar to the effects of a //[[spell gem]]//, on the next individual to use the item. This process requires an uninterrupted minute of access to the item. You can create only an arcane virus of a spell you know that has a range of at least short and affects at least one target or has an area of effect, and you must expend an unused spell slot of the level of the spell you are programming into the virus. All of the spell's variables are determined by your technomancer level at the time of its creation, and any decisions regarding its effect (such as with //[[command]]//) must be set when the virus is created. The arcane virus affects only the creature that triggered it, even if the original spell would affect more than one creature. An arcane virus remains active until it is triggered, until it is disabled, until you decide to end it as a standard action, or for 1 day per your technomancer level, whichever comes first. While the arcane virus is active, you cannot recover the used spell slot until the virus is triggered or deactivated. A user can detect an arcane virus before it is triggered with a successful [[Computers]] check (DC = 15 + your technomancer level + level of the spell) and disable it with a second Computers check (DC = 20 + your technomancer level + level of the spell).
This upgrade enables you to sense magic within 60 feet, as //[[detect magic]]//. While active, the module continuously delivers complex data about nearby magic, but this information is functionally meaningless unless you concentrate on it. As a standard action, you can overclock the module, temporarily increasing its usage to 4/round and causing its effect to function as //[[arcane sight]]//.
<div class= "table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk | Capacity | Usage |h
|//arcane vision// | 8 | 9,300 | 1 | any | L | 20 | 4/minute |
</div>
Space-time anomalies can cause all sorts of problems during a chase unless an apt magic user can bend reality back into shape.
''Failure:'' The crew's next chase action check takes a –2 penalty.
These stylish eyeglasses boast lenses with a bluish tint but otherwise have no effect on the wearer's vision unless the wearer is under the effect of //[[detect magic]]//. The lenses enhance the contrast of magical auras, making them easier to study and identify. While worn, the lenses grant a +1 circumstance bonus to [[Mysticism]] checks made to [[identify magic items]].
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|arcanoscope lenses | 2 | 50 | L |
</div>
This weapon deals 5 fewer damage unless the target is wearing no armor or archaic armor. Archaic weapons are made of primitive materials such as wood or common steel.
!! Archaic Armor
Armor produced by technologically underdeveloped civilizations often lacks features common to the more advanced equipment available in many systems.
Armor with the archaic armor special property counts as archaic for the purposes of the archaic weapon special property, and it does not have a personal [[comm unit]] or environmental protections.
You can add environmental protections to archaic armor by spending 1 hour and a number of UPBs equal to 10% of the armor's purchase price, though you must have a number of ranks in [[Engineering]] (or an appropriate [[Profession]] skill) at least equal to the armor's item level.
As a move action during which you can draw a weapon, you can expend an unused spell slot to eliminate the [[archaic]] property of one weapon or armor you can touch. You can use this magic hack on your unarmed strikes or those of another creature. An upgraded weapon is also considered to be magical. These benefits persist for a number of minutes equal to your technomancer level.
Choosing a bow over a laser rifle is often an defiant act performed to prove that obstacles can be overcome with the ancient weapon.
!! Snapshot (1st)
You gain proficiency with [[analog]] bow-like special weapons, including [[bows]] and [[apocalypse bows]] (referred to hereafter as bows). You can draw a bow or arrow as a swift action, or as part of the action used to make an attack or full attack. At 3rd level, you gain [[weapon specialization]] in bows as if your class granted proficiency.
!! Close-Combat Arrows (5th)
You gain a +4 bonus to your Armor Class against attacks of opportunity you provoke by making a ranged attack with a bow. You can wield an arrow as though it were a [[dueling sword]] with the [[analog]] property and an item level equal to or lower than your soldier level. These attacks deal piercing damage rather than slashing damage.
!! Pinpoint Targeting (9th)
As a standard action, you can make a single attack with a bow, increasing your bonus to damage from [[Weapon Specialization]] for the attack to 1-1/2 × your soldier level. The attack ignores an amount of the target’s [[damage reduction]] or [[hardness]] (if any) by an amount equal to your key ability modifier.
!! Fistful of Arrows (13th)
As a full action, you can draw, nock, and fire copious arrows in one motion, making an attack as though your bow had the [[automatic]] or [[line|Line (weapon property)]] weapon special property. This attack expends ammunition as if you made 10 attacks; if you can’t expend that ammunition, you can’t use this ability.
!! Saving Shot (17th)
As a reaction when a ranged attack is made against you or a target you can see within 30 feet of you, you can spend 1 Resolve Point to fire an arrow that might deflect the incoming projectile. Make a ranged attack with your bow and compare the result to the triggering attack’s result. If your roll is greater than the triggering attack’s result by 4 or less, the attacker rerolls the attack and uses the new result. If your attack roll exceeds the triggering attack’s result by 5 or more, the triggering attack misses. If the triggering attack was made with a grenade and would miss, you can choose a new target for the grenade that is within 20 feet of its original target. This ability can’t deflect unusually large projectiles, such as starship attacks, boulders, or large missiles.
<$list filter="[list[$:/StoryList]is[current]]">
An archetype is a character concept more specific and involved than a theme, but not as comprehensive or broad as a class. Each archetype represents a significant divergence from the abilities of a typical member of the core classes. Archetypes provide an additional layer of control for players who want to fine-tune their character's advancement.
An archetype generally grants abilities that aren't otherwise available to characters through a class, or it may grant easier access to a specific set of appropriate abilities. In general, these abilities aren't tied to the background of any one core class or theme and aren't available to characters via other sources. For example, the [[phrenic adept]] archetype could be used for a character who is naturally psychic or who gained psychic powers after being exposed to strange alien technology. Without a similar background or event, other characters can't gain these powers, making it more appropriate for an archetype than a series of class features.
</$list>
<<list-links "[tag[Archetypes]sort[title]]" class:index>>
<$list filter="[list[$:/StoryList]is[current]]">
!! Gaining an Archetype
You can gain an archetype when you achieve a new class level in an eligible class matching the earliest level for which the archetype offers an alternate class feature. The archetype is then considered part of the class you gain a level in when you level up. For example, if you are playing an envoy interested in being a Starfinder forerunner, you must select that archetype when you gain your 2nd level of envoy (the first level at which the Starfinder forerunner has an alternate class feature). From that point forward, whenever you gain an envoy class level, you should check whether you gain an alternate class feature from the Starfinder forerunner archetype, as well as whether any envoy class features are altered or replaced. When you first gain an archetype, read through all the altered or replaced class features that will affect your character, and note these down; for some classes (especially mystics and technomancers) these changes affect features from levels before or after the levels at which you gain archetype features.
You cannot add the same archetype to multiple classes if you multiclass. For example, if a 2nd-level vesk envoy has selected the Starfinder forerunner archetype and later decides to multiclass and gain levels in the soldier class, the character cannot add the Starfinder forerunner archetype to his soldier class. Every time he gains soldier levels, he follows the normal character progression. If the character later gains more levels in envoy, that class continues to have the Starfinder forerunner archetype attached to it.
You also cannot add more than one archetype to a specific class. For example, once you have added the Starfinder forerunner archetype to the envoy class, you cannot add any other archetype to that class. If you multiclass and gain a level in a new class, you can add a new archetype to that class when you reach the appropriate level.
When an archetype refers to class level, it is referring to the number of levels you have in the class associated with the archetype.
!! Alternate Class Features
An archetype grants alternate class features that replace or alter class features normally granted by your class at one or more levels. The possible levels at which an archetype might grant an alternate class feature are 2nd, 4th, 6th, 9th, 12th, and 18th. An archetype might grant alternate class features at a few of these levels or at all of them.
Each class has a specific list of the class features that are altered or replaced, as defined in each class's replaced class features entry. For example, an envoy who selects the Starfinder forerunner at 2nd level gains the trained for trouble class feature granted by the Starfinder forerunner instead of the envoy improvisation normally gained at 2nd level.
In some cases, a character gains a class feature at a later level than she would normally, rather than not gain it all. In these cases, a different class feature is generally replaced at the level the delayed class feature is now acquired. For example, a mechanic who has an archetype with a 9th-level alternate class feature does not gain the override class feature until 10th level. When this character's mechanic class level reaches 10th, she gains the override class feature, but she doesn't gain the mechanic trick normally gained at that level.
!! Other Considerations
While having an archetype may represent your training with or membership in a specific faction, having the archetype is generally not required for you to be considered part of a faction. For example, the [[Starfinder forerunner]] is specifically for characters who are part of the Starfinder Society and who have received special training for participation in Starfinder expeditions. However, it is not necessary to take this archetype in order to become a member of the Starfinder Society. The archetype represents only one possible path within the society, not the sole choice for characters tied to that faction.
Archetypes can generally be added to any class, though some archetypes might note they are available only to specific classes or might have other prerequisites you must meet to select them. For example, an archetype that represents training in a specific magic tradition might be available only to mystics and technomancers, while an archetype designed for devotees of an ancient monastery's fighting techniques might be available only to solarians and soldiers. An archetype notes in its description whether it has any prerequisites or restrictions.
</$list>
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one computer or secure data module
* ''Duration'' 1 day; see text
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You magically remove data from the target computer or module. You can remove an amount of data equal to what can be stored on a specific secure data module. You can end the spell with a swift action, restoring the missing data. Each day, when you regain your spell slots, you can expend a 3rd-level spell slot to keep the data hidden for another day. If you choose not to, the data returns.
The massive cathedralships of the church of Iomedae carry legions of troops—whether Iomedaean crusaders or Knights of Golarion—on missions across the galaxy, aided by their exclusive archon drives. Fueled by Iomedae’s divine power and augmented by the righteousness and prayers of the ship’s crew, an //archon drive// enables a starship to bypass interstellar distances by moving through Iomedae’s home plane of Heaven.
As grandiose as the ships that carry them, //archon drives// look like large, crystalline lanterns of stained glass depicting the story of Iomedae and images of lost Golarion. A ball of light hangs in the center of the engine, radiating rainbow light all over the ship’s engineering section and bathing the crew in color. Many ships equipped with //archon drives// hold regular worship services during interstellar journeys, as it is a common belief that the focused prayers of a ship’s crew can increase the drive’s efficiency.
//Archon drives// were in existence at the end of the Gap and were one of only a very few means of achieving interstellar travel before the advent of Drift tech, though they were—and still are—tightly controlled by the church of Iomedae.
<div class= "table-wrapper">
|Drive | Engine Rating | Minimum<br/>PCU | Maximum<br/>Size | Cost (in BP) |h
|//archon drive// | 1 | 150 | — | 15 × size category |
</div>
Archons are celestials, or good outsiders, native to Heaven.
* ''Traits:''
** [[darkvision]] 60 ft., [[low-light vision]]
** aura of menace (see below)
** +4 to saving throws against poison
** [[immunity]] to electricity and petrification
** [[truespeech]]
** many archons can cast //[[teleport]]// as an at-will spell-like ability (caster level equal to its CR)
* //Aura of Menace ([[Su]]):// This ability imposes a divine penalty (usually –2) to the AC, attacks, and saving throws of each hostile creature within the aura (usually 20 feet) that fails a Will save. This penalty lasts for 24 hours or until that creature deals damage to the archon who generated the aura. A creature that has resisted or broken the effect can't be affected again by the same archon's aura for 24 hours. The aura of a more powerful or weaker archon might impose a larger or smaller penalty and might have a larger or smaller radius, respectively.
Summoned archons are called from Heaven, and are eager to aid in the defense of order and the defeat of evil. They take the appearance of floating runes or simple items or tools, glowing from within.
* ''Type:'' outsider (archon, extraplanar, good, lawful)
* ''Alignment:'' change to LG
* ''Traits:''
** [[low-light vision]]
** supernatural fly speed of 30 ft. (perfect), or if CR 7 or greater, supernatural fly speed of 60 ft. (perfect)
** +4 to saving throws against poison
** [[immunity]] to electricity and petrification
** if base stat block has [[DR]], change to DR/evil
* ''Skills:'' add [[Diplomacy]] and [[Intimidate]]
* ''Languages:'' Common and Celestial
* ''Attack:'' the summoned creature gains a light ray ranged attack, which has a range increment of 60 ft.
<div class="table-wrapper">
| CR |Attack Adjustment |h
| 1/3 |add ''Ranged'' light ray +2 (1d4 F) |
| 1 |add ''Ranged'' light ray +6 (1d4+1 F) |
| 3 |add ''Ranged'' light ray +9 (1d4+3 F) |
| 5 |add ''Ranged'' light ray +12 (1d6+5 F) |
| 7 |add ''Ranged'' light ray +15 (2d6+7 F) |
| 11 |add ''Ranged'' light ray +21 (3d8+11 F) |
</div>
<div class="statblock">
* ''CR'' 5; ''XP'' 1,600
* LG Medium outsider (archon, extraplanar, good, lawful)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +11
* ''Aura'' aura of menace (20 ft., DC 15)
!!! DEFENSE
* ''HP'' 65; ''RP'' 1
* ''EAC'' 17; ''KAC'' 18
* ''Fort'' +4; ''Ref'' +8; ''Will'' +6; +4 vs. poison
* ''Immunities'' electricity, petrification
!!! OFFENSE
* ''Speed'' 30 ft., fly 30 ft. ([[Su]], perfect)
* ''Melee'' electric bolt +13 (1d4+5 E; critical [[arc]] 1d4)
* ''Ranged'' electric bolt +13 (1d4+5 E; critical [[arc]] 1d4)
* ''Spell-Like Abilities'' (CL 5th; melee +13)
** 1/day—//[[discharge]]// (DC 15), //[[recharge]]// (DC 15)
** 3/day—//[[jolting surge]]//, //[[supercharge weapon]]//
** At will—//[[detect tech]]//, //[[teleport]]// (self only), //[[transfer charge]]// (DC 13)
!!! STATISTICS
* ''Str'' +0; ''Dex'' +5; ''Con'' +0; ''Int'' +3; ''Wis'' +2; ''Cha'' +2
* ''Skills'' [[Acrobatics]] +11 (+19 to fly), [[Computers]] +16, [[Diplomacy]] +11, [[Engineering]] +16, [[Intimidate]] +11
* ''Languages'' Celestial, Common; [[truespeech]]
* ''Other Abilities'' remote operations
!!! ECOLOGY
* ''Environment'' any (Heaven)
* ''Organization'' solitary, pair, or team (3–5)
!!! SPECIAL ABILITIES
''Aura of Menace ([[Su]])'' Any creature hostile to the power archon within its aura of menace must attempt a Will saving throw. A creature that fails the save takes a –2 penalty to AC, attack rolls, and saving throws for 24 hours or until it deals damage to the archon. When the effect ends for a creature, that creature can't be affected again by the same archon's aura for 24 hours.
''Electric Bolt ([[Su]])'' The power archon can unleash an electric bolt as a melee attack or ranged attack. Both versions can be used to deal nonlethal damage without penalty. The ranged attack has a range increment of 30 feet.
''Remote Operations ([[Su]])'' A power archon can attempt [[Computers]] and [[Engineering]] checks at a range of 30 feet. A creature targeted by the archon or a creature attending or observing the archon's target can discern what the archon is doing with a successful DC 15 [[Perception]] check.
</div>
The powers of Heaven have watched technological and magical progress in the mortal realm with skeptical eyes. Knowledge is power, after all, and power corrupts. In this age of advanced science and technomagical prowess, that corrupting influence is more threatening than ever.
Power archons are servitors of the Outer Planes tasked with tempering mortals' obsession with technology. These virtuous engineers travel to the Material Plane to disable or destroy technology their celestial masters consider to be too corrupting to leave in the hands of mortals. What warrants such intervention is as mysterious as any other instance of celestial meddling. Once power archons are set on a mission, though little can dissuade them, but they talk first and fight only when they must.
Power archons can control the energy that powers technological devices, leading some to refer to them as "battery archons." They are skilled techs and hackers who lend their skills to good causes, including missions led by [[barachius angels]].
<div class="statblock">
* <<levels>>
* ''School'' evocation (electricity)
* ''Casting Time'' 1 standard action
* ''Range'' 120 ft.
* ''Area'' line-shaped burst
* ''Duration'' instantaneous
* ''Saving Throw'' Reflex half
* ''Spell Resistance'' yes
</div>
You cause an electrical device in your possession to surge in power and unleash a line of electricity from the massive oversurge. This deals 10d6 electricity damage to all creatures and objects in the area.
An //Arclord's rod// is a scepter-like device roughly 3 feet long, made of copper and capped with smoke-colored silver. These rods were used on pre-Gap Golarion by powerful spellcasters known as the Arclords of Nex, who hailed from the Golarion nation of that name.
An //Arclord's rod// is a magic weapon that can be used to make either melee or ranged attacks, but it can be used only for a single attack each round. A mk 1 //Arclord's rod// functions as a static [[shock truncheon]] for melee attacks and as a [[pulsecaster pistol]] for ranged attacks. A mk 2 //Arclord's rod// functions as an aurora shock truncheon and a static [[arc pistol]]. A mk 3 //Arclord's rod// functions as a storm shock truncheon and an aurora arc pistol. A mk 4 Arclord's rod functions as a tempest shock truncheon and a storm arc pistol. An Arclord's rod has an unlimited capacity (it never runs out of charges) and has the [[analog]] and [[unwieldy]] special properties. Proficiency with both advanced melee weapons and small arms is necessary to use an Arclord's rod without penalty for melee and ranged attacks, respectively.
Once per day when you cast a spell with the electricity descriptor while wielding an //Arclord's rod//, you can add a thunderclap effect (which makes half of the spell's damage sonic damage) and a rain squall effect (which creates a //[[fog cloud]]//, as per the spell of the same name, centered on the target or the center of the spell's area and lasting for 10 minutes) to the spell.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//Arclord's rod//, mk 1 | 9 | 14,500 | L |
|//Arclord's rod//, mk 2 | 12 | 38,500 | L |
|//Arclord's rod//, mk 3 | 17 | 275,000 | L |
|//Arclord's rod//, mk 4 | 20 | 950,000 | L |
</div>
Constant cold forces an arctic creature to adapt to frigid conditions. Many constantly frozen regions are also [[deserts|desert environmental graft]].
* ''Burrowing:'' Some arctic creatures can dig quickly through ice or snow, and they gain a typical burrow speed. Some such creatures can also burrow in soil.
* ''Cold Inured:'' An arctic creature treats severe cold as cold and extreme cold as severe cold. Such a creature might also have [[resistance]] 5 to cold or the [[cold subtype|Cold Subtype Graft]].
* ''Skills:'' [[Survival]] (master)
Some effects cover a defined area. Sometimes an effect's description indicates a specially defined area, but usually an area falls into one of the categories discussed below. Regardless of the shape of the area, you select the point from which the effect originates, but otherwise you don't control which creatures or objects are affected. The point of origin of an effect is always a grid intersection, meaning the point where four squares touch on a tactical battle map.
When determining whether a given creature is within the area of an effect, count out the distance from the point of origin in squares, just as you would do when moving a character or when determining the range for a ranged attack. The only difference is that instead of counting from the center of one square to the center of the next, you must count from intersection to intersection. You can count diagonally across a square, but keep in mind that every second diagonal counts as two squares of distance. If the far edge of a square is within the effect's area, everything within that square is within the effect's area. If the effect's area touches only the near edge of a square, however, things within that square are unaffected by the effect.
!! Burst, Emanation, Or Spread
Most effects with an area function as a burst, an emanation, or a spread. In each case, you select the effect's point of origin and measure its area from that point.
!!! Burst
A burst effect applies to whatever is in its area when it comes into effect, including creatures that you can't see. It doesn't affect creatures with total cover from the burst's point of origin, and its effects don't extend around corners. The default shape for a burst effect is a sphere, but some burst effects are specifically described as cone-shaped. A burst's area defines how far from the point of origin the effect extends.
!!! Emanation
An emanation effect functions like a burst, except that the effect continues to radiate from the point of origin for the duration of the effect. Most emanations are cones or spheres.
!!! Spread
A spread effect extends out like a burst, but it can turn corners. You select the point of origin, and the effect spreads out to a given distance in all directions. The effect can extend around corners and into areas that you can't see. Calculate distance using the actual distance the effect travels, taking into account turns the effect takes and counting around walls and corners, not through them. You must designate the point of origin for such an effect, but you need not have line of effect to the entirety of the effect's area.
!! Cone, Cylinder, Line, Or Sphere
Most effects with an area have a particular shape.
!!! Cone
A cone-shaped effect extends away from you in a quartercircle in the direction you designate. It starts from any corner of your square and grows wider as it goes. Most cones are either bursts or emanations (see above), and thus won't go around corners.
!!! Cylinder
With cylinder-shaped effects, you select the effect's point of origin. This point is the center of a horizontal circle at a height designated in the effect's description, and the effect drops down from the circle, filling a cylinder. A cylinder-shaped effect ignores any obstructions within its area.
!!! Line
A line-shaped effect extends away from you in a line in the direction you designate. It starts from any corner of your square and extends to the limit of its range or until it strikes a barrier that blocks line of effect. A line-shaped effect applies to all creatures in squares through which the line passes.
!!! Sphere
A sphere-shaped effect expands from its point of origin to fill a spherical area. Spheres can be bursts, emanations, or spreads.
!!! Shapable (S)
If an area or effect entry ends with "(S)," you can shape the effect. A shaped effect or area can have no dimension smaller than 10 feet. The "areas" of many effects are given as cubes to make it easy to model irregular or three-dimensional shapes. Three-dimensional volumes are most often needed to define areas and effects in space.
!!! Other
An effect can have a unique area, as defined in its description.
!! Areas With Targets
Some effects have areas that target creatures or objects within the specified area. Unlike for targeted effects, you do not get to select which creatures are affected; the effect affects all creatures or objects of some kind in the specified area.
If an effect restricts which targets are affected (for example, it affects only living creatures), then creatures in the effect's area that are not of the appropriate type do not count against the number of creatures affected.
!! Subjects Of Effects
If an effect targets creatures or objects directly, the result travels with the subjects for the effect's duration. If an effect targets an area, it stays within that area for its duration; creatures become subject to the effect when they enter the area but are no longer subject to it when they leave.
You can briefly empower your [[adaptive strike]] to strike large areas, such as launching hails of projectiles, breathing a gout of fire, battering foes with a flurry of tentacles, or skewering multiple foes with an elongated claw. You can spend 2 MP as a standard action to make one attack with your adaptive strike as though it had the [[blast]] weapon special property (affecting a 20-foot cone) or the [[line|Line (weapon property)]] weapon special property (affecting a 40-foot line). For each additional MP you spend to activate this adaptation, you increase the cone’s length by 5 feet or increase the line’s length by 10 feet.
You can use Engineering to arm [[explosive charges]] that you can trigger later with a [[detonator]]. Applying an explosive charge to a surface typically takes 1 minute, plus 1 minute to program its detonator; this is the primary charge. You can also apply up to five secondary charges to the surface; this takes an additional minute per charge, and each secondary charge must be the same type and mark as the primary charge. After you set the charges, the GM rolls your Engineering check in secret, so you're not sure how effective your explosive charges are. You gain a circumstance bonus to your Engineering check based on your primary explosive charge's mark, and the bonus increases by 2 for each secondary charge applied to the surface. The total result can't exceed the primary charge's Maximum Result (see [[Explosive Charges]]). The Engineering check DC to disable this explosive is equal to the result of this Engineering check minus the bonuses from secondary charges.
When you activate the detonator, the charges explode; this functions as a Strength check to break the structure that uses your Engineering check's result in place of the Strength roll. If the check is successful, the explosion breaks apart the structure, allowing movement through its space and preventing it from being closed again (such as for a door). On a success, the explosion also causes collateral damage, dealing fire and piercing damage equal to twice the explosive charge's mark to all creatures and objects adjacent to the structure (Reflex for half) and filling the damaged area with dust and smoke that grants [[concealment]] for 1 round. For every 5 by which the Engineering check exceeds the break DC, the damaging explosion's radius increases by 5 feet (to a maximum of 5 additional feet × the charge's mark) and its damage increases by an amount equal to the explosive charge's mark. The total collateral damage can't exceed the structure's break DC.
If you fail the check by 10 or more, the explosion doesn't harm the structure. If you fail the check by 9 or less, the explosion deals 3d6 bludgeoning damage plus an additional 1d6 damage for every 2 item levels of the primary explosive charge (rounded up) to the structure; if the demolitions included secondary charges, each one increases the damage by 1d6 (or 2d6 if the secondary charges' item levels are 10 or higher). If you fail the check by 4 or less, this damage also ignores half the structure's [[hardness]].
!! Controlled Explosions
When applying explosive charges, you can take a –4 penalty to your [[Engineering]] check to limit the subsequent damage, allowing for precise explosions. Choose a number. If your Engineering check result when setting explosive charges exceeds this number, the result is instead reduced to this number.
!! Embedded Charges
Through a combination of careful calculation and drilling holes in the surface to accommodate charges, you can maximize an explosion's destructive potential. This process takes 10 minutes per charge, 5 minutes per charge of which requires the use of a laser torch. As you finish setting the charges, attempt an [[Engineering]] check (DC = 10 + 1-1/2 × the primary charge's item level). If you succeed and all charges used in an explosion are embedded in this way, apply a +2 circumstance bonus to the demolition's Engineering check; the explosive charges' maximum result increases by 5.
!! Quick Demolitions
You can halve the time it takes to apply explosive charges, but doing so applies a –5 penalty to your [[Engineering]] check to determine the explosion's result.
Abilities and effects that allow you to increase the rate at which you arm explosives also apply to the demolitions task. If you have an ability that reduces the time required for a specific action (such as the [[demolition expert]] envoy expertise talent), you can take that action to arm a single charge.
You have special devices installed into your arms that allow you to extend them great distances.
''Prerequisites:'' Constructed racial trait or construct type.
''Benefit:'' As a move action, you can extend your natural reach by 10 feet, retaining this benefit until you retract your reach to normal as another move action. While your arms are extended, you take a −2 penalty to attack rolls with weapons wielded in your hands and to Dexterity- and Strength-based ability checks and skill checks. You can use this ability to grab an object or surface and pull yourself to that item or surface as a full action, or you can anchor yourself where you are to lower yourself to another surface. When doing so, you move 15 feet as if using a fly speed with perfect maneuverability, ending your movement in a square adjacent to the chosen object or surface. If your movement does not end on solid ground, you either fall or must begin climbing the surface you grabbed (your choice).
Most armada encounters should be against armadas of lower tiers, as evenly matched armadas are likely to both suffer catastrophic damage. Use the following table as a guideline.
<div class= "table-wrapper">
| Difficulty | Opposition Armada Tier |h
| easy | allied armada tier – 3 |
| average | allied armada tier – 2 |
| challenging | allied armada tier – 1 |
| hard | allied armada tier |
| epic | allied armada tier + 1 |
</div>
''XP Awards:'' PCs should earn experience points for defeating enemy armadas, following the same rules as for earning XP for [[starship combat]].
Armada combat borrows many familiar elements from smaller-scale starship combat, such as navigating a hex grid, movement speed, and PC checks, but also incorporates unique elements to account for this grander scale of starship combat.
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Armadas'>>
</div>
<$list filter="[list[$:/StoryList]is[current]]">
Most suits of armor consist of a helmet, gloves, boots, and a bodysuit that offers head-to-toe protection. Unless otherwise specified, the boots include a functionality that can anchor your feet to a solid surface in a zero-gravity environment, allowing you to orient yourself or return to normal footing when needed.
<<list-links "[list[Armor]has[tab]]" class:index>>
<$list filter="[list[Armor]!has[tab]]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
</$list>
<$list filter="[<currentTiddler>is[missing]]">
<<tabs "[contains:tab[Armor]sortby{Armor!!list}]" "Light Armor" "$:/state/tabIndex" "Index Template">>
</$list>
Armor protects a ship from direct-fire weapons, deflecting their energy and preventing damage to critical ship systems. It grants an armor bonus to a ship's AC. Armor's cost depends on the bonus it grants and the ship's size category (for the purpose of this calculation, Tiny = 1, Small = 2, Medium = 3, Large = 4, etc.). Armor is a passive system and does not require any PCU to remain functional. It provides protection primarily through mass, which can affect a ship's maneuverability (making it harder to turn) and make it easier for opponents using tracking weapons to lock on to the ship—these effects are listed in the Special column of the table below.
<div class="table-wrapper">
|Armor | Bonus to AC | Special | Cost (in BP) |h
|mk 1 armor | +1 | — | 1 × size category |
|mk 2 armor | +2 | — | 2 × size category |
|mk 3 armor | +3 | — | 3 × size category |
|mk 4 armor | +4 | — | 5 × size category |
|mk 5 armor | +5 | –1 TL | 7 × size category |
|mk 6 armor | +6 | –1 TL | 9 × size category |
|mk 7 armor | +7 | –1 TL | 12 × size category |
|mk 8 armor | +8 | –1 TL | 15 × size category |
|mk 9 armor | +9 | –2 TL, +1 turn distance | 18 × size category |
|mk 10 armor | +10 | –2 TL, +1 turn distance | 21 × size category |
|mk 11 armor | +11 | –2 TL, +1 turn distance | 25 × size category |
|mk 12 armor | +12 | –3 TL, +2 turn distance | 30 × size category |
|mk 13 armor | +13 | –3 TL, +2 turn distance | 35 × size category |
|mk 14 armor | +14 | –3 TL, +2 turn distance | 40 × size category |
|mk 15 armor | +15 | –4 TL, +3 turn distance | 45 × size category |
</div>
Your Armor Class (AC) represents how hard it is for opponents to land a solid damaging blow on you. Your Armor Class (AC) is the minimum attack roll result that an opponent needs to hit you and deal damage. Armor Class is divided into two categories: Energy Armor Class (EAC) and Kinetic Armor Class (KAC). Any reference to Armor Class, including bonuses and penalties, applies to both EAC and KAC unless otherwise specified.
Your EAC and KAC are primarily determined by your armor bonus (most often from a suit of armor you wear) plus your Dexterity modifier. Calculate your EAC and KAC using the following formula: 10 + your armor's EAC or KAC armor bonus (whichever is appropriate) + your Dexterity modifier.
Most suits of armor provide separate armor bonuses to EAC and KAC. However, some suits of armor's conditions prevent you from using your full Dexterity bonus. Various other bonuses can apply from class features, feats, special circumstances, and so on.
!! Energy Armor Class (EAC)
Your Energy Armor Class (EAC) represents the defenses you have against attacks that only deal damage as a result of some kind of energy (such as acid, cold, electricity, fire, or sonic damage). When an opponent's attack would deal only energy damage (if he is using, for example, a laser pistol), his attack roll result is compared to your EAC to determine whether he hits you. Some weapons and effects that use magical or exotic untyped energies might also target your EAC; the description of the weapon or effect tells you if this is the case.
!! Kinetic Armor Class (KAC)
Your Kinetic Armor Class (KAC) represents the defenses you have against attacks that primarily deal damage as a result of a physical impact. This generally includes attacks that deal bludgeoning, piercing, or slashing damage (described as "kinetic attacks"), attacks that don't otherwise specify which AC they target, impacts from falling, and damage from crushing or constriction. When a foe's attack would deal such damage (if he is using, for example, a starknife), even if it also deals energy damage, his attack roll result is compared to your KAC to determine whether he hits.
You've learned to customize your armor. You can adjust armor to fit you without needing to attempt an [[Engineering]] check. This also allows you to add one upgrade slot to the armor, though any upgrade that uses that slot functions only when you wear the armor. Such upgrades are useless to anyone else.
Some believe the way [[vesk]] optimize their armor is the result of cultural training, while others say it has something to do with their scales. Either way, microfibers woven throughout your skin mimic this racial trait. When wearing armor, you gain a +1 enhancement bonus to AC. When you are wearing heavy armor, decrease your armor check penalty by 1.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|armor savant graft | 5 | 3,000 | skin |
</div>
Armor comes in different sizes for different creatures, and you might have to adjust a suit of armor to fit you if it wasn't made for your race. A ysoki can't effectively wear armor made for a human, and a kasatha needs to adjust armor that was made for a two-armed creature. If it's in doubt whether a creature can fit the suit, the GM decides whether the armor needs to be adjusted. When you buy armor new, the purchase price includes any adjustments.
!! Adjusting Armor
If you get secondhand armor that wasn't tailored for you, you can have it adjusted, which requires a successful [[Engineering]] check (DC = 10 + 2 × the armor's level). Alternatively, you can spend 10% of the armor's purchase price to have it adjusted by a professional—typically an armorsmith or anyone with multiple ranks in Engineering.
Your drone gains an armor upgrade slot for an armor upgrade. If you do not already have an armor upgrade to install, you must purchase one separately. You can install the armor upgrade only if your drone has enough open upgrade slots to meet the upgrade's requirements. You can select this mod up to four times, each time adding an additional slot.
The armor storm fighting style focuses on using armor as a weapon by maximizing the damage of armor-based weapons while withstanding enemy fire. You learn to increase the effectiveness of attacks made with your armor and to add equipment normally beyond your armor's capacity.
!! Hammer Fist (1st)
You may treat any unarmed strike you make while wearing heavy or powered armor as being made with a [[battleglove]] with an item level equal to or lower than your soldier level, and you calculate damage for these attacks as if you had the [[melee striker]] gear boost. If you have the melee striker gear boost, you gain a +2 bonus to damage rolls with your unarmed strikes when using this ability. These unarmed strikes don't benefit from other abilities that apply specifically to unarmed strikes (such as the [[Improved Unarmed Strike]] feat).
!! Enhanced Tank (5th)
You gain the [[Powered Armor Proficiency]] feat and access to improved armor. This might be the result of your own engineering abilities or a powerful patron giving you gear not available to the general public. You can add one more upgrade to your armor than its normal maximum number of upgrade slots. If you add this bonus upgrade to heavy armor, you can select an upgrade normally limited to powered armor. An upgrade placed in this bonus slot costs half the normal credit amount and sells for 10% of the reduced cost. If you move an upgrade from this bonus slot to another slot, you must pay the difference between the upgrade's reduced cost and its normal cost.
!! Smash Through (9th)
While you are wearing heavy armor or powered armor, you gain a +4 bonus to attack rolls to perform a [[bull rush]] combat maneuver. If you successfully push the target back 10 feet or more, you can also damage the target with an unarmed strike (and can use your hammer fist ability when doing so).
!! Mobile Army (13th)
You become a master of all weapons associated with your armor. You deal 1d6 additional damage with any attack from a weapon that is part of your armor, including unarmed strikes using the hammer fist ability and weapons that have been attached to your armor as an armor upgrade. The additional damage is of the same type as the weapon's normal type. Also, while wearing heavy or powered armor, you gain a +2 bonus to your KAC against combat maneuvers.
!! On the Bounce (17th)
You learn to control your armor with such ease, you are actually more maneuverable in it than out of it. While wearing heavy armor or powered armor, you can move up to your speed when you make a full attack. You can move before or after all your attacks, but not both. If you have the [[Shot on the Run]] feat, you can divide your movement to move both before and after making a full attack as long as all the attacks are ranged attacks. If you have the [[Spring Attack]] feat, you can divide your movement to move both before and after making a full attack as long as all the attacks are melee attacks. If you have both feats, your attacks can be any combination of melee and ranged attacks.
<$list filter="[list[$:/StoryList]is[current]]">
A creature can personalize armor by purchasing and installing armor upgrades, which add bonuses or customized abilities to armor. Some individuals keep a collection of upgrades at hand, swapping them out as needed (requiring 10 minutes to replace the unit and resecure all connections). Explanations of entries for upgrades' statistics follow.
!! Capacity
For a technological armor upgrade that requires charges to function, this entry lists the maximum size battery the upgrade can hold. The batteries that upgrades hold can be recharged as normal using either a generator or a [[recharging station]]. A magic armor upgrade that can be used a certain number of times runs on magical charges; these charges are integral to the construction of the item and can't be replenished with generators or batteries. Charges for a magic item either refresh each day or never refresh.
!! Usage
This entry lists how many charges are consumed when the armor upgrade is used. This might be per activation or a certain duration. If an armor upgrade uses a certain number of charges over an interval, the upgrade's abilities can be shut off before that amount of time has passed, but it still uses charges for the full interval. For instance, an upgrade that uses charges at a rate of 2 per round would still use 2 charges if activated for half a round.
!! Upgrade Slots
Each suit of armor contains a certain number of upgrade slots. This represents the maximum number of times the armor can be modified while still functioning. If you install upgrades beyond the maximum, the armor and all upgrades attached to it cease to function until you remove enough upgrades to bring the armor down to its maximum number of upgrade slots or fewer. You can't install two or more armor upgrades that provide the same benefit.
Some upgrades use more than one upgrade slot, as noted in its Armor Slots entry.
!! Magic Upgrades
Some armor upgrades are magic or a hybrid of magic and technology. This is indicated next to the upgrade's name. If neither magic nor hybrid is listed after an item, it's a technological item.
</$list>
<<list-links "[tag[Armor Upgrades]sort[title]]" class:index>>
Your strikes open brief gaps in your targets’ armor. When you hit with a weapon that deals piercing damage as part of a full attack, any additional attacks you make against that target before the beginning of your next turn target the creature’s EAC rather than its KAC.
When you are wearing armor, you gain a +1 insight bonus to your Kinetic Armor Class.
<div class="statblock">
* ''Level'' 10; ''Price'' 48,800
* Large land and water vehicle (10 ft. wide, 10 ft. long, 8 ft. high)
* ''Speed'' 40 ft., full 750 ft., 85 mph (hover)
* ''EAC'' 23; ''KAC'' 25; ''Cover'' improved cover
* ''HP'' 160 (80); ''Hardness'' 12
* ''Attack (Collision)'' 9d10 B (DC 17)
* ''Modifiers'' –1 [[Piloting]], –2 attack (–4 at full speed)
* ''Systems'' autocontrol, extradimensional storage, planetary [[comm unit]]
* ''Passengers'' 3
</div>
---
Resembling a smaller [[hover truck]], this vehicle often carries dangerous or valuable goods.
<div class="statblock" >
* ''Level'' 8; ''Price'' 22,400
* Huge land vehicle (10 ft. wide, 20 ft. long, 7 ft. high)
* ''Speed'' 10 ft., full 450 ft., 50 mph
* ''EAC'' 20; ''KAC'' 22; ''Cover'' total cover
* ''HP'' 125 (62); ''Hardness'' 11
* ''Attack (Collision)'' 8d10 B (DC 14)
* ''Modifiers'' –4 [[Piloting]], –3 attack (–6 at full speed)
* ''Systems'' autopilot (Piloting +16), expansion bay, planetary [[comm unit]]
* ''Passengers'' 1
</div>
This tough truck is used for both private security and military deployment.
These robust vehicles are fitted with armored plates or shielding systems that allow them to withstand punishing conditions.
* ''Adjustments:'' Increase price by 20%, decrease speed by 10 feet, increase EAC and KAC by 2, increase Hit Points by 10%, increase [[hardness]] by 10%, increase cover by 1 step (partial cover becomes cover, cover becomes improved cover, etc.)
* ''Special:'' The vehicle can't have the [[tank]] type graft.
<<list-links '[all[current]listed[source]]' class:index>>
This upgrade adds arms to a //[[rakmodoi computer]]//. These limbs can perform most simple functions that humanoid arms and hands perform, such as opening doors and manipulating objects. However, the arms can't use skills or make attacks.
An arms upgrade costs 500 credits.
If you have the [[weapon specialization]] class feature, add your full class level to damage (rather than half your class level) with small arms and weapons with which you have gained proficiency through the [[injection expert]] class feature.
<div class="statblock">
* ''CR'' 4; ''XP'' 1,200
* N Large animal
* ''Init'' +5; ''Senses'' [[low-light vision]]; ''Perception'' +10
* ''Aura'' tranquility (60 ft., DC 13)
!!! DEFENSE
* ''HP'' 50
* ''EAC'' 16; ''KAC'' 18
* ''Fort'' +7; ''Ref'' +9; ''Will'' +3
* ''Immunities'' Arquand immunities
* ''Weaknesses'' docile
!!! OFFENSE
* ''Speed'' 50 ft.
* ''Melee'' gore +9 (1d6+7 P) or if not docile +12 (1d6+7 P; critical [[bleed]] 1d4)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' stampede, [[trample]] (1d6+7, DC 13)
!!! STATISTICS
* ''Str'' +3; ''Dex'' +5; ''Con'' +0; ''Int'' –4; ''Wis'' +0; ''Cha'' +1
* ''Skills'' [[Athletics]] +15
!!! ECOLOGY
* ''Environment'' any forests, hills, or plains (Arquand)
* ''Organization ''solitary, pair, or herd (4–40)
!!! SPECIAL ABILITIES
''Arquand Immunities ([[Su]])'' While on their native planet, Arquand gazelles don't age and are
immune to disease, [[exhaustion]], and [[fatigue]].
''Docile ([[Ex]])'' Arquand gazelles are naturally unaggressive creatures. An Arquand gazelle loses this weakness if trained for combat, a function of the [[rear a wild animal]] task of the
* Survival skill.
''Stampede ([[Ex]])'' A stampede occurs if three or more Arquand gazelles [[trample]] while remaining adjacent to each other. While stampeding, the gazelles can trample foes of their size or smaller, and the trample ability's save DC increases by 2.
''Tranquility Aura ([[Su]])'' An Arquand gazelle exudes tranquility that has a sedative effect and causes mild hallucinations in creatures within 60 feet. Such hallucinations are pleasant if the gazelle is docile and on Arquand, but less pleasant if the gazelle isn't on Arquand, wasn't born on Arquand, or lacks the docile weakness. The effects are unpleasant if the gazelle is aggressive or scared; a creature in the aura must succeed at a DC 13 Will saving throw to attack, cast any spell on an unwilling target, or take any action that involves breaking or disabling an object or device. Creatures that succeed at the save are immune to the same Arquand gazelle's aura for 24 hours. Arquand gazelles are immune to this aura. This is a mind-affecting, emotion effect.
</div>
Life on the sentient planet of Arquand is idyllic for its native inhabitants. Lithe, six-legged gazelles spring merrily over hills, peer at anything that sparks their curiosity, and playfully charge at each other. Arquand gazelles, like most native Arquand species, are friendly and trusting, especially to juvenile creatures of any species. They interact peacefully with one another and other indigenous animals.
The nimble creatures are black, brown, or white, depending on which part of their home planet they come from. Their home planet itself spurs them to wander, using weather and terrain to guide them and growing plentiful and nutritious vegetation and fruit wherever they roam. The gazelles graze contentedly on the abundant food, never knowing struggle, and grow up to 12 feet tall and just as long. They can weigh up to 1,600 pounds.
These gazelles have an unlimited lifespan on Arquand's surface. They grow neither old nor ill, but they can be killed. Arquand gazelles reproduce very slowly. The creatures have no family units, instead living in large herds. If taken to a different planet, an Arquand gazelle lives up to 30 years.
Would-be settlers on Arquand might see these elegant ungulates as a source of meat. Poachers have an easy time capturing the gazelles, which remain friendly even when caged. But killing them is much more difficult than it appears, as the beasts have a tranquilizing affect on beings near them. Successfully slaying a gazelle can mean more trouble, since Arquand doesn't take kindly to those who harm its creatures or irritate it in other ways (see the below).
Many governments, including the Pact Council, have made the removal of gazelles from Arquand illegal. Nevertheless, the animals fetch a high price on the black market. Collectors of exotic pets prize Arquand gazelles; therefore, poachers brave the planet's wrath to capture the beasts alive. Creative landowners purchase entire herds for security, since the animals' tranquility aura prevents attacks and break-ins. Some people use the aura for self-medication, while others keep the affable and child-loving gazelles as companion animals. Those under the pleasant effects of the gazelle's aura can't help but return the creature's friendliness, so affection grows.
Gazelles accustomed to Arquand have difficulty adjusting to life on other planets. They have little natural survival instinct or skill, since foraging on Arquand is easy and safe. Severe weather spooks them because they never experience it on their home world. However, it is possible to breed Arquand gazelles on other worlds. Domesticated gazelles are still docile and still have a tranquility aura, but the aura is less pleasant, so most collectors prefer Arquand-born gazelles. Those who use the animals solely for security are less particular, and breeders can do brisk business with such clients. Breeding Arquand gazelles is commonly legal, but law officers keep an eye out for native-born animals in breeding stock.
!! Arquand's Influence
Against invaders, Arquand can drive its docile gazelles to uncharacteristic aggression or to stampede, sometimes removing the docile weakness. Stampeding gazelles wreak havoc on anything in their path, trampling creatures and simple structures alike. The gazelles can run without tiring while on Arquand. Therefore, the sentient planet can direct them back to the same location repeatedly, until nothing remains standing or alive.
On Arquand, hunters who manage to kill gazelles have visions of fearsome, vengeful gazelles that can spontaneously manifest in physical form. The planet can generate any number of such gazelles within 120 feet of a sentient creature that has killed a docile Arquand gazelle on the planet. Such a gazelle is a magical beast that lacks the docile weakness. These monstrous gazelles are hostile to all creatures that have slain or helped slay a docile Arquand gazelle, and they seek out and attack such creatures until either the gazelle or its targets are slain. A gazelle created in this way dies after 24 hours, and the planet then reabsorbs it.
!! Arquand Gazelle Gear
Even in death, Arquand gazelles are quite valuable. Hide and horns used in clothing, jewelry, and other objects can retain calming properties, but a bustling trade in fake Arquand gazelle hide makes it difficult for buyers to know if they've got the real thing. Genuine hide has a minor tranquilizing effect, but the expectation of such an effect can create a psychosomatic response, making the feeling an unreliable verifier. Amplified with magic, the real effect can be as strong or stronger than a living gazelle's aura.
!!! Arquand Horns
{{Arquand Horns}}
!!! Arquand Manacles
{{Arquand Manacles}}
A coronet made of an Arquand gazelle's four distinctive horns, this headwear counts as a worn magic item unless you install it in armor, taking up one upgrade slot. While you wear //Arquand horns//, you receive a +2 enhancement bonus to saving throws against fear effects. In addition, as a standard action, you can command the //Arquand horns// to protect you with an aura that lasts for 1 minute. While the aura lasts, creatures within 60 feet of you must succeed at a Will saving throw (DC = 14 + your Charisma modifier) to attack you, cast a spell that includes you as an unwilling target, or take any action to directly harm or disable your equipment. This is a mind-affecting emotion effect, and a creature that succeeds at the save is immune to the aura for 24 hours. Arquand gazelles are immune to the aura. A set of //Arquand horns// can create this effect once per day, and after you have used one set of //Arquand horns// to create this effect, you can't do so again with any other set for 24 hours.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//Arquand horns// | 8 | 8,400 | L |
</div>
Interwoven hide from numerous Arquand gazelles lines //Arquand manacles//. Law officers and bounty hunters use these manacles on prisoners who might become aggressive. The interwoven strips help ensure the bound creature never becomes immune to the effect. While wearing //Arquand manacles//, you must succeed at a DC 13 Will save to attack, cast a spell, or attempt to disable, escape, or harm the cuffs. Arquand gazelles are immune to these manacles. Their magic is a mind-affecting emotion effect.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//Arquand manacles// | 5 | 2,800 | L |
</div>
The fleet's weapons can damage multiple targets. During the gunnery phase, the fleet can attack up to three fleets in a single firing arc. The fleet takes a –2 penalty or –4 penalty to gunnery checks when attacking two or three fleets, respectively.
<div class= "table-wrapper">
|Ability | BP Cost | Fleet Type |h
|array | 3 | [[capital|Capital-Class Fleet]], [[destroyer|Destroyer-Class Fleet]] |
</div>
An array weapon fires at all targets within a single firing arc. The gunner attempts a single gunnery check against each target in the firing arc, starting with those closest to her starship. Each gunnery check takes a –4 penalty, which stacks with other penalties. Roll damage only once for all targets. Critical damage is determined by each target's Critical Threshold. The gunner can't avoid shooting at allies in the firing arc, nor can she shoot any target more than once. An array weapon uses two weapon mounts.
As a full action, you can spend Entropy Points to force each enemy within 20 feet to succeed at a Fortitude saving throw or gain the [[entangled]] condition. This condition lasts for a number of rounds equal to the number of Entropy Points spent.
At 18th level, creatures that fail their saving throws are entangled as though tethered by an opposing force (and are therefore unable to move).
Arrow shafts are made of carbon fiber–reinforced plastic and have metal or ceramic heads. For those who want to deal greater damage with a [[bow]] but don't want the noise and collateral damage of [[grenade arrows]], conventional arrows are available with technological improvements to deal additional damage, including diamond-edge and molecular rift arrows. When used as ammunition for weapons other than the 1st-level bow (such as [[crossbolters]]), these arrows don't increase damage, but diamond-edge arrows gain the [[wound]] critical hit effect and molecular rift arrows gain the [[severe wound]] critical hit effect. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the effect granted by the arrow.
<div class="table-wrapper">
|Ammunition | Level | Price | Charges/Cartridges | Bulk |Special |h
|arrows | 1 | 50 | 20 | L |— |
|arrows, diamond-edge | 12 | 5,200 | 20 | L |4d6 P |
|arrows, molecular rift | 18 | 53,700 | 20 | L |10d6 P |
</div>
<div class="statblock">
* ''Type'' poison (ingested)
* ''Save'' Fortitude DC 17
* ''Track'' [[Constitution|Constitution Poison Track]]
* ''Onset'' 10 minutes
* ''Frequency'' 1/minute for 4 minutes
* ''Cure'' 1 save
</div>
<div class="table-wrapper">
|Substance | Level | Price |h
|arsenic | 7 | 1,400 |
</div>
<<list-links "[tag[Artifacts]sort[title]]" class:index>>
<div class="statblock">
* <<levels>>
* ''School'' evocation
* ''Casting Time'' 1 standard action
* ''Range'' 60 ft.
* ''Area'' 20-ft.-line
* ''Duration'' instantaneous
* ''Saving Throw'' Reflex half
* ''Spell Resistance'' yes
</div>
You create a burst of pressurized boiling water. This deals 3d8 slashing and fire damage and applies the [[burn]] condition for 1d6 to each creature in the area. A successful Reflex save halves this damage and negates the burn condition.
You construct an artificial intelligence (or AI), a sophisticated program of self-motivated code that you can access for help in a variety of endeavors. This AI is the product of your own genius, far more advanced and complicated than any available for sale to consumers (though it falls short of being truly self-aware), and only you know the secrets of its creation and operation. Your AI can take one of two forms: a [[drone]] or an [[exocortex]]. You must pick one of these forms upon taking your first level of mechanic, and once this choice is made, it cannot be changed.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
Your [[artificial intelligence]] (AI) can perform one minor crew action per round. At the beginning of the round, you can spend 1 Resolve Point to instead let your AI perform one crew action and assign your AI to one of the following roles until the end of the round: chief mate, engineer, gunner, pilot, or science officer. When performing a crew action, your AI uses its Dexterity and base attack bonus to calculate its gunnery bonus, and it uses either its own skill modifiers or a modifier equal to 3 plus your level, whichever is higher. Your AI cannot perform crew actions that require the expenditure of Resolve Points.
An artificial personality is a program designed to allow a computer to hold conversations in plain language with both users and creatures that lack access. Such computers are often given a name and are capable of parsing expressions, slang, social cues, tone of voice, and similar elements beyond a literal understanding of spoken or written words. They can respond appropriately through algorithms and lists of billions of known phrases and expressions, developed by programmers over centuries to allow for extremely naturalsounding conversations. Such computers can even display what appear to be emotions and insights. However, unlike androids, computers with artificial personalities have not attained true consciousness. The ability of an artificial personality to hold a conversation, learn names and habits, and even give advice is based purely on its complex code and extensive lexicons.
The primary advantage of an artificial personality is that an authorized user can operate the computer by giving simple spoken or typed commands in plain language and receive information from the computer the same way. On starships traveling far from civilized systems for months or years at a time, some owners also appreciate hearing a friendly voice and having someone to talk to, despite knowing that the "someone" isn't an actual conscious being. Artificial personalities are sophisticated enough that the computer can attempt [[Bluff]], [[Diplomacy]], [[Intimidate]], and [[Sense Motive]] checks with a total bonus equal to 2 × its tier. This upgrade costs 10% of the base price of the computer.
Your drone has learned to operate vehicles quite independently. When you're piloting a vehicle in which your [[drone]] is a passenger, you can engage [[autocontrol]] (or engage [[autopilot]], if you have the [[expert AI]] ability) as part of the action you use to [[drive]] or [[race]], even if the vehicle doesn't have an autocontrol or an autopilot function. If the vehicle doesn't have an autocontrol or autopilot function, your drone must spend its actions each round to maintain the engaged function. If it's unable to do so, the autocontrol or autopilot stops functioning. You must have a [[drone]] to select this mechanic trick.
This crystalline nanocarbon node is implanted into your occipital lobe and connected to your optic nerves with a series of microscopic fibers. You can activate and deactivate your artificial third eye with a move action. When activated, an artificial third eye collects X-ray data and relays the information gathered directly to your eyes. You gain [[sense through]] (vision) with a range of 30 feet, though your vision is limited to black-and-white. The amount of visual information you receive when your artificial third eye is active can be distracting, imposing a –4 penalty on initiative checks.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|artificial third eye | 10 | 18,000 | brain and eyes |
</div>
Often built with a low profile to avoid return fire, an artillery drone is a mobile weapons platform strong enough to support the heaviest of ranged armaments. Its heavily armored core belies its exceptional agility and mechanical precision, allowing the drone to perch atop precarious vantage points and make tiny adjustments to line up the perfect shot.
<div class="statblock">
* ''Size'' Medium
* ''Speed'' 30 ft.
* ''AC'' EAC 11, KAC 12
* ''Good Save'' Reflex
* ''Poor Saves'' Fortitude, Will
* ''Ability Scores'' Str 12, Dex 14, Con —, Int 6, Wis 10, Cha 6
* ''Ability Increases'' Strength, Dexterity
* ''Initial Mods'' [[weapon proficiency|Weapon Proficiency (drone mod)]] (heavy), [[weapon mount]] (x2)
</div>
Artillery lasers are heavy weapons designed to be effective against hardened targets such as vehicles and enemy bunkers.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|artillery laser, azimuth | 1 | 425 | 1d10 F | 120 ft. | [[burn]] 1d6 | 20 charges | 2 | 3 |[[penetrating]] |
|artillery laser, corona | 6 | 4,650 | 2d8 F | 120 ft. | [[burn]] 1d6 | 40 charges | 4 | 3 |[[penetrating]] |
|artillery laser, aphelion | 9 | 14,300 | 3d8 F | 120 ft. | [[burn]] 1d6 | 40 charges | 4 | 3 |[[penetrating]] |
|artillery laser, perihelion | 13 | 53,800 | 4d8 F | 130 ft. | [[burn]] 2d6 | 100 charges | 5 | 3 |[[penetrating]] |
|artillery laser, parallax | 17 | 248,000 | 7d8 F | 150 ft. | [[burn]] 4d6 | 100 charges | 5 | 3 |[[penetrating]] |
|artillery laser, zenith | 20 | 722,000 | 9d8 F | 150 ft. | [[burn]] 5d6 | 100 charges | 5 | 3 |[[penetrating]] |
</div>
You have an organ, attached to your spine with muscle groups and tendons, that can quickly expand into a sphere as large as your space; this sac fills the space directly above you as it inflates with a gas that provides lift. You can inflate or deflate the sac as a move action, but you can't deploy the sac while wearing armor not fitted to you.
While the sac is inflated and you are in an atmosphere and in at least light gravity, you use the rules for moving in zero gravity, but you experience gravity normally in all other ways; for example, the range increment and maximum range of your weapons do not change. In addition, on subsequent turns while the sac is inflated, you can rise up to 30 feet or descend up to 60 feet by taking a move action. If you are using a wind rider ascendance sac and are not overburdened, you gain a fly speed of 30 feet when you are in an atmosphere and at least light gravity.
If you deploy any ascendance sac underwater and in at least light gravity, you become buoyant and rise 15 feet toward the surface at the end of your turn each round. Ascendance sacs are popular among non-barathus who have immigrated to Bretheda, Liavara, or other gas giants.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|ascendance sac, drifter | 5 | 2,720 | spinal column |
|ascendance sac, wind rider | 8 | 8,800 | spinal column |
</div>
<div class="statblock">
* ''CR'' 10; ''XP'' 9,600
* N Large aberration
* ''Init'' +3; ''Senses'' [[blindsight]] (heat or vibration) 120 ft., [[sightless]]; ''Perception'' +19
!!! DEFENSE
* ''HP'' 165
* ''EAC'' 23; ''KAC'' 25
* ''Fort'' +12; ''Ref'' +12; ''Will'' +11
* ''Defensive Abilities'' [[amorphous]], bioelectric growth, [[unflankable]]; ''Immunities'' cold, electricity, paralysis, polymorph, stunning
* ''Weaknesses'' fire
!!! OFFENSE
* ''Speed'' 10 ft., burrow 30 ft., fly 30 ft. ([[Ex]], average; functions in vacuum)
* ''Melee'' tentacle +22 (2d6+18 B & E plus bioelectric pull [DC 17])
* ''Ranged'' shock arc +19 (2d8+10 E; critical [[arc]] 2d6)
* ''Space'' 10 ft.; ''Reach'' 5 ft. (15 ft. with tentacles)
!!! STATISTICS
* ''Str'' +8; ''Dex'' +3; ''Con'' +5; ''Int'' –4; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +19, [[Stealth]] +24, [[Survival]] +19
* ''Other Abilities'' [[compression]]
!!! ECOLOGY
* ''Environment'' any (Ashypso)
* ''Organization'' solitary, pair, or bloom (3–6)
!!! SPECIAL ABILITIES
''Bioelectric Growth ([[Ex]])'' Whenever an ashypsozoan's electricity immunity prevents it from taking electricity damage from an attack, it regains 10 Hit Points.
''Bioelectric Pull ([[Ex]])'' A creature that takes damage from an ashypsozoan's tentacle must succeed at a DC 17 Fortitude save or be [[staggered]] for 1 round. Additionally, if the ashypsozoan's attack roll successfully hits the target's KAC + 4, the ashypsozoan can perform a reposition combat maneuver on that target.
''Shock Arc ([[Ex]])'' As a ranged attack, an ashypsozoan can fire an arc of bioelectricity with a 40-foot range increment, to a maximum range of 80 feet.
</div>
After nearly 500 years, the atmospheric glaciers on Ashypso are thawing, finally revealing the planet below. Its sapient inhabitants, [[trinirs]], have awoken from a long hibernation to discover an existence they have no memory of. However, they weren't the only secret buried under the kilometers of frozen atmosphere.
Ashypsozoans are massive medusozoans, akin to hydrozoans, made up of a colony of specialized organisms working in concert. These creatures individually encysted during Ashypso's great freeze. As the ice melts, these tiny organisms continue to emerge from their stasis and once again bond to form large colonies. Each of these creatures is nearly mindless alone, but when they join together, they gain a predatory cunning. Once awoken, an ashypsozoan is ravenous, burrowing through lattices of ice and flying through the thin atmosphere searching for viable prey. The colony feeds on anything it finds, from microorganisms to larger prey that can be taken down with the substantial amounts of bioelectricity an ashypsozoan creates. An ashypsozoan can absorb lighter artificial materials in addition to organic compounds, meaning artificial beings such as androids and trinirs aren't safe. Strong electromagnetic fields break down what the colony consumes, reducing it to essential components the ashypsozoan uses for nourishment and atmospheric buoyancy.
A typical ashypsozoan is 12 feet long, although its tentacles can extend much farther. Despite its size, much of the creature is filled with gas or space, so it weighs only about 200 pounds.
You are sleeping and [[helpless]]. While asleep, you take a –10 penalty to [[Perception]] checks to notice anything. If you succeed at a Perception check to notice something despite the penalty, you automatically awaken. You are also awoken if you are slapped or wounded. An ally can wake you as a standard action.
<div class="statblock">
* ''CR'' 18; ''XP'' 153,600
* N Huge outsider (extraplanar, spectra)
* ''Init'' +8; ''Senses'' [[darkvision]] 60 ft., //[[detect alignment]]//; ''Perception'' +31
!!! DEFENSE
* ''HP'' 320
* ''EAC'' 31; ''KAC'' 32
* ''Fort'' +16; ''Ref'' +16; ''Will'' +22
* ''Defensive Abilities'' [[void adaptation]]; ''DR'' 15/chaotic, evil, good, or lawful; ''Immunities'' electricity; ''Resistances'' cold 5, sonic 5; ''SR'' 29
!!! OFFENSE
* ''Speed'' 50 ft., fly 100 ft. ([[Ex]], perfect)
* ''Melee'' slam +29 (8d8+22 B) or tail slash +29 (8d8+22 S)
* ''Multiattack'' 2 slams +23 (5d8+22 B), tail slash +23 (5d8+22 S)
* ''Ranged'' bloom beam +27 (3d12+18 F; critical [[stun|Stun (critical)]])
* ''Space'' 15 ft.; ''Reach'' 15 ft.
* ''Offensive Abilities'' balancing gaze, hyperflux
* ''Spell-Like Abilities'' (CL 18th; melee +27)
** 1/day—//[[chain surge]]// (DC 27), //[[greater discharge]]// (DC 27)
** 3/day—//[[control machines]]// (DC 26), //[[holographic image]]// (5th level), //[[remove radioactivity]]//, //[[synapse overload]]// (DC 26)
** At will—//[[implant data]]//, //[[recharge]]//, //[[true seeing]]//
!!! STATISTICS
* ''Str'' +4; ''Dex'' +8; ''Con'' +4; ''Int'' +11; ''Wis'' +6; ''Cha'' +6
* ''Skills'' [[Acrobatics]] +31 (+39 to fly), [[Computers]] +36, [[Engineering]] +36, [[Mysticism]] +36, [[Sense Motive]] +31
* ''Languages'' machine telepathy 100 ft., [[truespeech]]
* ''Other Abilities'' seek outcome, slip drive, [[spaceflight]] (Mysticism)
!!! ECOLOGY
* ''Environment'' any (the Drift)
* ''Organization'' solitary or triad (1 aspecna and 2 iridias)
!!! SPECIAL ABILITIES
''Balancing Gaze ([[Su]])'' As a full action, an aspecna can force each chaotic, evil, good, or lawful creature within 30 feet to attempt a DC 25 Will saving throw. Creatures that fail this save gain the [[staggered]] condition for 1d4 rounds, and the DCs of their spells and abilities are reduced by 2 for the same duration. Creatures that succeed at this save are immune to that aspecna's balancing gaze for 24 hours. This is a sense-dependent effect.
''Bloom Beam ([[Ex]])'' An aspecna's bloom beam is a ranged attack with a range of 120 feet, the [[blast]] weapon special property, and the [[stun|Stun (critical)]] critical hit effect.
''Hyperflux ([[Su]])'' The area surrounding an aspecna crackles with constant uncertainty and potential for change as it shuffles reality, reorganizing and optimizing the planar energies on which it draws. As a move action, an aspecna can change the type of energy damage (from fire to sonic, for instance) done by its bloom beam and spell-like abilities for 1 minute.
''Machine Telepathy ([[Ex]])'' A spectra can communicate with and through technological devices within a certain range (usually 100 feet), as well as with other creatures that have machine telepathy. A spectra can also attempt [[Computers]] and [[Engineering]] checks at this range.
''Seek Outcome ([[Su]])'' An aspecna can peer into the causal nexus of ongoing events to calculate the most efficient course of action. An aspecna can take 10 on any skill check, even during combat or if stress or distractions would normally prevent it from doing so. In addition, three times per day, an aspecna can reroll a failed ability check, attack roll, or saving throw.
''Slip Drive ([[Ex]])'' A spectra has an internal biomechanical Drift engine that allows it to travel freely between the Driftand other planes, as well as between two non-Drift planes, using the normal rules for Drift navigation. A slip drive has an effective Drift engine rating equal to the half the spectra's CR, and a spectra need remain stationary for only 1 round (6 seconds) before engaging its slip drive.
</div>
Aspecnas, powerful spectra paragons with fan-like tails and faces that resemble blooming flowers, rarely interact directly with the Material Plane. These formidable outsiders instead concern themselves with maintaining the precarious balance of power among extraplanar forces in the Drift, opposing any who would attempt to establish strongholds with the intent of laying their own claim to a substantial expanse of Triune's realm. Aspecnas have on occasion appeared to correct the course of mortals who have become lost in the ever-shifting plane, and even intervened to protect weaker mortals from the predation of malevolent Drift-marooned outsiders. These rare but memorable acts have earned aspecnas the nickname "Drift angels" among those who regularly travel through the plane.
Lucrative schemes don't organize themselves. Behind every successful Aspis operation looms an Aspis mastermind: an adroit leader, organizer, and no-holds-barred negotiator ready to do whatever it takes to get the job done.
Masterminds never work alone, instead recruiting a team of ruthless experts and disposable muscle. Despite their unscrupulous methods, Aspis masterminds combine genius and charisma to inspire loyalty among minions ready to enact complex plans at a moment's notice. Most get their experience on the job as members of other crews, but a few are trained at secretive Aspis facilities in Near Space and the Vast.
Most Aspis masterminds are envoys, operatives, or witchwarpers, using their abilities of fear and misdirection to stay one step ahead of their foes. Masterminds train in [[Profession]] skills to supplement and hide their more illicit activities, favoring professions like corporate professional, lawyer, merchant, manager, politician, or writer.
The Aspis mastermind grants alternate class features at 4th, 6th, 9th, and 12th levels.
!! Imposing Entrepreneur (4th)
You gain [[Intimidate]] and one [[Profession]] skill as a class skill. For each of these skills that's already a class skill for you (or becomes a class skill) from a source other than this archetype, once per day you can choose to roll a check with that skill twice and take the better result. When you successfully use [[Intimidate]] to [[bully]] a
creature, you can spend a Resolve Point to gain one of the following benefits:
* Increase the duration of your Intimidate effect to 2d6 hours.
* Cause the creature's attitude toward you to become indifferent rather than unfriendly or hostile after the Intimidate effect ends.
* Leave a lingering sense of dread in the creature for a number of days equal to the higher of your Intelligence or Charisma modifiers (minimum 1); during this time, you can [[bully]] the creature again by spending 1d4 rounds conversing with them.
!! Brilliant Scheme (6th)
You can devise complicated plans that rely on precise coordination and subtlety. Once per day, you can spend 10 minutes coaching up to six other creatures about an imminent scheme, at which time you choose one of the following actions for each participating creature. You can choose actions in any combination, selecting the same action for every creature or different actions for each creature:
* Aim a weapon with the [[sniper]] property as though the creature had expended a move action to do so.
* Attempt an [[Acrobatics]] check to [[escape]] a grapple or restraints.
* Attempt a [[Bluff]] check to create a [[diversion]].
* Attempt an [[Intimidate]] check to [[demoralize]] a creature.
* [[Covering fire]] or [[harrying fire]].
* Draw a weapon or object (including one hidden on their person using [[Sleight of Hand]]).
* [[Guarded step]].
* Manipulate an item.
The GM might allow additional actions, though such options should be something a creature could perform with a move action and that doesn't directly harm others.
You can take a standard action to execute your scheme; when you do, you allow one creature you've coached that day, and who can see or hear you, to perform the action you selected for them without spending one of their own actions. After they do, they lose the ability to benefit from your brilliant scheme for 1 day.
!! Plausible Deniability (9th)
Despite its underhanded strategies, the Aspis Consortium maintains a positive reputation, and you're adept at downplaying and misdirecting your rivals' suspicions. You gain a +4 insight bonus to [[Bluff]] checks to convince others that you aren't associated with, aware of, or responsible for dangerous allies, equipment, or contractual terms. For example, you could gain this bonus to disavow any connection to your bloodstained allies, insist you were unaware of illicit cargo on your starship, or feign surprise about details in a maliciously worded contract. In addition, you can spend 1 Resolve Point when you successfully [[feint]] against a target to conceal the fact that you're responsible for the subsequent attack. When you do, you can also attempt a Bluff check (DC = 10 + the target's [[Sense Motive]] bonus) to trick the target of this subsequent attack into thinking the attack originated from another creature that's present. The Bluff DC is modified based on the target's attitude toward you, as if you were telling a lie, and also for the plausibility of your deception, at the GM's discretion; for example, blaming an unarmed individual for your attack would increase the DC by 5.
!! Executive Direction (12th)
Your unflappable genius lets you improvise plans perfectly and seamlessly. When you coach a group of characters in your brilliant scheme, you no longer have to select the actions they can take ahead of time. Instead, when you take a standard action to execute a scheme, you can select the action the creature performs from the list of actions allowed by brilliant scheme. In addition, when you execute a scheme, the affected creature gains a surge of confidence that grants them 4d6 temporary Hit Points that last 1 minute.
Throughout the galaxy, shadowy figures move unseen, expertly eliminating targets before disappearing back into anonymity. Assassins originate from many different home worlds and cultures, and while no single tradition defines these gifted killers, several secretive societies train accomplished warriors into finely honed tools of discreet murder. Others learn the deadly craft on their own or from a mentor, refining their skills through decades of mercenary work. Some see assassins as supernatural beings—avatars of death that employ reality-bending magic to eliminate their targets. Others maintain that assassins gain their edge via superior technology. In truth, assassins make use of all manner of tactics, and some even use technomagical methods. Many organizations court assassins with exorbitant salaries and promises of immunity.
While many of the galaxy's denizens are capable of committing murderous acts, assassins regard death as a painter does a palette. A skilled assassin can observe a target and determine the precise moment to strike, dealing irreparable damage to the target's vital organs and ending their life with a single lethal blow. Many assassins also employ magic capable of tampering with the memories of potential witnesses, while others deploy technology that obscures their presence from modern surveillance.
Assassins value anonymity and discretion above all else; leaving a fragment of security footage behind or allowing their identity to be discovered can cost an assassin their job, if not their life. Many operatives and soldiers seek training as an assassin, but anyone with a talent for stealth and the willingness to kill can become an assassin. Though murder is part of the job description, not all assassins have evil alignments. Some individuals with this specialized training use their talents to serve a higher cause, but many are hardened criminals or jaded veterans with too much blood on their hands. Rumor has it that some law enforcement agencies in the galaxy employ small units of assassins responsible for tracking and taking down high-risk criminal targets.
The assassin archetype grants alternate class features at 6th, 12th, and 18th levels.
!! Opportunistic Cloaking (6th)
You know how to manipulate your environment and take advantage of gaps in others' perception to become undetectable even in plain sight. Once per day, you can attempt a [[Stealth]] check to hide as though you had succeeded at the create a [[diversion]] task of the [[Bluff]] skill against up to six creatures you're observing. This ability functions only in crowded areas or in dim light or darkness; the GM might determine you can use this ability in similar circumstances.
!! Lethal Strike (12th)
As a standard action, you can study the weaknesses of a single enemy that you're observing. Once per day, on a round after you spend 2 consecutive rounds studying the same enemy this way, you can either take a full action to move up to your speed and make a single attack with a melee weapon, or take a full action to attack with a sniper weapon (using the sniper weapon's sniper range if applicable), against the studied enemy. This lethal strike attack deals damage as normal, and the target must also succeed at a Fortitude saving throw (DC = 10 + half your character level + your key ability modifier) or take 1d6 additional damage per your character level. If the target fails the save, it must also attempt a second Fortitude saving throw with the same DC. If it fails this second save, it dies instantly; this is a death effect.
In addition, whenever you kill a creature using your lethal strike, you can attempt a [[Stealth]] check opposed by [[Perception]] checks to notice by those in the vicinity; if successful, you prevent those nearby from identifying you as the attacker. If you succeed by 5 or more, bystanders might not even immediately notice that the target is dead (at the GM's discretion).
!! Exploitative Strike (18th)
When you use lethal strike, you can force your target to roll its initial save twice and take the worse result. Alternatively, when a target that you studied on your previous turn is within your reach and an ally's attack results in a critical hit against it, you can activate lethal strike as a reaction.
When assembled, an assassin rifle looks similar to a typical sniper rifle. Its modular construction, however, allows it to be broken down into small component parts that can be hidden on the user's person—or even smuggled in a ysoki's cheek pouches—making the weapon difficult to detect or identify. Assassin rifles are available in stalker, shadow, phantom, spectre, and wraith models.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|assassin rifle, stalker | 3 | 1,510 | 1d10 P | 60 ft. | — | 1 round | 1 | 1 |[[breakdown]], [[sniper]] (250 ft.), [[unwieldy]] |
|assassin rifle, shadow | 6 | 4,550 | 2d6 P | 60 ft. | — | 1 round | 1 | 1 |[[breakdown]], [[sniper]] (500 ft.), [[unwieldy]] |
|assassin rifle, phantom | 9 | 14,900 | 3d6 P | 60 ft. | — | 1 round | 1 | 1 |[[breakdown]], [[sniper]] (600 ft.), [[unwieldy]] |
|assassin rifle, spectre | 12 | 39,500 | 5d6 P | 70 ft. | — | 1 round | 1 | 1 |[[breakdown]], [[sniper]] (750 ft.), [[unwieldy]] |
|assassin rifle, wraith | 17 | 278,000 | 11d6 P | 70 ft. | — | 1 round | 1 | 1 |[[breakdown]], [[sniper]] (1,000 ft.), [[unwieldy]] |
</div>
<div class="statblock">
* ''CR'' 9; ''XP'' 6,400
* N Medium construct (technological)
* ''Init'' +6; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +22
!!! DEFENSE
* ''HP'' 135
* ''EAC'' 22; ''KAC'' 23
* ''Fort'' +6; ''Ref'' +10; ''Will'' +6
* ''Defensive Abilities'' [[integrated weapons]], retractable weapons; ''Immunities'' [[construct immunities]]
* ''Weaknesses'' vulnerable to critical hits, [[vulnerable]] to electricity
!!! OFFENSE
* ''Speed'' 40 ft., climb 40 ft.
* ''Melee'' microserrated [[longsword]] +18 (2d10+13 S; critical [[bleed]] 2d6)
* ''Ranged'' advanced [[semi-auto pistol]] +20 (2d6+9 P) or advanced [[shirren-eye
rifle]] +20 (2d10+9 P)
* ''Offensive Abilities'' holographic trick
!!! STATISTICS
* ''Str'' +4; ''Dex'' +6; ''Con'' —; ''Int'' +1; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +22, [[Athletics]] +17 (+25 to climb), [[Computers]] +17,
[[Stealth]] +22
* ''Languages'' Common
* ''Other Abilities'' holographic camouflage, nanite repair, target tracking, [[unliving]]
* ''Gear'' microserrated [[longsword]], advanced [[semi-auto pistol]] with 48 small arm rounds, advanced [[shirren-eye rifle]] with 16 sniper rounds
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or team (3–5)
!!! SPECIAL ABILITIES
''Holographic Camouflage ([[Ex]])'' An assassin robot uses advanced sensors in conjunction with a [[holographic projector]] to blend in with its surroundings. If the assassin robot remains still for 1 round, it gains a +10 bonus to [[Stealth]] checks and is treated as having concealment until it moves out of its square; this doesn't stack with [[invisibility]] or similar effects. As a move action, the robot can amplify this camouflage for up to 10 rounds per day, using the duration in 1-round increments. While the camouflage is amplified, the robot is affected as if by the //[[invisibility]]// spell.
''Holographic Trick ([[Ex]])'' As a full action, an assassin robot can move up to its speed, blurred by holographic camouflage, and then make an attack with a one-handed melee weapon or small arm. After its movement, the robot can attempt a [[Stealth]] check; this check is opposed by a [[Perception]] check attempted by its target, and if the robot is successful, its target is [[flat-footed]] against the attack and takes 5d8 additional damage on a hit.
''Nanite Repair ([[Ex]])'' An assassin robot's nanites heal it, restoring a number of Hit Points per hour equal to its CR. Once per day as a full action, the robot can regain 6d8 Hit Points.
''Retractable Weapons ([[Ex]])'' When not in use, each of an assassin robot's weapons is folded inside the robot's body and hidden from sight. A creature unaware of the robot's hidden weapons must succeed at a DC 35 [[Perception]] check to notice one. An assassin robot can deploy any or all of its weapons as a swift action or as part of making an attack or full attack. Its weapons are mounted, leaving the robot's hands free, and the robot can't be disarmed of them. As a swift action, the robot can retract any or all of its weapons.
''Target Tracking ([[Ex]])'' As a move action, an assassin robot can lock on to one target it can see. The tracked target doesn't benefit from concealment against the robot and can't succeed at [[Bluff]] checks against the robot to create a diversion. This tracking ends if the tracked target dies or is destroyed, the robot ceases being able to see the target, or the robot ends it as a move action.
</div>
Assassin robots are killing machines useful for stealthy slayings or gruesome public displays. A user can program targets into the robot, dispatch the unit, and rest assured. The robot relentlessly pursues its quarry, fearing nothing and using microfiber setae on its hands and feet to traverse vertical and horizontal surfaces with ease. Whether it succeeds, fails, escapes, or suffers destruction, the robot leaves little evidence behind—an assassin robot that is captured or destroyed automatically purges its memory and burns out its sensitive hardware components, making tracing the robot's mission and origin extremely difficult.
Typical assassin robots are 6 feet tall, weigh 300 pounds, and use the weapons detailed in the stat block above, but they can be outfitted with other armaments as a mission requires. In particular, assassin robots on missions where more subtlety is called for use needler pistols stocked with poisoned darts.
<div class="statblock">
* ''Hit Point Advancement'' +0; ''EAC'' +1; ''KAC'' +2
* ''Upper Limb Slots'' 3; ''Melee Attack'' +0*; ''Ranged Attack'' +0*
* ''Dual Strike (1 PP)'' When making a full attack with two different weapons mounted on your arms, you attack twice with one weapon and once with the other. You take a –4 penalty to these attacks.
* ''Cost'' 1 × tier
</div>
Built to carry a small arsenal, these arms turn any mech into a one-machine army.
<div class="statblock" >
* ''Level'' 12; ''Price'' 114,500
* Gargantuan air vehicle (40 ft. wide, 20 ft. long, 15 ft. high)
* ''Speed'' 50 ft., full 800 ft., 90 mph (fly)
* ''EAC'' 26; ''KAC'' 28; ''Cover'' cover
* ''HP'' 200 (100); ''Hardness'' 14
* ''Attack (Collision)'' 13d10 B (DC 15)
* ''Attack'' aurora shock caster (2d12 E)
* ''Attack'' medium machine gun (3d10 P)
* ''Modifiers'' –1 [[Piloting]], –4 attack (–6 at full speed)
* ''Systems'' autopilot (Piloting +22), enhanced sensors ([[darkvision]] 1 mile), expansion bays (2), planetary [[comm unit]]
* ''Passengers'' 11
</div>
This partially open aircraft has an antigrav rotor and two turrets.
Assault hammers have heavily weighted metal heads and relatively light aluminum or polycarbonate grips. Hammer heads can be custom-made with designs or logos imprinted on the surface. Comet, gravity well, and meteoric hammers have weighted or pneumatically driven heads that deliver accelerated blows.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|assault hammer | 1 | 95 | 1d6 B | — | 1 |[[analog]] |
|assault hammer, comet | 10 | 16,900 | 4d6 B | — | 1 |[[powered]] (capacity 20, usage 2) |
|assault hammer, meteoric | 16 | 164,500 | 11d6 B | — | 1 |[[analog]] |
|assault hammer, gravity well | 19 | 551,000 | 15d6 B | — | 1 |[[powered]] (capacity 40, usage 2) |
</div>
<div class="statblock">
* ''CR'' 12; ''XP'' 19,200
* LN Huge dragon (technological)
* ''Init'' +8; ''Senses'' [[blindsight]] (vibration) 60 ft., [[darkvision]] 120 ft., [[low-light vision]]; ''Perception'' +22
!!! DEFENSE
* ''HP'' 200
* ''EAC'' 26; ''KAC'' 28
* ''Fort'' +16; ''Ref'' +16; ''Will'' +13
* ''Defensive Abilities'' [[void adaptation]]; ''Immunities'' fire, paralysis, sleep; ''SR'' 23
* ''Weaknesses'' [[vulnerable]] to electricity
!!! OFFENSE
* ''Speed'' 40 ft., fly 200 ft. ([[Ex]], clumsy)
* ''Melee'' bite +23 (6d4+17 P)
* ''Multiattack'' bite +17 (3d4+17 P), 2 claws +15 (3d4+17 S), tail slap +15 (3d4+17 B)
* ''Ranged'' laser bolt +26 (6d4+12 F; critical [[burn]] 3d6)
* ''Space'' 15 ft.; ''Reach'' 10 ft. (15 ft. with bite)
* ''Offensive Abilities'' [[breath weapon]] (45-ft. cone or 90-ft. line, 13d6 F, Reflex DC 19 half, usable every 1d4 rounds), [[crush]] (6d4+17 B)
!!! STATISTICS
* ''Str'' +5; ''Dex'' +8; ''Con'' +3; ''Int'' +4; ''Wis'' +3; ''Cha'' +3
* ''Skills'' [[Acrobatics]] +27 (+19 to fly), [[Computers]] +22, [[Piloting]] +22, [[Sense Motive]] +22
* ''Languages'' Common, Draconic
* ''Other Abilities'' robotic, [[spaceflight]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Laser Bolt ([[Ex]])'' A laser dragon can fire laser beams from their mouth, eyes, or wingtips. This attack has a range increment of 100 feet, targets EAC, and has the [[burn]] critical hit effect that lists a number of d6s equal to one quarter their level (minimum 1). The attack also has the [[sniper]] weapon special property with a range of 1,000 feet.
''Robotic ([[Ex]])'' For effects targeting creatures by type, laser dragons count as both dragons and constructs (whichever allows an ability to affect them for abilities that affect only one of those types, and whichever is worse for abilities that affect both types). They receive a +2 racial bonus to saving throws against disease, mind-affecting effects, and poison unless those effects specifically target constructs. Additionally, they are protected from
environmental effects as if wearing armor (of an item level equal to the dragon's CR) with its
environmental protection active.
</div>
<div class="statblock">
* ''Level'' 11; ''Price'' 79,000
* Large land vehicle (5 ft. wide, 10 ft. long, 6 ft. high)
* ''Speed'' 45 ft., full 700 ft., 80 mph (hover)
* ''EAC'' 23; ''KAC'' 24; ''Cover'' cover
* ''HP'' 170 (85); ''Hardness'' 11
* ''Attack (Collision)'' 9d10 B & P (DC 18); deals an additional 1d6 bleed damage against living creatures
* ''Attack'' heavy reaction cannon (3d10 P)
* ''Modifiers'' –1 [[Piloting]], –2 attack (–4 at full speed)
* ''Systems'' [[autocontrol]], spiked plow, vacuum shields
* ''Passengers'' 3
!!! SPECIAL ABILITIES
''Spiked Plow ([[Ex]])'' An assault plow's spiked ramming prow deals piercing damage in addition to bludgeoning damage in a collision. The spikes inflict deep, jagged puncture wounds on living creatures, causing additional bleed damage.
''Vacuum Shields ([[Ex]])'' Life support systems and shielding protect these vehicles' occupants from the harmful effects of space for a number of hours equal to the vehicles' level.
</div>
A lightweight, speedy hover truck with a spiked ramming prow, the assault plow is popular in the Diaspora for its ability to protect passengers from the dangers of space.
<div class="statblock">
* ''CR'' 1; ''XP'' 400
* N Medium ooze (technological)
* ''Init'' +4; ''Senses'' [[blindsight]] (vibration) 60 ft., [[sightless]]; ''Perception'' +7
!!! DEFENSE
* ''HP'' 17
* ''EAC'' 11; ''KAC'' 12
* ''Fort'' +3; ''Ref'' –1; ''Will'' +2
* ''Immunities'' [[ooze immunities]]
* ''Weaknesses'' [[vulnerable]] to electricity
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' pseudopod +6 (1d4+3 B)
* ''Space'' 5 ft.; ''Reach'' 5 ft. (10 ft. with pseudopod)
* ''Offensive Abilities'' disassemble
!!! STATISTICS
* ''Str'' +2; ''Dex'' +1; ''Con'' +4; ''Int'' —; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +10, [[Stealth]] +10
* ''Languages'' Common (can't speak any language)
* ''Other Abilities'' assemble, [[compression]]
!!! ECOLOGY
* ''Environment'' any urban
* ''Organization'' solitary, pair, or manufactory (3–5)
!!! SPECIAL ABILITIES
''Assemble ([[Ex]])'' In a process that takes 1 uninterrupted minute, an assembly ooze can craft a random piece of technological gear using its store of virtual UPBs (see disassemble below). An assembly ooze can craft a piece of technological gear of no more than 5 bulk with a cost equal to the number of virtual UPBs it spends, but with an item level no greater than its CR + 2 (3 for most assembly oozes). There is a 25% chance that a piece of gear an assembly ooze crafts has the [[broken]] condition. Roll 1d8 on the table below to determine what kind of gear the assembly ooze creates.
<div class="table-wrapper">
| d8 |Gear |h
| 1 |basic or advanced melee weapon |
| 2 |small arm or longarm |
| 3 |heavy weapon or sniper weapon |
| 4 |grenade |
| 5 |ammunition |
| 6 |light or heavy armor |
| 7 |armor upgrade |
| 8 |technological item |
</div>
''Disassemble ([[Ex]])'' As a full action, an assembly ooze can engulf an unattended piece of technological gear of no more than 5 bulk and with an item level no greater than its CR + 2 (3 for most assembly oozes) within reach of its pseudopod. Unless the object succeeds at a DC 12 Fortitude saving throw, the ooze moves into that object's space and deconstructs it into its component parts. The assembly ooze gains a number of virtual UPBs equal to the gear's price in credits. An assembly ooze can hold a maximum number of virtual UPBs equal to 100 × its Constitution modifier (400 for most assembly oozes). In addition, if an assembly ooze succeeds at a grapple combat maneuver against a creature with the technological subtype, that creature takes 1d6+1 acid damage. The assembly ooze gains 1 virtual UPB for every point of damage it deals in this way.
</div>
Thought to have been created on the planet Bretheda as a biotechnological replacement for automation processes, assembly oozes are essentially cores of nanobots suspended within blobs of animated protoplasm. As the ooze absorbs raw materials, the nanobots work at the molecular level to turn that matter into a functioning technological device, the blueprints of which have been entered into the machines' original programming.
Due to sloppy programming procedures, the code embedded within an assembly ooze has an unfortunate tendency to easily become corrupted, causing the ooze to haphazardly deconstruct any nearby tech and use the pieces to build random items. The first time this occurred, several assembly oozes escaped the ensuing purge and built copies of themselves, eventually spreading to various shadowy corners of the galaxy. While these rogue oozes are not all that dangerous and have no innate malice, they are the bane of space stations, starships, weapon depots, and anywhere else technology is present. When discovered in such a location, assembly oozes are ruthlessly exterminated, lest their nonstop disassembling of all things mechanical and electronic destroy critical systems—to say nothing of the new, potentially lethal devices left in their wake. While assembly oozes are still used in some factories on Bretheda and its more toxic moons, their use is highly regulated.
An assembly ooze resembles a human-sized, silvery cube, though its amorphous form allows it to slip through incredibly small openings. As it moves, surging forward on its pseudopods, random scraps the ooze has already collected sometimes float near the creature's surface before quickly disappearing into its form. Entirely focused on absorbing and reshaping any available technology, assembly oozes usually ignore organic matter, living or otherwise, unless threatened. However, should a creature have mechanical or cybernetic elements attached to or incorporated into its physical form, an assembly ooze could very well cause that creature incidental harm in its attempts to harvest the technological parts. Sentient robots are extremely wary of assembly oozes, as their entire bodies could be targeted for processing into raw resources.
Every so often, an assembly ooze holding its maximum number of virtual UPBs undergoes a form of mitosis, manufactures an identical copy of its computerized core, and splits its protoplasm into two equal parts. The nanobots of the two new assembly oozes then use the remaining virtual UPBs to build enough protoplasm to form an assembly ooze's normal cube shape. This process usually takes about 1 hour and consumes all of the parent ooze's virtual UPBs. That assembly oozes contain the programming necessary to reproduce is troubling to those who realize its implications: a single rogue assembly ooze introduced into an environment stocked with technological items could completely overrun such a place in a matter of days, leaving behind a wasteland of cheap laser pistols and smoke grenades that is inhabited only by the oozes—and any remaining organic beings unfortunate enough to be stranded in the area after their vessels are consumed.
In some cases, certain unscrupulous types have used assembly oozes as weapons. If slipped into a starship or military base, a manufactory of assembly oozes can easily cause enough chaos to allow an operative to sneak in and complete her mission with very little opposition. However, this is also highly risky to the would-be saboteur, as even one misplaced assembly ooze could render her escape vessel inoperative. Assembly oozes can be temporarily incapacitated by strong electrical fields and kept at bay by mystical force fields, but anyone restraining an assembly ooze must be constantly vigilant and stay out of reach of the ooze's pseudopod.
A single assembly ooze can craft handheld objects, but some claim to have seen assembly oozes working together to construct entire starships and other large and complex machinery. Where these oozes received their programming is unknown, as is whether such oozes have a master directing their efforts or if they have gained a collective sentience and are working for their own mysterious purposes. Nevertheless, most engineers agree that, given enough raw material and enough time, there is no technological item a directed horde of assembly oozes couldn't build, putting it together piece by piece.
An assembly ooze is a cube exactly 5 feet on each side that weighs 400 pounds.
You can use Engineering to assess a structure or a piece of machinery to determine its stability, usability, and structural weak points. To do so, you must be within 30 feet of the structure and able to perceive it with a precise sense, or you must have access to detailed schematics. The base DC of this check is 15, modified by circumstances such as the structure's complexity or the extent of damage. If you succeed, you determine one of the following statistics, plus an additional statistic for every 5 by which you exceed the DC: the structure's break DC, its hardness, or its Hit Points. If you fail the check, you can retry it after 24 hours.
<div class="table-wrapper">
|Task | DC |h
|Assess stability | 15 |
|Determine structural weak point | 20 |
|Circumstance | DC Modifier |h
|Simple structure (rope bridge or unstable ceiling) | -5 |
|Complex structure (suspension bridge or space station wall) | +5 |
|Obvious damage | -5 |
|Slight but consequential damage | +5 |
|Intentional sabotage | +10 |
</div>
<div class="statblock">
* ''CR'' 12; ''XP'' 19,200
* CN Medium fey
* ''Init'' +5; ''Senses'' [[low-light vision]]; ''Perception'' +22 (+30 in space)
!!! DEFENSE
* ''HP'' 170
* ''EAC'' 25; ''KAC'' 26
* ''Fort'' +13; ''Ref'' +13; ''Will'' +15
* ''Immunities'' cold, fire, vacuum
!!! OFFENSE
* ''Speed'' 30 ft., fly 60 ft. ([[Su]], perfect)
* ''Melee'' tail whip +20 (2d12+13 S)
* ''Ranged'' electrical blast +18 (2d8+12 E)
* ''Space'' 5 ft.; ''Reach'' 5 ft. (10 ft. with tail whip)
* ''Offensive Abilities'' sensor song
* ''Spell-Like Abilities'' (CL 12th; melee +20)
** 1/day—//[[confusion]]// (DC 23), //[[overload systems]]// (DC 23)
** 3/day—//[[arcane sight]]//, //[[charm monster]]// (DC 22), //[[discharge]]// (DC 22), //[[nondetection]]//
** At will—//[[holographic image]]// (2nd-level, DC 21), //[[spider climb]]//
!!! STATISTICS
* ''Str'' +1; ''Dex'' +5; ''Con'' +4; ''Int'' +2; ''Wis'' +3; ''Cha'' +8
* ''Skills'' [[Bluff]] +27, [[Culture]] +27, [[Stealth]] +22
* ''Languages'' Common; [[telepathy]] 300 ft.
* ''Other Abilities'' [[no breath]], wake rider
!!! ECOLOGY
* ''Environment'' any vacuum
* ''Organization'' solitary, pair, or choir (3–12)
!!! SPECIAL ABILITIES
''Electrical Blast ([[Ex]])'' As an attack, an asteray can unleash an electrical blast with a range increment of 70 feet at a single target.
''Sensor Song ([[Ex]])'' An asteray can "sing" electronic signals that mask or mimic sensor readings. As a standard action, an asteray can create a false image of an object as if it had cast the 4th-level version of the spell //[[holographic image]]// (CL 12th). This false reading affects only electronic sensors. Multiple asterays can sing together, increasing the caster level by 1 for each asteray beyond the first singer for the purposes of determining the spell's range and area affected.
''Wake Rider ([[Su]])'' By touching a starship, an asteray can bond to the energy wake it leaves as it travels. This allows the fey to match speeds with the starship and ride along with it, treating the ship as if it were the "ground" so long as it remains within 100 feet. If the starship enters the Drift, the asteray can choose to accompany the ship into the Drift, or it can disengage as a reaction and remain behind.
</div>
When humanoids first learned to ply the seas and oceans on Golarion, they encountered many beautiful and dangerous beings who cavorted in the waves and lured their vessels onto the rocks with enchanting songs. In time, they learned to differentiate the playful mermaid, the cruel rusalka, the bloodthirsty scylla, and their kin, and with that knowledge, the damage these strange beings could inflict was minimized. But when humanoids blasted into the stars, they found a new array of mischievous, mysterious creatures that threatened to lead their vessels into danger. Chief among these threats is the wily asteray. Delicate and angelic looking in zero gravity, asterays are a race of vacuum-dwelling fey that ride the solar winds between space debris, asteroid belts, and planetary rings, playing in the dust, dancing in microgravity, and seeking new and beautiful sights. Their bodies consist of little beyond lightweight, flexible bones and the powerful sinews that bind them together, creating a vaguely humanoid upper body and a lower body consisting of a large appendage that absorbs cosmic radiation and grants the fey the ability to propel itself through space. With elegant forms and diaphanous tails, they appear gentle and welcoming. Wide eyes—blue or green in color—express a variety of for a mouth, asterays have featureless faces. They are well adapted to life in the void, with sensitive vision, a variety of natural spells, and the capability to generate powerful bolts of electricity to defend themselves. They are also ravenous beyond compare. While space dust and solar radiation carry just enough nourishment to fuel their antics, asterays hunger for organic molecules. They pause their endless dances to scour asteroids and explore wrecked ships for sustenance. When food grows too scarce or boredom overwhelms them, asterays crawl into the dark corners of space and hibernate for weeks, months, or years at a time.
Often called "deep angels" for their habit of following ships through the vastness of space to scavenge any discarded treats and pick hulls clean of organic stowaways, asterays can also become menaces. The electronic signals they produce to communicate with one another mimic the sensor signals emitted by most starships, and in the eons that planet-bound creatures have explored their territory, asterays have learned to "sing" false sensor signals, mimicking ships' distress signals or cloaking navigational hazards such as high-density debris fields. Individual asterays are a danger only to smaller spacefaring vessels, but several working in tandem can lure even well-equipped warships to their doom thanks to their inherent magic. While few of these fey are cruel enough to hunt humanoids for food, they hold few qualms about eating whatever remains after a frightened crew ejects from a incapacitated starship, including the corpses of any fallen.
Asterays originally spawned in those few magic-rich star systems where the First World naturally overlapped with the void. For eons, they remained confined to these backwater systems, unable to reach inhabited areas within their lifetimes, but the first mortal vessels to explore space provided the fey an exit. Asterays can ride the cosmic wakes of starships, regardless of their speed, hitchhiking on these explorers like remoras on a shark, and for much the same purpose. Today, most settled star systems boast at least a small colony of the capricious fey. Their domains are often in spots that have easy access to major space lanes, and they are marked by large cave-pocked asteroids where the asterays build their nests and hoard treasures. Wrecked ships invariably float through these spaces, often serving as new navigational hazards the fey either cloak with their sensor songs or use as tempting targets to lure in greedy scavengers.
While not inherently malicious, asterays are alien in mind and deed. They understand that most creatures need air, water, and food, but they have difficulty prioritizing others' needs over their own hunger and amusement. Much of their apparent cruelty and greed stems from this alien mindset and boredom; thus, those travelers who can amuse them or compel some level of empathy stand to gain powerful allies in the void.
A typical asteray is about 7-1/2 feet from its head to the end of its tail, though it could appear quite shorter if its lower appendage becomes bunched up or twisted. An average asteray weighs only 75 pounds.
<div class="statblock" >
* ''Level'' 8; ''Price'' 32,700
* Huge land, tunneling, and water vehicle (10 ft. wide, 20 ft. long, 10 ft. high)
* ''Speed'' 30 ft., full 550 ft., 60 mph (hover and swim); 30 ft., full 90 ft., 10 mph (burrow through stone)
* ''EAC'' 20; ''KAC'' 21; ''Cover'' total cover
* ''HP'' 115 (57); ''Hardness'' 11
* ''Attack (Collision)'' 8d10 B (DC 14); ignores 8 points of hardness
* ''Modifiers'' –2 [[Piloting]], –3 attack (–6 at full speed)
* ''Systems'' autocontrol, enhanced sensors ([[darkvision]] 120 ft., [[sense through]] [vision, stone only] 60 ft.), expansion bay, system-wide [[comm unit]]
* ''Passengers'' 3
</div>
High-powered mining lasers and spinning drills allow this vehicle to move through solid stone, such as that found on asteroids, but it can just as easily move through water.
<div class="statblock">
* ''CR'' 1/2; ''XP'' 200
* N Small vermin
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +4
!!! DEFENSE
''HP'' 13
* ''EAC'' 10; ''KAC'' 12
* ''Fort'' +4; ''Ref'' +2; ''Will'' +0
* ''Defensive Abilities'' [[void adaptation]]; ''Immunities'' acid
!!! OFFENSE
* ''Speed'' 30 ft., climb 30 ft.
* ''Melee'' attach +6 or bite +6 (1d6+1 P)
* ''Offensive Abilities'' break objects
!!! STATISTICS
* ''Str'' +1; ''Dex'' +2; ''Con'' +3; ''Int'' —; ''Wis'' +0; ''Cha'' –4
* ''Other Abilities'' caustic remains, consume objects, [[mindless]]
!!! ECOLOGY
* ''Environment'' any vacuum
* ''Organization'' solitary, pair, brood (3–9), or infestation (10–40)
!!! SPECIAL ABILITIES
''Break Objects ([[Ex]])'' When attacking an object, an asteroid louse treats that object's ''hardness'' as 10 lower.
''Caustic Remains ([[Ex]])'' The remains of an asteroid louse are caustic and stay so for 5 rounds. This acid affects inorganic material and flesh. Creatures or items that touch the remains take 1d4 acid damage that treats hardness as 10 lower than it is. Anything in contact with the acid for a full round instead takes 8 acid damage.
''Consume Objects ([[Ex]])'' An asteroid louse can eat objects with a hardness of 10 or lower. It deals 1 damage per minute to an object it's consuming. An asteroid louse is sated and stops feeding on a given day after dealing 100 damage this way.
</div>
Asteroid lice feed on minerals in the rock of their airless habitats. These creatures and their eggs can float in space to a new home. However, careless quarrying and shipping have accelerated their spread through the galaxy.
Though they're one of the most mundane aspects of space, chunks of floating rock can nonetheless have a dramatic impact on starship operation and combat. Even clouds of small pebbles can jam engines, throw weapon systems out of alignment, and disrupt sensitive sensor equipment. Larger asteroids, especially with significant velocity, can obliterate smaller starships and cause significant damage to larger ones. The biggest asteroids blot out entire hexes of space, creating obstacles that starships must weave through but can use as cover during combat. Large, stationary asteroids also make good locations for orbital weapon platforms.
Asteroids generally take up 1 hex on the grid; larger asteroids can be represented by filling two or more adjacent hexes. Traveling through an asteroid's space is generally possible, but a starship risks taking damage when it does so. A starship's direct-fire weapons can't pass through an asteroid's space, but tracking weapons can move to avoid striking one.
When either a starship or an asteroid enters a hex occupied by the other, the pilot must attempt a [[Piloting]] check (DC = 10 + 1-1/2 × the starship's tier), with the ship taking 4d6 damage in a random quadrant and the ship's facing changing by 1 turn in either direction (determined randomly) on a failure. Moving asteroids deal an additional 1d6 damage per 2 hexes they move on the round that they collide, and the DC of the Piloting check to avoid a collision with a moving asteroid increases by 5.
If a ship collides with an asteroid or hits it with a starship weapon attack (AC 5 and TL 5) that would deal at least 1 Hull Point of damage, that hex of the asteroid is destroyed and all adjacent hexes are sprayed with rock fragments, dealing 4d4 damage unless an affected starship's pilot succeeds at a Piloting check to avoid the debris (DC = 10 + 1-1/2 × the starship's tier).
''Comet:'' This chunk of icy mass flies through space, leaving a trail of ice and gas behind. You can simulate a comet with a single large asteroid moving across the grid over the course of several rounds, trailed by a micrometeoroid cloud (see below) that represents the icy fragments making up the comet's tail.
''Fast-Moving Asteroids:'' These large groupings of asteroids travel together, usually caused by an explosion, a collision of larger asteroids, or a massive gravitational body pulling them out of orbit. At the beginning of combat, these asteroids start on one edge of the map and take up 1 hex each; place the asteroids farther apart than if you were using stationary asteroids. At the end of each helm phase, move each asteroid across the map in the same direction. Asteroids should always move in a straight line at a consistent speed, but they don't all need to move at the same speed. For a sustained asteroid storm, randomly place new asteroids at the edge of the grid after moving the asteroids that are already on it.
''Magma-Filled Asteroid:'' This asteroid forms when a globule of molten rock is exposed to the void of space, and its liquid magma core becomes encased in an obsidian shell. When a starship takes damage upon colliding with such an asteroid, the shell cracks, releasing roiling magma into all adjacent hexes. The colliding starship and all starships within 1 hex of the asteroid take 4d8 damage to a random quadrant. In addition, a starship can shoot at a magma-filled asteroid (AC 5 and TL 5); a hit with any weapon that would deal at least 1 Hull Point of damage punctures the obsidian shell and imparts the shot's momentum, causing magma to hurl violently into space and deal 4d8 damage to starships in adjacent hexes (instead of the normal 4d4 damage). Exceptionally hot asteroids could deal even greater amounts of damage upon impact or when destroyed, whereas asteroids whose interiors have lost most of their heat over time typically deal less damage.
''Massive Asteroid:'' A massive asteroid can be represented by 10 or more individual asteroids or by simply filling up an entire section of the combat grid with the asteroid. Asteroids of this size are impassible—starships can't enter their space— so they're useful as outer bounds to a battlefield. Space battles over the entrance to an asteroid mine, perhaps guarded by orbital weapon platforms, make a great backdrop to an epic starship confrontation.
''Micrometeoroid Cloud:'' Tiny pieces of debris regularly strike a starship during space travel, bouncing off its shields and hull to no effect. However, traveling through a large cloud of such debris can overwhelm a starship's conventional defenses and deal real damage. Mark hexes of micrometeoroid clouds on the grid; the hexes should be in groups of 4 to 7, with 2 to 3 hexes of space between them, and should take up no more than roughly a quarter of the total grid. If a starship flies through 1 or more of these hexes, it takes damage to its forward quadrant equal to 1d4 per micrometeoroid hex it flies through plus 1d4 for every 2 hexes the ship moved that round in total. Damage from micrometeoroid clouds has the ripper weapon special property. Moving clouds of micrometeoroids can be implemented in much the same way as fast-moving asteroids and might even be a precursor to a larger asteroid event.
''Other Debris:'' Other solid objects in space such as derelict ships, ice rings, and fields of debris from recent battles can pose similar threats to active starships. Use whatever rules are most analogous to your chosen phenomenon.
<div class="statblock">
* ''Tier'' 4
* N Huge starship outsider
* ''Speed'' 6; ''Maneuverability'' poor (turn 3)
* ''AC'' 16; ''TL'' 14
* ''HP'' 130; ''DT'' 5; ''CT'' 22
* ''Shields'' 80 (forward 15, port 25, starboard 25, aft 15)
* ''Attack (forward)'' astral tide (special; 15 hexes)
* ''Attack (port)'' tentacle (3d4; 3 hexes)
* ''Attack (starboard)'' tentacle (3d4; 3 hexes)
* ''Attack (turret)'' tail lash (4d6; 2 hexes)
* ''Other Abilities'' astral tide, improved shields, [[living starship]], swallow starship, [[void adaptation]]
!!! CREW ACTIONS
* ''Engineer (1 action)'' [[Engineering]] +10 (4 ranks)
* ''Gunner (3 actions)'' gunnery +9 (4th level)
* ''Pilot (1 action)'' [[Piloting]] +9 (4 ranks)
* ''Science Officer (1 action)'' [[Computers]] +15 (4 ranks)
!!! ECOLOGY
* ''Environment'' any (Astral Plane)
* ''Organization'' solitary or pod (2-6)
!!! SPECIAL ABILITIES
''Astral Tide ([[Ex]])'' Once per starship combat, during the gunnery phase, an astral leviathan can create a cone of roiling astral material in its forward arc, sucking a single Large or smaller starship within 15 hexes into its mouth to be swallowed. The pilot of the target ship must attempt a DC 21 [[Piloting]] check; on a failure, the ship is swallowed. On a success, the ship moves 10 hexes closer to the astral leviathan instead.
''Living Starship ([[Ex]])'' An astral leviathan is a living creature so immense that it functions as a starship (and thus engages only in starship combat). It has no crew but can take engineer, gunner, pilot, and science officer actions using the bonuses, level, and ranks listed above. Modifiers for its size, speed, and maneuverability have already been factored into its statistics. Use the following table to determine the effects when an astral leviathan takes critical damage.
<div class= "table-wrapper">
|constrained |k
| d% | System |Effect |h
| 1-30 | Tentacles |Condition applies to tentacle attacks in a random arc. |
| 31-60 | Tail |Condition applies to all pilot actions and all gunner actions using the tail lash. |
| 61-90 | Heart |Condition applies to all engineer actions, except when patching or repairing the heart. |
| 91-100 | Brain |During the next round, each of the leviathan’s actions has a 25% chance of failure. |
</div>
''Swallow Starship ([[Ex]])'' A starship sucked in by the astral leviathan’s astral tide ability can be swallowed. An astral leviathan’s gullet can hold one Large ship, two Medium ships, four Small ships, or eight Tiny ships. An astral leviathan can take an action during the gunnery phase to crush and digest starships inside it, dealing 2d6 damage (divide this damage equally across all arcs, starting with the forward arc and proceeding clockwise). A swallowed vessel can still attack. The astral leviathan’s interior has AC 12, TL 9, and DT 5. However, starship weapons deal half damage to the firing ship through a combination of blowback and the leviathan’s physical reactions. If a swallowed starship deals 22 damage to the leviathan’s interior, the ship blows a hole in the creature big enough to attempt to fly through. During the helm phase, the pilot of a swallowed starship can attempt to fly free with a DC 16 [[Piloting]] check, or DC 21 if the leviathan has no hole in it. On a failure, the starship remains within the leviathan.
</div>
Astral leviathans skim the Astral Plane, feeding on planar energies and currents of invisible astral dust. They attack viciously if provoked and hold long grudges.
Astral creatures are natives of the Astral Plane, a vast silvery void between planes.
* ''Traits:''
** [[DR]]/— with a value equal to creature's CR – 10 (minimum DR 1/—)
** when the creature isn't on the Astral Plane, it gains the extraplanar subtype
Developed to help remotely hack secure computers, an //astral transponder// uses the transitive Astral Plane to discreetly transmit data to another computer in a preprogrammed location.
When activated and placed in contact with a computer, an //astral transponder// transmits a signal to a preprogrammed receiving computer anywhere on the same plane. A user operating the receiving computer can affect the computer to which the transponder is attached without being physically present at that computer. Because the //astral transponder// transmits its signal through another plane, normal shielding, signal jammers, and similar countermeasures have no effect on the transmission. An //astral transponder// can be attuned to a new receiving computer with 1 minute of work and a successful DC 22 [[Computers]] or [[Mysticism]] check.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//astral transponder// | 5 | 3,500 | L |
</div>
Astriapis are bipedal arthropods with chitinous exoskeletons, membranous insectile wings, and large powerful mandibles. Their pigmentation runs the gamut from dark blues through bold yellows, and some astriapis selectively carve their exoskeletons to create individualistic patterns. They can also naturally produce a restorative honey. On average, astriapis stand around 6 feet tall and weigh between 120 and 150 pounds.
When astriapis awoke from the Gap, they found themselves as the sole sapient inhabitants of an immense megalopolis that covered the entire landmass of the Near Space planet Colveare. Through impressive feats of magical and engineering prowess, the planet's natural resources and native species had been preserved, with every part of the planet's ecosystem carefully integrated into the urban sprawl. Astriapi society as a whole immediately dedicated itself to studying the city-planet's workings to maintain the integrity of the system they found themselves a part of, surviving the struggles of post-Gap adjustments through a natural inclination to regimentation and cooperative obedience.
According to pre-Gap records, the city-planet of Colveare formed when a caste of astriapian warrior-priests produced and consumed honey made from the pollen of the zhufera flower (an aquatic plant native to the planet), which granted them prophetic dreams. Claiming these dreams foretold coming ecological and societal disaster, the priests led a violent planet-wide revolution, eventually creating a unified theocracy dedicated to the preservation of the planet through learning and faith. Today, those who claim descendance from these original revolutionaries refer to themselves as the Hierarchs, and they cultivate the only remaining crop of zhufera flowers from which they derive their closely guarded stores of the prophecy-producing honey. The Hierarchs pass accounts of their dreams down through a complex bureaucracy of executives, scientists, scholars, and engineers, who in turn interpret the dreams and assign tasks to other astriapis in a complicated, self-sustaining web of goals and assignments—all in the service of maintaining the city's complex infrastructure.
Some posit that Yaraesa granted visions through these dreams, while others see evidence of Oras' evolutionary influence. Many astriapis, however, believe that the visions granted by the zhufera honey came from several gods.
!! Racial Traits
* ''Ability Adjustments:'' +2 Dex, +2 Wis, –2 Str
* ''Hit Points:'' 4
* ''Size and Type:'' Astriapis are Medium monstrous humanoids.
* ''Astriapi Movement:'' Astriapis have a land speed of 30 feet and an extraordinary fly speed of 30 feet with average maneuverability.
* ''Astriapi Senses:'' Astriapis have [[blindsense]] (scent) with a range of 30 feet and [[darkvision]] with a range of 60 feet.
* ''Honey Production:'' Once per day, an astriapi can spend 10 minutes to produce a vial of magical honey. This honey functions as a //mk 1 [[healing serum]]//. At 5th level (or CR 5), the honey functions as a //mk 2 healing serum//, and at 9th level (or CR 9), it functions as a //mk 3 healing serum//. Regardless of its level, the honey can't be sold, and its magical
* properties expire after 24 hours, when it turns into mundane foodstuff.
* ''Natural Weapons:'' Astriapis have [[natural weapons]] that deal 1d3 P damage.
* ''Scholars of Colveare:'' Astriapis gain a +2 racial bonus to [[Engineering]] and [[Mysticism]] checks.
<div class="statblock">
* ''CR'' 13; ''XP'' 25,600
* N Fine vermin (swarm)
* ''Init'' +8; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +23
* ''Aura'' bioluminescence (60 ft., Will DC 19)
!!! DEFENSE
* ''HP'' 225
* ''EAC'' 27; ''KAC'' 29
* ''Fort'' +17; ''Ref'' +15; ''Will'' +12
* ''Defensive Abilities'' [[swarm defenses]], [[void adaptation]]; ''Immunities'' radiation, [[swarm immunities]]
!!! OFFENSE
* ''Speed'' 30 ft., fly 60 ft. ([[Su]], perfect)
* ''Melee'' [[swarm attack]] (2d8+17 P plus [[attach]])
* ''Space'' 10 ft.; ''Reach'' 0 ft.
* ''Offensive Abilities'' [[distraction]] (DC 19)
!!! STATISTICS
* ''Str'' +4; ''Dex'' +8; ''Con'' +6; ''Int'' —; ''Wis'' +0; ''Cha'' –3
* ''Skills'' [[Acrobatics]] +28 (+36 to fly)
* ''Other'' feeding frenzy, [[mindless]]
!!! ECOLOGY
* ''Environment'' any vacuum (Weydana-5)
* ''Organization'' swarm
!!! SPECIAL ABILITIES
''Bioluminescence ([[Ex]])'' An astro-krill swarm emits brilliant and complex light patterns. Creatures affected by the aura are [[dazed]]; creatures who successfully save are [[dazzled]] for 1d4 rounds and immune to this ability for 1 day.
''Feeding Frenzy ([[Ex]])'' Astro-krill instinctively try to eat any solid object they come in contact with. Any melee weapon that hits an astro-krill swarm and inflicts bludgeoning, piercing, or slashing damage must attempt a DC 19 Fortitude save or be [[broken]], while broken items are instead destroyed. If a creature takes damage from the astro-krill’s swarm attack and is wearing armor, that armor must attempt this save, with the same results.
</div>
Astro-krill are spacefaring crustaceans indigenous to the asteroid shell surrounding Weydana-5. They’ve adapted to the harsh living conditions of the void, and their diet consists entirely of inorganic material. Unfortunately, they’re indiscriminate in this hunger; astro-krill consume asteroids and the space suits of hapless explorers with equal relish.
No longer than two-and-a-half inches and weighing only a fraction of an ounce, an astro-krill’s exoskeleton is segmented and translucent. This translucency, in turn, allows for the creatures’ dazzling bioluminescence to shine through. Though the Xenowardens generally agree that astro-krill are mindless, some have posited that this bioluminescence may be a form of nascent communication.
The question of astro-krill sentience is of grave concern to one corporation: Koji! Can Fisheries. Koji! Can incorporated shortly after Weydana-4 was settled, and they’ve cornered the market on harvesting fresh astro-krill swarms as a food alternative. Their chief product is Biobright, an astro-krill paste high in protein and low in calories. The aftertaste leaves something to be desired, but children love how their tongues are left dyed with vibrant color after every meal. Koji! Can has plans to go public soon, and all this talk of possible sentience among the krill has left potential investors skittish.
Harvesting astro-krill is not for the faint of heart. This time-consuming process involves a spacewalk, luring each swarm into a specialized container using hand-held light emitters that attract the krill and react to the swarm’s bioluminescence. Storage containers are reinforced with impervious force fields, and crews must keep their distance; accidents in which a crew member gets too close and ends up exposed to vacuum are all too common. Once a swarm is contained, it can be loaded onto a spacecraft and taken to Koji! Can processing plants. The current rate for a living or fresh astro-krill swarm is 50,000 credits.
You can sense the movement of all objects influencing you to gain insight into upcoming events. Once per day as a full action, you can try to determine whether a particular action of yours will bring good or bad results for you in the immediate future. This functions as //[[augury]]// with your effective caster level equal to your solarian level. You can spend 1 Resolve Point to use this revelation again on the same day, but you still can't use it more than once per hour.
When you are attuned or fully attuned, you can see 1 hour into the future (instead of half an hour as is normal for //augury//) when you use this revelation.
The shapeshifting astrazoans have lived as humans, lashuntas, verthani and many other races for the past few centuries, but their origins are shrouded in mystery. As even they have no records of their beginnings, it is widely assumed they came into being at some point during the Gap. They have little in the way of their own culture and strive to find their place in the galaxy.
An astrazoan in their native form resembles a seven-limbed, human-sized starfish, with a single visual sensor in the middle of each limb. Their skeleton is cartilaginous and their flesh jellylike, but an astrazoan can spontaneously mold and introduce pigment into their flesh to imitate the appearance of almost any creature of the same size. Astrazoans are capable of forming both male and female reproductive organs and thus are effectively hermaphrodites. Because most astrazoans live in humanoid societies with defined gender roles, it is common for them to develop a fixed gender identity, but just as many are gender-fluid.
There are very few astrazoans in the Pact Worlds (though no one can be certain of the exact number), and the majority of them reside on Absalom Station, Castrovel, Verces, and other areas where they can blend in with the local populace. They do so not for any sinister reason or even from fear, but out of a desire to make those whom they live among more comfortable. They are aware that their natural form might be a bit off putting to humanoids who primarily interact with only other humanoids.
On a hunch, a team of researchers recently compared the DNA of an astrazoan volunteer to samples from an ancient race known as ilee, who vanished from their home on Apostae during the Gap, and found a remarkable number of similarities. The ilee were known for being unique: no two of them looked alike. These researchers theorize that some of the ilee used highly advanced genetic engineering to completely transform themselves in response to an extinctionlevel threat; the astrazoans' innate ability to control their forms is thought to be a side effect of this change, though some believe it was the intended purpose.
!! Racial Traits
* ''Ability Adjustments:'' +2 Dex, +2 Cha, –2 Con
* ''Hit Points:'' 4
* ''Size and Type:'' Astrazoans are Medium aberrations with the shapechanger subtype.
* ''Change Form:'' As a standard action, an astrazoan can physically alter their form to look like any Medium creature, as long as they have seen a similar creature before. They can attempt to either mimic a specific creature or look like a general creature of the chosen type. The astrazoan gains a +10 bonus to [[Disguise]] checks to appear as a creature of the type and subtype of the new form. The DC of the astrazoan's Disguise check is not modified as a result of altering major features or if they disguise themself as an aberration or a humanoid (though the DC is still modified if the astrazoan attempts to disguise themself as a different creature type). The astrazoan can remain in an alternate form indefinitely (or until they take another form).
* ''Compression:'' An astrazoan can move through an area as small as one-quarter their space without squeezing or one-eighth their space when squeezing.
* ''Darkvision:'' Astrazoans can see up to 60 feet in the dark.
* ''Many Forms:'' For effects targeting creatures by type, astrazoans count as both aberrations and humanoids.
* ''Rapid Revival:'' Once per day, when an astrazoan takes a 10-minute rest to regain Stamina Points, they can additionally recover Hit Points as though they had taken a full night's rest.
The //astute// fusion causes a weapon to become etched with glowing circuitry and ringed with faint blue-black flames. Stewards often use //astute// weapons as they hunt down criminals within the Pact Worlds. The DC of [[Bluff]] checks to feint against you and to use the operative's [[trick attack]] ability against you increases by 2 while you wield such a weapon.
<div class="statblock">
* <<levels>>
* ''School'' enchantment (emotion, fear, mind-affecting)
* ''Casting Time'' 1 standard action
* ''Targets'' all creatures within 30 feet
* ''Duration'' see text
* ''Saving Throw'' Will partial
* ''Spell Resistance'' yes
</div>
You release a howl of primal rage, echoing the pain of Dreamers awoken by injury. Creatures in the area that fail their saves are [[shaken]] for 2d4 rounds. Dreamers are immune to this spell.
Barathus can cast this spell as a reaction when reduced to 0 Hit Points. In this case, the spell's DC is increased by 2.
!!! Time-Tested, Dependable Vessels
<div class="statblock">
* ''Manufacturing Centers'' Absalom Station, Akiton, Verces
* ''Specialties'' Reliable, sturdy vessels for a wide range of needs
* ''Famous Models'' [[Bulwark|Modified ATech Bulwark]], [[Immortal|Atech Immortal]], [[Resolute|ATech Resolute]]
</div>
ATech is a wholly owned subsidiary of the megacorporation AbadarCorp, although it was not created by the conglomerate. Pre-Gap records indicate that the company now known as ATech originated on the planet Golarion as a manufacturer of atmospheric vehicles such as jet aircraft and hovercars. The exact details of who or what financed such cutting-edge research is lost to time, but speculators have suggested that it may have taken an entire country devoted to technological advances, a league of individuals with extraordinary knowledge for their time, or even the cult of a lesser god. The exact details of AbadarCorp's acquisition of ATech seem to have been hit particularly hard by the Gap. Rumors range from a simple buyout to a hostile takeover, and a few even dare to suggest corporate assassination—a suggestion quickly withdrawn by those concerned for their own safety. Regardless, this acquisition enabled AbadarCorp to expand its holdings far beyond its previous capacity. AbadarCorp renamed the starship manufacturer ATech and created its own fleet, eventually becoming one of the premier retail manufacturers in the Pact Worlds System.
In the modern age, ATech has been a go-to name for reliable vessels. Company policy insists that an ATech starship should be the best investment a customer can make. ATechs are made with care and precision, ensuring that the safety and security of a customer's goods, crew, and passengers are a top priority. This has earned the company a customer base that includes exploration parties, merchant houses, and even the Stewards. ATech makes no distinctions between these groups and offers its products to any organization in good legal standing.
Perhaps one of ATech's greatest achievements is the sheer volume of repair shops and shipyards it makes available to customers. It is the company's goal to have at least one service center in every settlement where it has customers, so they can repair, refuel, and upgrade parts conveniently. In lucrative locations, ATech has built entire cities dedicated to manufacturing and repair, but even small outposts have a hangar and a few mechanics. In addition to frontier dangers, many of these outposts have recently experienced increased incident reports, leading ATech to suspect sabotage by its competitors.
To meet its high demand for talented labor, ATech routinely offers generous scholarships and fast-track programs to promising engineers across the galaxy, many of whom go on to develop new technologies or work on well-known vessels, adding to ATech's prestige.
''Manufacturer Perk:'' While physical durability is a top priority for ATech, the manufacturer has also identified digital security as a growing concern. On ATech starships, an [[anti-hacking system]] costs 2 BP (rather than 3 BP) to install and upgrade.
[[]]<div class="statblock">
* ''Tier'' 10
* Huge cruiser
* ''Speed'' 8; ''Maneuverability'' average (turn 2); ''Drift'' 1
* ''AC'' 22; ''TL'' 22
* ''HP'' 230; ''DT'' 5; CT ''46''
* ''Shields'' medium 200 (forward 50, port 50, starboard 50, aft 50)
* ''Attack (Forward)'' particle beam cannon (3d4×10)
* ''Attack (Port)'' light plasma cannon (2d12)
* ''Attack (Starboard)'' light plasma cannon (2d12)
* ''Attack (Turret)'' heavy plasma torpedo launcher (5d10)
* ''Power Core'' Nova Ultra (300 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic long-range sensors, crew quarters (good), mk 4 armor, mk 4 defenses, mk 3 duonode computer; ''Expansion Bays'' [[cargo holds]] (3), [[life boats]], [[medical bay]], [[shuttle bay]]
* ''Modifiers'' +3 any two checks per round, +2 [[Computers]]
* ''Complement'' 60
!!! CREW
* ''Captain'' [[Bluff]] +19 (10 ranks), [[Computers]] +21 (10 ranks), [[Diplomacy]] +19 (10 ranks), [[Engineering]] +19 (10 ranks), gunnery +15, [[Intimidate]] +19 (10 ranks)
* ''Engineer (1 officer, 20 crew)'' [[Engineering]] +19 (10 ranks)
* ''Gunners (3 officers, 10 crew each)'' gunnery +15
* ''Pilot (1 officer, 3 crew)'' [[Piloting]] +19 (10 ranks)
* ''Science Officer'' [[Computers]] +21 (10 ranks)
</div>
Severe and pugnacious, the Immortal is the workhorse capital ship of military fleets like those of the Stewards and the Knights of Golarion. Thickly armored and loaded with weapons, this cruiser rarely needs to fire a shot in most conflicts, as its mere appearance in-system can stop a conflict cold and send all but the most militant threats running for the safety of the Drift.
<div class="statblock">
* ''Tier'' 11
* Large heavy freighter
* ''Speed'' 10; ''Maneuverability'' average (turn 2); ''Drift'' 2
* ''AC'' 28; ''TL'' 25
* ''HP'' 160; ''DT'' –; ''CT'' 32
* ''Shields'' medium shields 200 (forward 50, port 50, starboard 50, aft 50)
* ''Attack (Forward)'' gravity gun (6d6; 10 hexes), linked light particle beams (6d6; 10 hexes)
* ''Attack (Port)'' particle beam (8d6; 20 hexes)
* ''Attack (Starboard)'' particle beam (8d6; 20 hexes)
* ''Power Core'' Gateway Light (300 PCU); ''Drift Engine'' Signal Booster
* ''Systems'' advanced long-range sensors, crew quarters (common), mk 2 duonode computer, mk 8 armor, mk 6 defenses; ''Expansion Bays'' [[cargo holds]] (8)
* ''Modifiers'' +2 to any two checks per round, +4 [[Computers]] (sensors only)
* ''Complement'' 13 (minimum 6, maximum 20)
!!! CREW
* ''Captain'' [[Diplomacy]] +25 (11 ranks)
* ''Engineer (1 officer, 3 crew)'' [[Engineering]] +20 (11 ranks)
* ''Gunner (3 officers, 1 crew each)'' gunnery +16 (11th level)
* ''Pilot'' [[Piloting]] +20 (11 ranks)
* ''Science Officer'' [[Computers]] +20 (11 ranks)
</div>
ATech produces this sturdy long-haul freighter for the transport of large amounts of goods across the galaxy. Like many ATech vessels, the Keystone is modular and versatile, with eight expansion bays for a variety of purposes, depending on the needs of the crew. Most crews use at least half the bays as cargo holds and fill the remaining bays with recreational suites to stave off boredom on long journeys through the Drift. Crews who make deliveries to the more dangerous areas of space convert their remaining expansion bays into combat training simulators and armories to better fend off space pirates and other attackers. A vanishingly few Keystones are used as passenger transports, with either large luxury guest rooms for those looking for more privacy or smaller bunks for those seeking a cheaper option. However, no matter how fancy the interiors, these Keystones’ bulky and practical exteriors tended to put off wealthier clients, who instead sought other, more elegant transports. As such, most passenger-focused Keystones have been decommissioned or converted to standard cargo haulers.
At least one ATech Keystone, the Golden Key, transported settlers to New Harmony. When the crew decided to make new lives on the planet, the ship gathered dust in a hangar for months. With the approach of the Order of the Culling Shadow’s armada, that Keystone has been taken out of mothballs. To defend their new home, the crew quickly retrofitted the Golden Key with new weapons, heavier armor, and an expanded power core. It wasn’t a perfect job. Wires hang from the ship’s corridors, and the power core’s expansion required removing some safety systems, but the Golden Key is ready for combat and is one of the best outfitted ships in the New Harmony armada.
<div class="statblock">
* ''Tier'' 8
* Large heavy freighter
* ''Speed'' 8; ''Maneuverability'' average (turn 2); ''Drift'' 1
* ''AC'' 21; ''TL'' 21
* ''HP'' 160; ''DT'' —; ''CT'' 32
* ''Shields'' medium 120 (forward 30, port 30, starboard 30, aft 30)
* ''Attack (Forward)'' heavy laser cannon (4d8; 10 hexes)
* ''Attack (Port)'' light particle beam (3d6; 10 hexes)
* ''Attack (Starboard)'' light particle beam (3d6; 10 hexes)
* ''Attack (Aft)'' flak thrower (3d4; 5 hexes)
* ''Attack (Turret)'' light plasma torpedo launcher (3d8; 20 hexes)
* ''Power Core'' Pulse Orange (250 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic medium-range sensors, crew quarters (common), fortified hull (steel composite), mk 4 armor, mk 4 defenses, mk 2 duonode computer; ''Expansion Bays'' [[cargo holds]] (6), [[escape pods]], [[medical bay]]
* ''Modifiers'' +2 to any two checks per round, +2 [[Computers]] (sensors only)
* ''Complement'' 19 (minimum 6, maximum 20)
!!! CREW
* ''Captain'' [[Bluff]] +16 (8 ranks), [[Diplomacy]] +16 (8 ranks), gunnery +14 (8 level), [[Intimidate]] +16 (8 ranks), [[Piloting]] +16 (8 ranks)
* ''Engineer (1 officer, 6 crew)'' [[Engineering]] +21 (8 ranks)
* ''Gunners (2 officers, 2 crew each)'' gunnery +14 (8th level)
* ''Pilot (1 officer, 3 crew)'' [[Piloting]] +16 (8 ranks)
* ''Science Officer'' [[Computers]] +16 (8 ranks)
</div>
The ATech Resolute is a simple, sturdy ship with a bold personality and a beloved subculture. AbadarCorp first commissioned the Resolute over a century ago to meet its growing need for a deep space freighter that didn't need an escort. An especially troubling surge in piracy had made the conglomerate's colonial ambitions far too costly not to take more direct action. The answer came in the form of this blocky, golden hulk that, no matter how hard it was battered, wouldn't give up the fight. To some customers' chagrin, the same durability makes the factory-installed amenities difficult to upgrade; while the austere interior plastics are undeniably hardy, their most polite critics often describe them as "discouragingly industrial."
After AbadarCorp had built up a substantial fleet of Resolute vessels, the model became available to other companies and individuals, quickly gaining a reputation for its stellar reliability. Notable and varied operations like the Aspis Consortium, the Knights of Golarion, and the Golden League regularly employ the Resolute, not only representing a considerable fraction of the starship's sales but also advertising the design's reliability to independent pilots. Ironically, the Free Captains have also gained respect for the ships after battling them through the years, and have managed to commandeer a few more Resolutes than ATech would prefer. AbadarCorp occasionally posts bounties for these rogue starships, paying a reward based on the condition of a returned ship—less for proper documentation of its destruction.
While the prolific AbadarCorp-owned fleet of Resolutes sports extensive golden filigree, independently owned ships are also richly decorated. In fact, the ships' long lifespan and beloved reliability have endeared them to many, and it's become a tradition for private owners to adorn their ships with baubles and paint them with bright, vibrant, and unique designs. It's not uncommon for a Resolute to outlive its original owner and end up passed from generation to generation of budding entrepreneurs, with each new owner adding their own flair to the vibrant mess. AbadarCorp encourages this tradition by hosting various modding pageants as a low-cost way to protect its own visual brand, ensuring that its gold-hued vessels are distinctive as company property.
<div class="statblock">
* ''Tier'' 7
* Medium explorer
* ''Speed'' 8; ''Maneuverability'' good (turn 1); ''Drift'' 2
* ''AC'' 25; ''TL'' 24
* ''HP'' 65; ''DT'' —; ''CT'' 13
* ''Shields'' medium shields 160 (forward 50, port 35, starboard 35, aft 40)
* ''Attack (Forward)'' light plasma cannon (2d12; 5 hexes)
* ''Attack (Turret)'' light torpedo launcher (2d8; 20 hexes)
* ''Power Core'' Pulse Green (150 PCU); ''Drift Engine'' Signal Booster
* ''Systems'' advanced medium-range sensors, mk 2 trinode computer, mk 8 armor, mk 8 countermeasures; ''Expansion Bays'' [[arcane laboratory]], [[cargo hold]], [[crew quarters]] (good), [[recreation suite]] (trivid den), [[tech workshop]]
* ''Modifiers'' +2 to any 3 checks per round, +4 [[Computers]] (sensors only), +1 [[Piloting]]
* ''Complement'' 6 (minimum 1, maximum 6)
!!! CREW
* ''Captain'' [[Bluff]] +14 (7 ranks), [[Computers]] +12 (7 ranks), [[Diplomacy]] +14 (7 ranks), gunnery +12 (7th level), [[Intimidate]] +14 (7 ranks), [[Piloting]] +15 (7 ranks)
* ''Engineer'' [[Engineering]] +14 (7 ranks)
* ''Gunner'' gunnery +12 (7th level)
* ''Magic Officer'' [[Mysticism]] +14 (7 ranks)
* ''Pilot'' [[Piloting]] +20 (7 ranks)
* ''Science Officer'' [[Computers]] +14 (7 ranks)
</div>
The Vector is a multi-deck starship with reliable weaponry and moderate speed, both in space and in the Drift, and sports a modest cargo hold. While this makes the Vector not specialized for any one purpose—it’s rarely the starship of choice for mercenaries, soldiers, corporations, or freighters, for example—it’s comfortable and adaptable, a starship intended to do everything well and stand up to both the dangers of space and regular wear and tear. Marketed as a starship for explorers, travelers, and anyone who makes their starship a permanent home, the Vector is also favored by independent scientists and surveyors, as well as other small ventures.
As befitting its status as a mobile home, the ATech Vector has a comfortable recreation suite, mess, and crew quarters, and full washroom facilities. The ceilings are high, halls are wide, and rooms are generous in size, all to account for crews of varying sizes. A central lift and ladder grant access to all decks of the Vector, and stairs additionally connect the lower deck and cargo hold.
The ATech Vector is moderately customizable. Each of the six crew quarters can be outfitted with furnishings sized for the crew members. The factory-standard recreation suite is a trivid den, but it can be upgraded to a gym, sparring center, arcade, or interactive entertainment center when purchased direct from ATech. Likewise, the tech workshop can be switched out for a medical bay, science lab, or synthesis bay to better accommodate the interests of the crew.
You can scale vertical surfaces, leap over obstacles, and swim.
<$list filter="[tag<currentTiddler>tag[Tasks]]">
<$macrocall $name="collapse" tiddler={{!!title}}/>
</$list>
<div class="statblock">
* ''CR'' 9; ''XP'' 6,400
* N Large vermin (aquatic)
* ''Init'' +4; ''Senses'' [[darkvision]] 180 ft., [[sense through]] (vision [fog only]) 90 ft.; ''Perception'' +17
!!! DEFENSE
* ''HP'' 145
* ''EAC'' 22; ''KAC'' 24
* ''Fort'' +13; ''Ref'' +11; ''Will'' +8
* ''Defensive Abilities'' [[amphibious]]; ''Immunities'' [[deafened]]; ''Resistances'' sonic 10
!!! OFFENSE
* ''Speed'' 20 ft., fly 30 ft. ([[Ex]], clumsy or average), swim 30 ft.
* ''Melee'' claw +18 (2d10+12 B)
* ''Ranged'' sonic snap +21 (3d6+9 So; critical [[stun|Stun (critical)]] [DC 16])
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' atmospheric enhancement, sonic snap
!!! STATISTICS
* ''Str'' +3; ''Dex'' +4; ''Con'' +6; ''Int'' —; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +22 (+14 to fly in normal atmosphere), [[Athletics]] +17 (+25 to swim)
* ''Other Abilities'' aerial buoyancy, [[amphibious]], [[mindless]], [[water breathing]]
!!! ECOLOGY
* ''Environment'' warm or temperate hills or water
* ''Organization'' solitary, pair, or cacophony (3–7)
!!! SPECIAL ABILITIES
''Aerial Buoyancy ([[Ex]])'' An atlapak can inflate its lightweight body and flap its gills to swim through the air. In normal atmosphere, the atlapak moves at half speed with clumsy maneuverability. In thick atmosphere, the atlapak flies at full speed with average maneuverability. It's unable to fly in environments with thin atmosphere or no atmosphere.
''Atmospheric Enhancement ([[Ex]])'' An atlapak's sonic snap ability becomes increasingly effective the denser its surroundings. In normal and thicker atmospheric conditions, the range increment increases to 100 feet, and the DC to resist the atlapak's critical hit effect increases by 2. In thick atmosphere or underwater, the sonic snap gains the [[sniper]] (250 ft.) weapon property.
''Sonic Snap ([[Ex]])'' By cocking and then snapping shut its specialized claw as a standard action, an atlapak can create a sonic burst as a ranged attack. This attack has a range increment of 80 feet, targets EAC, and has the [[penetrating]] special property, ignoring 9 points of its target's hardness. This ability doesn't function in environments with no atmosphere.
</div>
<<section 'Atlapak Juvenile'>>
Often compared to evolutionarily unrelated mantis shrimp, atlapaks have banded shells that offer considerable mobility. Their eight pairs of legs have evolved for walking and swimming; to perceive their surroundings, they have inquisitive antennae and three compound eyes mounted on movable stalks. These large, amphibious arthropods are also famous for their explosively devastating claws—one pincer designed for grasping and tearing and another capable of opening and snapping shut with incredible speed to generate cavitating sonic blasts. Rather than creating a localized explosion, an atlapak can fan its abdominal plates to focus and direct the sonic energy into a distant burst that can stun or outright kill prey hundreds of feet away. The denser the medium—whether liquid or gas—the more effective the blast. Atlapaks can grow as much as 10 feet long, while juveniles are around 5 feet long.
Atlapaks prefer lurking in sheltered burrows that provide commanding views, such as coral reefs or low hills. From there, the creatures hunt by ambush, waiting for prey to approach within easy striking range before unleashing several sonic bursts and closing in for the kill. Underwater, atlapaks often cohabitate with colonial tube worms like the pileated tsorkos, which gradually accumulate sandy mounds and tunnels. The atlapaks help watch for danger and often leave food scraps, while the worms provide good hiding spots and vantage points.
Older atlapaks more often leave the water to seek terrestrial prey, using their natural buoyancy to hover several hundred feet above the surface while scouting for food. Drifting in this way also helps adults find mates, and although atlapaks most often reproduce in water, their eggs can survive in humid terrestrial environments. Some unlucky jungle explorers have fallen prey to the young arthropods when atlapak eggs adhered to the underside of tree branches hatch and drift into convoys.
Although unintelligent, atlapaks exhibit utterly uncanny ballistics mastery. Their antennae are extremely sensitive to humidity and currents, for which the arthropods adjust their aim. Not only do their questing compound eyes provide exceptional depth perception, but their lenses also help them compensate for the refracting and obscuring qualities of water vapor and other gases, providing them with a clear view of their surroundings even in foggy conditions. Collectively, these features enable atlapaks to pinpoint and strike even fast-moving targets.
Fresh atlapak meat has a clean taste that appeals to many species, though it acquires a repugnant sliminess within hours of the creature's death. As a result, connoisseurs often commission live atlapak shipments to their restaurants, despite the danger the cargo presents for most starships. [[Kalos]] are especially partial to atlapak flesh, hunting the animals to near-extinction on their home world, Kalo-Mahoi.
!! Snap Whips
{{Snap Whip}}
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* N Medium vermin (aquatic)
* ''Init'' +4; ''Senses'' [[darkvision]] 120 ft., [[sense through]] (vision [fog only]) 60 ft.; ''Perception'' +8
!!! DEFENSE
* ''HP'' 40
* ''EAC'' 14; ''KAC'' 16
* ''Fort'' +7; ''Ref'' +5; ''Will'' +2
* ''Immunities'' [[deafened]]; ''Resistances'' sonic 5
!!! OFFENSE
* ''Speed'' 20 ft., swim 30 ft., fly 30 ft. ([[Ex]], clumsy or average)
* ''Melee'' claw +8 (1d6+4 B)
* ''Ranged'' sonic snap +11 (1d4+3 So; critical [[stagger]] [DC 12])
* ''Offensive Abilities'' atmospheric enhancement, sonic snap
!!! STATISTICS
* ''Str'' +1; ''Dex'' +4; ''Con'' +2; ''Int'' —; ''Wis'' +0; ''Cha'' –1
* ''Skills'' [[Acrobatics]] +13 (+5 to fly in normal atmosphere), [[Athletics]] +8 (+16 to swim)
* ''Other Abilities'' aerial buoyancy, [[amphibious]], [[mindless]], [[water breathing]]
!!! ECOLOGY
* ''Environment'' warm or temperate hills or water
* ''Organization'' solitary, pair, or cacophony (3–7)
!!! SPECIAL ABILITIES
''Aerial Buoyancy ([[Ex]])'' See [[atlapak]].
''Atmospheric Enhancement ([[Ex]])'' See [[atlapak]].
''Sonic Snap ([[Ex]])'' See [[atlapak]]; this attack has a range increment of 50 feet, and its [[penetrating]] special property ignores 3 points of its target's hardness.
</div>
An atmosphere is a layer of gases held in place by the pull of a planetoid's gravity. The gravity and temperature of a planetoid impact its ability to retain an atmosphere. Most planets and planetoids support some manner of atmosphere. In addition to hospitable atmospheres, there are various other types of atmosphere that serve as hazards to most life.
!! No Atmosphere
A creature on a planet without an atmosphere (or with an atmosphere so thin that it is effectively airless) is exposed to a [[vacuum]].
!! Normal
A normal atmosphere is one that can support the majority of breathing life-forms. Most such atmospheres are composed of some combination of oxygen, nitrogen, and other nontoxic gases.
!! Thick
A nonacclimated creature operating in a thick atmosphere treats it as somewhat harmful, due to the extra chemical compounds in the air and the increased atmospheric pressure. Every hour, such a creature must succeed at a Fortitude save (DC = 15 + 1 per previous check) or become [[sickened]]. This condition ends when the creature returns to a normal atmosphere. Conversely, the increased weight of the air grants a +4 circumstance bonus to [[Acrobatics]] checks to fly or [[Piloting]] checks to keep an aircraft in flight.
Severely thick atmospheres are far more dangerous. Every minute, a creature in such an atmosphere must succeed at a Fortitude save (DC = 15 + 1 per previous check) or begin to [[suffocate]] as its lungs cease coping with the density of the oxygen inhaled and lose the strength to keep pumping air into its bloodstream.
!! Thin
Thinner atmospheres tend to cause a nonacclimated creature to have difficulty breathing and become extremely tired. A typical thin atmosphere requires such a creature to succeed at a Fortitude save each hour (DC = 15 +1 per previous check) or become [[fatigued]]. The fatigue ends when the creature returns to a normal atmosphere.
Severely thin atmospheres can cause long-term oxygen deprivation to those affected in addition to the effects of a standard thin atmosphere. The first time a creature in a severely thin atmosphere fails its Fortitude save, it must succeed at a DC 25 Fortitude save or take 1 damage to all ability scores. A creature acclimated to high altitude gains a +4 insight bonus to its saving throw to resist this effect.
!! Corrosive
As the name suggests, a corrosive atmosphere eats away at matter. The type and speed of the erosion varies, but the most common use of this term describes atmospheres capable of dissolving most matter. A typical corrosive atmosphere deals anywhere from 1 acid damage per minute up to 10d6 acid damage per round to creatures and objects within. Certain metals and treated materials may be immune to the specific atmosphere of a planet, and often the corrosion can be mitigated with dutiful preparation.
!! Toxic
Toxic atmospheres are composed of poisonous compounds and vary radically in their consistencies. Some toxic atmospheres are capable of sustaining oxygen-breathing life-forms, while others immediately suffocate those within them. Regardless of whether or not they allow creatures to breathe, toxic atmospheres are threats to most living creatures, as they act as an inhaled poison. Though the specific type of poison varies, many toxic atmospheres act as existing poisons but with radically different onset times and save DCs. Low-level toxic atmospheres can have onset times measured in hours or days, while heavily toxic atmospheres have onset times measured in rounds.
[[Hanakans]] have evolved a symbiotic relationship with a bacteria in their lungs, allowing them to survive in the toxic environments of their homeworld. An modification to your lungs based on this symbiosis grants you immunity to inhaled poisons, and you are automatically acclimated to thin and thick atmospheres.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|atmospheric adaptation graft | 6 | 4,500 | lungs |
</div>
As a fungus species, [[hortuses]] can modify the spores they emit to produce harmful toxins or beneficial gases. Using microscopic, spore-producing cells in your lungs (or similar organs), you can do the same. As a move action while in an atmosphere, you can spend 1 Resolve Point to release these spores into the air. When you use this ability, choose a type of saving throw (Fortitude, Reflex, or Will) and whether to enhance or penalize this save. If you choose to enhance, creatures within 20 feet of you gain a +2 enhancement bonus to saving throws of the chosen type for 1d4 rounds; if you choose to penalize, creatures within 20 feet of you take a –1 penalty to saving throws of the chosen type for 1d4 rounds. A creature can attempt a Fortitude saving throw (DC = 10 + half your character level + your Constitution modifier) before the bonus or penalty is applied to ignore this effect. This is an inhaled poison effect.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|atmospheric alteration graft | 5 | 2,750 | lungs |
</div>
<div class="statblock">
* ''CR'' 10; ''XP'' 9,600
* CE Medium outsider (chaotic, evil, native)
* ''Init'' +2; ''Senses'' [[blindsense]] (life) 30 ft., [[darkvision]] 60 ft.; ''Perception'' +19
!!! DEFENSE
* ''HP'' 147
* ''EAC'' 23; ''KAC'' 22
* ''Fort'' +9; ''Ref'' +9; ''Will'' +15
* ''Immunities'' poison, vacuum
!!! OFFENSE
* ''Speed'' 40 ft., fly 40 ft. ([[Su]], average)
* ''Melee'' slam +17 (2d8+15 B)
* ''Ranged'' void bolt +19 (3d4+10 force; critical [[severe wound]] [DC 19])
* ''Spell-Like Abilities'' (CL 10th; melee +18, ranged +19)
** 1/week—//[[interplanetary teleport]]// (self only), //[[plane shift]]//
** 1/day—//[[cosmic eddy]]// (DC 22), //[[enervation]]//
** 3/day—//[[arcing surge]]// (DC 21), //[[bestow curse]]// (DC 21), //[[displacement]]//, //[[synaptic pulse]]// (DC 21)
** At will—//[[mirror image]]//, //[[see invisibility]]//
* ''Offensive Abilities'' words of destruction
!!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' +2; ''Int'' +0; ''Wis'' +3; ''Cha'' +8
* ''Skills'' [[Intimidate]] +24, [[Mysticism]] +24, [[Sense Motive]] +19
* ''Languages'' Abyssal, Common; [[telepathy]] (100 ft.)
* ''Other Abilities'' [[no breath]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or cult (1 plus 13–20 cultists)
!!! SPECIAL ABILITIES
''Words of Destruction ([[Su]])'' Once per day as a swift action, the many mouths of an atrocite can speak words of total devastation. For the next 3 rounds, any chaotic evil worshiper of the Devourer within 60 feet adds the [[wound]] critical hit effect to all its attacks (in addition to any existing critical hit effect); if an attack already has the wound critical hit effect, it gains the [[severe wound]] critical hit effect instead. If the atrocite takes damage at any point during this 3-round period, the effects of its words of destruction end immediately.
</div>
The monstrous atrocites are potent agents of the Devourer. Each atrocite has a unique form roughly similar to that of a member of some sentient species. If the original form has eyes, the atrocite's are instead empty voids. If it has hands, each holds a fanged mouth that speaks of destruction. A gray haze forms above atrocites, constantly crackling with red energy and serving as the source of their void bolts.
Although they are outsiders, atrocites dwell primarily on the Material Plane, searching through space for places ripe for the depredations of a Devourer cult or helping extant cults execute massive acts of destruction beyond their normal capacity. An atrocite remains with a cult only so long as its presence and guidance clearly increases the recruiting power or destructive capacity of the cult, leaving as soon as it can to further spread its message of infinite unmaking.
Cultists sometimes smuggle atrocites into highly populated systems to spread the evourer's dire gospel, but atrocites travel on their own just as often, either teleporting over vast distances through space or using planar travel.
An //Atrocite Sphere// is a dull, dark globe 3 inches in diameter. Each of the several known //Atrocite Spheres// is thought to have spontaneously appeared from the void when an [[atrocite]] (a supernatural agent of the Devourer) emerged into the galaxy. The //Atrocite Sphere// must adjust to your soul by floating 3 inches above your head for 24 hours. If the sphere stops floating above you for more than 1 minute, it must readjust to you. The sphere can float above you while you're [[prone]] or [[unconscious]], but it stops doing so if you die. After it adjusts to you, the sphere exudes a slight pull, like gravity.
While the //Atrocite Sphere// floats above you, you gain [[DR]] 10/— and [[energy resistance]] 10 against all energy types. If you gain a higher value in one of these defenses from another source, that value increases by 2. When it blocks damage, the sphere briefly flashes with crimson light that resembles a black hole's accretion disc.
When you take Hit Point damage from an attack or effect a foe created, as a reaction you can redirect some of the damage dealt to you. When you do so, the sphere flashes with crimson light and pulses with gravity, knocking you [[prone]]. Divide the damage dealt to you in half. If your attacker is within 330 feet of you, it takes this damage as force damage, is knocked [[prone]], and suffers any critical effect the attack inflicted, but it suffers no other effects. The target can attempt a Will saving throw (DC = 20 + your Charisma modifier) to take half damage and avoid any critical effect. You take the remaining damage (though you get to apply your defenses to this damage normally).
After you redirect damage with the //Atrocite Sphere//, you go berserk. This compulsion is a mind-affecting effect, but it works on any creature the sphere has adapted to, even if that creature is normally immune to such effects. While you are berserk, you gain a +1 morale bonus to attack rolls and a +3 morale bonus to damage rolls and Strength checks. You also gain a number of temporary Hit Points equal to 3 times your level or CR, which remain only while you stay berserk. However, you take a –2 penalty to KAC and EAC. You can't cast spells or use any skill or ability that requires concentration or patience. The only reactions you can take are attacks of opportunity. You consider no creature to be your ally, although you don't consider erstwhile allies to be foes.
On each of your turns while you're berserk, you attack the opponent closest to you, moving or charging only if you need to do so to attack. You make a full attack if you can, using abilities or weapon special properties that facilitate making numerous attacks. When you make a full attack, you reduce the penalties for doing so by 1. If multiple opponents are equally close to you, you divide your attacks among them or include as many as you can in a full attack such as automatic fire.
You cease being berserk if you lose consciousness or you're aware of no other enemies. In addition, you can attempt a DC 25 Will saving throw each time you reduce a creature to 0 Hit Points, ending the berserking episode if you succeed. When the episode ends, you are [[fatigued]] for as long as you were berserk.
If you fail to reduce a significant enemy to 0 Hit Points while you're berserk, the //Atrocite Sphere// provides none of its benefits to you for 24 hours.
An //Atrocite Sphere// can be destroyed only by being tossed into a star, gas giant, black hole, or some equally massive gravitational phenomenon. Cultists of the Devourer say this annihilation is useless, since the spheres will continue to be born until reality itself dies.
The creature can attempt a special attack against KAC as a standard action. If it succeeds, it deals no damage, but the creature adheres to its target. Once attached, the creature gains a +4 bonus to its AC (from cover) and a +2 circumstance bonus to melee attacks, but it can attack only the creature to which it is attached. An attached creature can't move on its own (though it moves with its target), take actions that require two hands, or make attacks of opportunity. An attached creature can be removed with a successful Strength check (DC = 10 + 1-1/2 × the creature's CR) made as a move action, or it can remove itself from its target as a move action.
//Format:// ''Melee'' attach +6.
Making a single attack is a standard action.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
An attack of opportunity is a special melee attack you can make against a target you [[threaten]] (usually an adjacent opponent), even if it is not your turn. You can use your reaction to make an attack of opportunity against an opponent in any of these three cases.
* When you threaten a space and the opponent moves or is moved out of that space in any way other than a [[guarded step]] or [[withdraw]] action, you can use your reaction to make a melee attack against the opponent.
* When the opponent in a space you threaten makes a ranged attack, you can use your reaction to make a melee attack against the opponent.
* When the opponent in a space you threaten casts a spell or uses a spell-like ability, you can use your reaction to make a melee attack against the opponent. However, some spells or spell-like abilities state in their descriptions that they don't provoke attacks of opportunity, so be sure to confirm that the enemy has provoked your reaction before you take it.
Attacks of opportunity are always resolved before the action that triggers them. You don't take a penalty to the attack roll when making an attack of opportunity in the same round you took a full attack, but you do take any other attack penalties that would normally apply to your attacks. Making an attack of opportunity does not affect your ability to make attacks normally when it is your turn.
<div class="statblock">
* ''Level'' 12; ''Price'' 130,000
* Gargantuan water vehicle (20 ft. wide, 70 ft. long, 20 ft. high)
* ''Speed'' 20 ft., full 450 ft., 50 mph (swim)
* ''EAC'' 26; ''KAC'' 28; ''Cover'' total cover (enclosed)
* ''HP'' 210 (105); ''Hardness'' 14
* ''Attack (Collision)'' 13d10 B (DC 15)
* ''Attack'' SAM launcher (2d6×10 B & F)
* ''Attack'' [[underwater]] [[IMDS missile launcher]] (tactical missile; [[explode]] [30 ft.] 6d8 B & P)
* ''Modifiers'' –4 [[Piloting]], –4 attack (–6 at full speed)
* ''Systems'' autopilot ([[Piloting]] +22), enhanced sensors ([[blindsight]] [sound] 1 mile), expansion bays (4), planetary comm unit
* ''Complement'' 11; ''Passengers'' 8
!!! SPECIAL ABILITIES
''Enclosed ([[Ex]])'' In addition to having total cover, the pilot and passengers in an enclosed vehicle can't use their personal weapons to attack creatures and objects outside the vehicle, though they can use the vehicle's weapons (if any).
''SAM Launcher ([[Ex]])'' This heavy weapon launches a guided missile that has a range increment of 2,000 feet. The weapon can target only airborne vehicles or starships. A missile sub can only use this weapon when at depths of 100 feet or less. On a successful attack, the pilot of the defending vehicle can attempt a [[Piloting]] check (DC = the attack roll's result) to halve the damage. A missile sub has a capacity of eight missiles.
</div>
The forward section of this submarine holds two rows of missile bays designed to intercept aircraft.
An attack roll represents your attempt to hit your opponent in melee or from range on your turn in a round. When you make an attack roll, you roll a d20 and add your attack bonus. Various other bonuses can apply from class features, feats, and so on. If your result equals or exceeds the target's Armor Class, you hit and deal damage.
!! Ranged Attacks
When making a ranged attack, you use a ranged weapon to shoot at an opponent from a distance. If you're attacking with a thrown weapon, your ranged attack bonus equals your base attack bonus + your Strength modifier. Otherwise, your attack bonus for a ranged attack equals your base attack bonus + your Dexterity modifier.
When you make a ranged attack, you might also take a penalty for shooting or throwing your weapon beyond the distance listed as its optimal range.
!! Melee Attacks
When making a melee attack, you use a melee weapon to strike an opponent in hand-to-hand combat. Your attack bonus for a melee attack is equal to your base attack bonus + your Strength modifier.
!! Automatic Misses and Hits
A natural 1 (the d20 comes up 1) on an attack roll is always a miss. A natural 20 (the d20 comes up 20) is always a hit. A natural 20 is also a possible [[critical hit]], which could deal more damage.
Whenever one starship fires a weapon at another starship, that action is resolved with a gunnery check. Attacks are made during the gunnery phase of combat, in the order determined during the helm phase, but the damage and critical damage effects are applied after all of the attacks have been made (meaning every starship gets to attack, even if it would be destroyed or crippled by an attack that happened during the same gunnery phase). With only very rare exceptions, each of a starship's weapons can be fired only once per round. You make an attack using the following procedure.
!! Range And Arc
First, determine the range between the two starships (counted in hexes) and the arc of attack. For every range increment beyond the first, the gunnery check takes a cumulative –2 penalty. The attacking starship can fire a weapon against only ships in the same arc as that weapon. If the targeted starship is in a hex that lies in two arcs (the shaded hexes in the diagram), the gunner decides which arc's weapons target it; it can't be targeted by weapons in two arcs.
!! Gunnery Check
Attempt a gunnery check for each weapon fired against a target (except for [[linked weapons]], which are resolved using one action and a single gunnery check).
@@.equation
''Gunnery Check = 1d20 + the gunner's base attack bonus or the gunner's ranks in the Piloting skill + the gunner's Dexterity modifier + bonuses from computer systems + bonuses from the captain and science officers + range penalty''
@@
The gunnery check bonus for an NPC starship of tier 9 or lower is equal to the starship's tier plus the highest ability score modifier for an NPC of a CR equivalent to the starship's tier (using the [[array|Step 1: Array]] for generating monsters and NPCs). For an NPC starship of tier 10 or higher, use the same calculation but substitute the second-highest ability score modifier instead.
!! Determining The Outcome
Compare the result of the gunnery check to the target's Armor Class (AC) or Target Lock (TL), depending on the weapon used. If you attack with a direct-fire weapon and the result of the gunnery check equals or exceeds the target's AC, you hit the target and damage is determined as normal (see [[Damage]] below). A target's AC is determined using the following formula.
@@.equation
''AC = 10 + the pilot's ranks in the Piloting skill + the ship's armor bonus + modifier based on the ship's size + bonuses and penalties from successful or failed stunts and actions''
@@
If the attack is made with a tracking weapon such as a missile launcher and the result of the gunnery check equals or exceeds the target's TL, the tracking weapon's projectile moves its speed toward the target, making turns during this movement as needed (a projectile from a tracking weapon has perfect maneuverability). If it intercepts the target before it reaches the end of its movement, it explodes and deals damage as normal (see [[Damage]] below). If not, attempt a new gunnery check at the start of the next gunnery phase to determine whether the projectile continues to move toward the target; you don't receive any bonuses from computer systems or actions by your fellow crew members from previous rounds or the current round, but you can take penalties, such as from an enemy science officer's [[improve countermeasures]] action. If the result of a gunnery check for a tracking weapon is ever less than the target's TL, the weapon's projectile is destroyed and removed from play. A target's TL is determined using the following formula.
@@.equation
''TL = 10 + the pilot's ranks in the Piloting skill + the ship's bonus from defensive countermeasures + modifier based on the ship's size + bonuses and penalties from successful or failed stunts and actions''
@@
Anyone attacking while on a vehicle takes that vehicle's penalty to attack rolls, as listed in the Modifiers entry of the vehicle's statistics. It's especially difficult to attack from a vehicle that's moving at high speed, so a vehicle might have a higher modifier on attacks (shown in parentheses) when traveling at full speed. The penalty for moving at full speed applies if the vehicle moved at full speed during the last round. The attack penalty doesn't apply when the vehicle is stopped.
!! Firing Vehicle Weapons
Firing a weapon mounted on a vehicle works like firing a normal ranged weapon, but you must activate the vehicle's weapons instead of ones you hold. The penalties to attack rolls in the vehicle's Modifiers entry also apply to attacks made with a vehicle's weapons.
Some vehicles have weapons bound to their steering devices or weapons that are operated from the same control panel. These can be fired when you are piloting, though you normally can't fire the vehicle's weapons on the same turn that you race (or on the same turn that you take another full action) because you don't have enough available actions. Weapons mounted in other manners typically need to be fired by creatures on the vehicle that are dedicated gunners.
!! Drive-By Attacks
Because many vehicles have full speeds that might let them move across an entire battle map, the GM may need to make a judgment call when vehicles leave the map and want to return. The GM determines how long returning takes, but it normally takes at least 1 round to double back, since it takes a move action to drive and change heading.
In theory, creatures could pile on a vehicle, ready actions to shoot enemies as soon as they're within 30 feet, race the vehicle across the map, and fire in passing. Such a maneuver might seem like a sure thing, but it comes with a few problems. First, the attackers take a big penalty to all their attacks, but enemies who ready actions to fire back don't take those penalties. Second, enemies have time to prepare while the vehicle is off the map. They might take cover, set up obstacles to prevent the vehicle from racing through, or just leave. The GM might also rule that the attackers can't keep a good watch on what's happening while they're off the map or that the vehicle breaks down after the stress of using such a tactic.
This tightly written guidebook provides an overview of the cultural practices of most settlements and species common to the Pact Worlds, including taboos, preferred greeting styles, and acceptable topics of casual conversation. Referencing this guidebook provides a +4 circumstance bonus to [[Diplomacy]] checks to [[gather Information]] in the Pact Worlds.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|Attentive Guidebook, Pact Worlds | 1 | 200 | L |
</div>
You have a soft touch and naturally conceal signs of your tampering. Do not increase the DC of [[Engineering]] checks to hide your attempts to [[disable a device|Disable Device]].
You can direct energy from attacks near you into your shield. If you take a move action to align a shield against a specific attacker, you can also grant an adjacent willing or unconscious ally a +1 shield bonus to AC until the beginning of your next turn. This bonus ends if the ally ceases to be adjacent to you.
Your weapon exerts a pull that makes objects cling to it and can even stymie opponents with strands of force. As a move action, you can grant a weapon you wield, including your solar weapon, the disarm weapon special property. This benefit lasts for 1 round or until you leave graviton mode.
When you are attuned or fully attuned, if you score a critical hit with the weapon, your target must succeed at a Reflex save or be [[entangled]] for 1 round. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the entangling effect.
This module employs a combination of magnetic fields and magical energies that cause melee weapons that strike you to get stuck. It must be installed in a suit of armor for 24 lhours before it functions, and when the upgrade is removed from the armor, no other upgrade can use its vacated slot for a 24-hour cool-down period. When an enemy hits you with a melee weapon, as a reaction you can activate this upgrade, which grants you a +4 circumstance bonus to disarm combat maneuvers to disarm the enemy of that weapon before the beginning of the enemy's next turn. An //attractor field's// charges replenish each day.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk | Capacity | Usage |h
|//attractor field// | 11 | 24,000 | 1 | any | L | 5 | 1 |
</div>
If you have at least 12 ranks in [[Piloting]], you can spend 1 Resolve Point and attempt a Piloting check (DC = 20 + 1-1/2 × your starship's tier) to pull off complex maneuvers. You can move your starship up to its speed, treating its distance between turns as if it were 2 lower (minimum 0). You can also fly through hexes occupied by enemy vessels without provoking free attacks. At the end of your starship's movement, you can rotate your starship to face in any direction. If you fail the check, you instead move as if you had taken the [[fly|Fly (pilot action)]] action (but still lose the Resolve Point).
''Critical:'' Your incredible maneuvering leaves enemy gunners confounded. You gain a +4 circumstance bonus to your ship's AC and TL until the start of the next round.
You can take an unexpected or socially unacceptable action with such total confidence and lack of doubt that the target can't immediately react to it. You can make an [[Intimidate]] check to [[demoralize]] a foe, but rather than cause them to be [[shaken]] on a successful check, you cause them to be [[dazed]] for 1 round, and [[staggered]] for 1 additional round for every 5 by which your result exceeds the DC. Once you have used this ability against a specific target, you cannot target them with it again for 24 hours.
<div class="statblock">
* ''CR'' 5; XP 1,600
* N Medium animal
* ''Init'' +5; ''Senses'' [[low-light vision]]; ''Perception'' +16
!!! DEFENSE
* ''HP'' 70
* ''EAC'' 17; ''KAC'' 19
* ''Fort'' +7; ''Ref'' +9; ''Will'' +4
!!! OFFENSE
* ''Speed'' 20 ft., fly 50 ft. ([[Ex]], perfect), swim 10 ft.
* ''Melee'' beak +11 (1d6+8 P) or talon +9 (1d8+8 S; critical 1d4 [[bleed]])
* ''Ranged'' enzyme jet +14 (1d10+5 A plus embalming enzymes)
* ''Offensive Abilities'' impale
!!! STATISTICS
* ''Str'' +3; ''Dex'' +5; ''Con'' +2; ''Int'' –4; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +16 (+24 to fly), [[Athletics]] +11 (+19 to swim)
!!! ECOLOGY
* ''Environment'' any land or sky
* ''Organization'' solitary, pair, quiver (3–10), flight (11–30)
!!! SPECIAL ABILITIES
''Enzyme Jet ([[Ex]])'' As a ranged attack, an augerwing can open its beak pores to spray high-pressure streams of ink-like enzymes with a maximum range of 30 feet and no range increment. This attack has the [[unwieldy]] weapon special property and can be used only every 1d4+1 rounds.
''Impale ([[Ex]])'' An augerwing can perform a spiraling dive to drive its beak into prey. When the augerwing performs a charge and deals damage, if the result of the attack rolls meets or exceeds the target's KAC + 4, the augerwing's beak pierces the target's body; if the target is Medium or smaller, it is also [[grappled]]. The augerwing can keep its beak embedded in the target if it succeeds at further grapple combat maneuvers as normal; it receives a +4 racial bonus to these attacks. A creature can pull out the augerwing's beak (and remove the grappled condition) with a successful [[Acrobatics]] check to [[escape]] or [[grapple|Grapple (combat maneuver)]] combat maneuver as normal for the condition. A creature impaled in this way is exposed to embalming enzymes (see above) at the start of its turn.
!!! Embalming Enzymes
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 13
* ''Track'' [[Dexterity|Dexterity Poison Track]] (special)
* ''Frequency'' 1/minute for 10 minutes
* ''Effect'' progression track is //Healthy—Sluggish—Stiffened— Staggered—Immobile//
* ''Cure'' 2 consecutive saves
</div>
An augerwing is a tall, lean bird with muted brown, gray, and white plumage and eight spindly legs. Its long, sinuous, rasp-covered beak splits into multiple sections, each of which sports numerous pores. Colored bright yellow or red, each augerwing's beak displays a pattern of spots unique to that individual. An augerwing has two sets of wings, keeping its secondary wingspan close to its body when not in use. By switching between wing pairs while flying, an augerwing moves through the air in a hypnotic, twisting spiral pattern that has endeared Pharasmin cultures to this strange avian.
When hunting, an augerwing approaches its prey in a rapid, spinning dive. Strong muscular and skeletal structures help the bird muster the power to drill into their target's flesh. It then continues to twist and stab, injecting fixative enzymes into its prey to limit mobility.
Groups of augerwings use large animal carcasses as nests and lay their tiny eggs inside the corpse's bones; after the eggs have hatched, these hollowed-out bones resemble flutes and can fetch a high price. The birds have spread throughout Near Space and have mostly resisted domestication efforts.
As a move action, you can expend an unused spell slot to magically reconfigure or enhance a vehicle you touch. All the vehicle's movement speeds increase by 10 feet, the vehicle gains a +1 enhancement bonus to EAC and KAC, and the vehicle deals an additional 1d4 damage with collision attacks. If you're piloting this vehicle, its [[Piloting]] modifier increases by 2. These effects last for a number of rounds equal to twice the expended spell's level.
Your body holds extraordinary potential for augmentation.
''Basic:'' You gain one free augmentation of the type associated with your [[niche]], with a level equal to or lower than your level – 2. Each time you gain a level, you can replace this augmentation using the same restrictions. The discount from your [[augmented form]] class feature increases to 20%.
''Advanced (13th Level):'' The discount from your augmented form class feature increases to 30%. In addition, you can install one additional augmentation into one of your systems that already has an augmentation, so long as at least one of those augmentations is of a type associated with your niche. You can have no more than two augmentations in that system, even if you have another ability that grants you a similar benefit.
''Ultimate (19th Level):'' The discount from your augmented form class feature increases to 40%. Your advanced focus ability now lets you install an additional augmentation in two different systems that already have augmentations, though this still doesn’t let you have more than two augmentations in a system.
<<list-links "[tag[Augmentation Manufacturers]sort[title]]" class:index>>
<$list filter="[list[$:/StoryList]is[current]]">
Once installed, an augmentation become a part of your body and generally can't be affected by abilities that destroy or disable objects or target technological items or creatures. As far as attacks and abilities are concerned, a cybernetic or vat-grown arm is no more (or less) vulnerable than your original biological limb.
<<list-links "[list[Augmentations]]" class:index>>
!! System
All augmentations have a system entry indicating the part of the body into which it must be installed. You can't have more than one augmentation on the same part of your body.
In some cases, such as with augmentations installed in limbs, you can install an augmentation into a single general type of body part, such as any single one of your feet or hands. In these cases, the augmentation lists the acceptable body parts into which the augmentation can be installed. You can install a single augmentation on each limb of which you have multiples. For example, if you're a kasatha, you could install a separate augmentation on each of your four hands, as long as each of those augmentations requires only a single hand.
If an augmentation requires multiple limbs for installation— such as [[climbing suckers]], which require all feet, or a speed suspension, which requires all legs—the augmentation's systems entry indicates that requirement. The augmentation's description will also indicate whether a limb-based upgrade requires the replacement of a limb or the augmentation of an existing limb. In the case of augmentations that specifically replace a lost limb, such as a [[polyhand]] or a [[prosthetic limb]], you cannot attach such an augmentation to an existing limb, due to the way these upgrades are manufactured.
!!! Common Systems
Although exceptions do exist, most augmentations require installation into one of the following body systems: arm (or all arms), brain, ears, eyes, foot (or all feet), hand (or all hands), heart, leg (or all legs), lungs, spinal column, skin, and throat.
!! Implantation
Getting an augmentation installed requires the services of a professional cybernetic surgeon or someone with ranks in [[Medicine]] equal to the level of the augmentation. A session with a cybernetic surgeon usually takes 1 hour per level of the augmentation. The price of such implantation procedures is included in the prices listed for each augmentation.
!! Removing Augmentations
You might want to have an augmentation removed, usually because you want to install a different one in the same system of your body. This removal usually occurs during surgery to install new cybernetics. Biotech usually kills off the old augmentation while it's integrating with your body, allowing you to purge the dead biotech naturally. Because augmentations are coded to your body, it's not possible to resell an old augmentation, nor can you reimplant one into a different person. The price of a new augmentation includes the price and time to remove the old augmentation.
!! Activation
Most augmentations work continuously. Those requiring some degree of control are plugged into your nervous system, and you can turn them on or off as a standard action unless otherwise noted. For example, you could activate or deactivate cybernetics in your eyes to observe different visual phenomena.
</$list>
<$list filter="[<currentTiddler>is[missing]]">
<<tabs "[contains:tab[Augmentations]sortby{Augmentations!!list}]" "Cybernetics" "$:/state/tabIndex" "Index Template">>
</$list>
Although first a caste on Verces, the Augmented have since become a cultural movement of seeking perfection through artificial upgrades—most often cybernetics. The Augmented push the boundaries of cybernetic integration, often appearing as much machine as organic.
The Augmented grants alternate class features at 2nd, 4th, 6th, and 9th levels.
!! Favored Augmentation (2nd)
Select one system of the body for which you can acquire augmentations. When you purchase and install an augmentation with an item level no greater than your character level into that system, you reduce the augmentation's price by 50%.
!! Nested Augmentations (4th)
Whether it's because your body is especially receptive to modification or you're able to adjust your modifications to fit alongside one another, you can use more augmentations at once than other creatures can. You can install one additional augmentation into one system that already has an augmentation. You can have no more than two augmentations in that system, even if you have another ability that grants you a similar benefit.
!! Sustained by Science (6th)
Your technological components from augmentations grant you extraordinary resilience. Whenever you spend one or more Resolve Points, you gain an equal number of charges as though your body were a battery with a maximum capacity equal to the number of augmentations you have. You can use these charges to power any device that you own, and any unused charges disappear at a rate of 1 charge per 10 minutes. This excess energy can be used only to directly power an object, and not to recharge a battery or item.
When calculating how many Resolve Points you must spend to stabilize, subtract half your number of augmentations from your maximum Resolve Points. When you spend any Resolve Points to stabilize, you can also attempt a saving throw against one bleeding or burning condition affecting you against the effect's original DC (or if there was no save, a Fortitude save equal to 10 + the source's CR). If you succeed at the save, the condition ends.
!! Overclocked Systems (9th)
The fusion between your natural form and your augmentations surpasses either's intended limits. As a swift action, you can spend 1 Resolve Point to choose one [[personal upgrade]] you have and gain a temporary benefit based on the ability score it augments. The benefit increases based on the model type, treating mk 1 as 1, mk 2 as 2, and mk 3 as 3 for the purpose of calculating the effect. At 13th level you can gain the associated benefits for two of your personal upgrades, and at 17th level you can gain the associated benefits for up to three of your personal upgrades. These benefits last for a number of rounds equal to your character level.
* ''Strength:'' You gain a circumstance bonus equal to your Strength upgrade's model to all Strength- and Dexterity-based skill checks and ability checks. Reduce your armor check penalty by an amount equal to your model type (minimum 0).
* ''Dexterity:'' Each of your modes of movement increases by an amount equal to 10 ft. × your Dexterity upgrade's model, to a maximum of twice your normal speed for each.
* ''Constitution:'' At the end of your turn you regain Stamina Points equal to 3 × your Constitution upgrade's model.
* ''Intelligence:'' You gain a circumstance bonus equal to your Intelligence upgrade's model to all Intelligence-based skill checks and ability checks. Your critical hits deal additional damage equal to 4 × your model type.
* ''Wisdom:'' You gain a circumstance bonus equal to your Wisdom upgrade's model to all Wisdom-based skill checks and ability checks as well as to initiative checks.
* ''Charisma:'' You gain a circumstance bonus equal to your Charisma upgrade's model to all Charisma-based skill checks and ability checks. As a reaction, you can allow any ally that can see or hear you within 30 feet to reroll one attack roll, saving throw, or skill check. Using this reaction immediately ends all of your overclocked systems benefits.
Your body eagerly accepts new augmentations, even creating some of the components out of your own flesh. You gain one free augmentation of the type associated with your niche, with a level equal to or lower than your level. Each time you gain a level, you can replace this augmentation using the same restrictions.
In addition, you reduce the cost of augmentations associated with your niche by 10%. This applies only to augmentations whose item levels are no greater than your evolutionist level.
If you receive a discount on an augmentation from another source (not counting the augmentation [[evolutionary focus]]) you instead increase that discount by 5%.
Note that regardless of your niche, [[species grafts]] qualify for the benefits of this ability, as long as they’re of the type associated with your niche.
Your augmentations act as batteries for your own transformative powers. Once per day as a move action, you can draw energy and inspiration from your augmentations to gain Mutation Points. The maximum number of MP you gain in this way equals either one-fourth your evolutionist level or the sum of your augmentations’ item levels divided by 10, whichever is lower. Only augmentations of the types associated with your niche contribute to this augmentation item level sum.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time '' 1 minute
* ''Range'' personal
* ''Duration'' instantaneous
</div>
Casting //augury// can tell you whether a particular action will bring good or bad results for you in the immediate future. Casting this spell takes intense personal focus and requires you to spend 1 Resolve Point.
The chance for successfully receiving a meaningful reply is 75%; this roll is made secretly by the GM. A question may be so straightforward that a successful result is automatic, or it may be so vague as to have no chance of success. If the augury succeeds, you get one of four
results.
* //Weal// (if the action will probably bring good results).
* //Woe// (for bad results).
* //Weal and woe// (for both).
* //Nothing// (for actions that have neither especially good nor especially bad results).
If the augury isn't successful, you get the "nothing" result. A spellcaster who gets the "nothing" result has no way to tell whether it was the consequence of a failed or successful augury.
The augury can see only about 30 minutes into the future, so anything that might happen beyond that time frame does not affect the result. Thus, the result might not take into account the long-term consequences of a contemplated action. Multiple castings of augury by the same creature about the same topic use the same die result as the first casting.
Unless an aura says otherwise, a target is affected by an aura automatically with no action required on the creature's part whenever the target is within the aura's listed range (either when the target enters the aura on its turn or when it begins its turn in the aura, whichever comes first). If the aura deals damage, it damages a target only the first time the target is in the aura each round, regardless of how many times within the round the target enters and leaves the aura. A creature can suppress its aura for 1 round as a move action unless noted otherwise.
//Format:// ''Aura'' radiation (30 ft., Fortitude DC 17); if additional information is needed, the aura also has an entry in Special Abilities.
While wearing these goggles, you gain a +4 circumstance bonus to saving throws against sense-dependent effects that target vision (such as [[gaze]] abilities or a bryrvath's impossible aura). In addition, once per day, you can cast //[[arcane sight]]// as a spell-like ability (CL 8th).
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//aura goggles// | 8 | 9,000 | L |
</div>
As a standard action, you can scan the auras of creatures and objects within a 30-foot cone to learn about them. You must have line of sight to a target to scan it. By scanning the auras of creatures and items, you gain a +2 insight bonus to checks to identify them. If you successfully identify a creature or an item after scanning it, you learn one more useful piece of information than normal. If you scan an injured creature or damaged item, you gain a +2 insight bonus to your next [[Medicine]] or [[Engineering]] check to treat or repair it, provided you initiate the process that leads to the check within 10 minutes.
When an aurora weapon strikes a target, the creature glows with a soft luminescence for 1 minute. This negates [[invisibility]] effects and makes it impossible for the target to gain concealment from or hide in areas of shadow or darkness.
The aurora cannon is a variant plasma cannon with holding chambers that overcharge the plasma generated within the weapon. The walls of these chambers are typically translucent, allowing a veiled view of the shifting plasma. The aurora cannon's modified plasma blasts cause creatures it hits to glow with a surprisingly beautiful aura, making it difficult for them to hide. Aurora cannons are categorized according to the primary composition of these auroras, from the hydrogen aurora cannon to the electron and proton models.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|aurora cannon, hyrdrogen | 5 | 3,100 | 2d4 E & F | 100 ft. | [[blind]] | 40 charges | 2 | 2 |[[aurora]] |
|aurora cannon, electron | 10 | 18,200 | 6d4 E & F | 120 ft. | [[blind]] | 40 charges | 2 | 2 |[[aurora]] |
|aurora cannon, proton | 17 | 258,000 | 15d4 E & F | 120 ft. | [[blind]] | 40 charges | 2 | 2 |[[aurora]] |
</div>
<div class="statblock">
* ''Tier'' 3
* Medium explorer
* ''Speed'' 8; ''Maneuverability'' good (turn 1)
* ''AC'' 17; ''TL'' 17
* ''HP'' 55; ''DT'' —; ''CT'' 11
* ''Shields'' basic 40 (forward 10, port 10, starboard 10, aft 10)
* ''Attack (Forward)'' high explosive missile launcher (4d8)
* ''Attack (Port)'' coilgun (4d4)
* ''Attack (Starboard)'' coilgun (4d4)
* ''Attack (Turret)'' light particle beam (3d6)
* ''Power Core'' Pulse Green (150 PCU); ''Drift Engine'' none
* ''Systems'' advanced mid-range sensors, crew quarters (good), mk 1 mononode computer, mk 4 armor, mk 4 defenses; ''Expansion Bays'' [[brig]], [[cargo holds]] (2), [[passenger seating]]
* ''Modifiers'' +1 on any one check per round, +4 [[Computers]] (sensors only), +1 [[Piloting]]
* ''Complement'' 5 (minimum 1, maximum 6)
!!! CREW
* ''Captain'' [[Diplomacy]] +13 (3 ranks), gunnery +6, [[Piloting]] +8 (3 ranks)
* ''Engineer'' [[Engineering]] +13 (3 ranks), gunnery +6
* ''Gunner'' gunnery +7
* ''Pilot'' gunnery +7, [[Piloting]] +14 (3 ranks)
* ''Science Officer'' [[Computers]] +12 (3 ranks), [[Engineering]] +8 (3 ranks)
</div>
The Sarenite peacekeeping force known as the Dawn Patrol keeps a close eye on the only tunnel that leads to the Burning Archipelago from its spaceborne headquarters of Sunrise Station. The majority of the Dawn Patrol consists of armed troopers based in the Archipelago itself, but the church of Sarenrae also provides starships to patrol space in the immediate vicinity of the tunnel. Manufactured by Aurora Projects, one of the church's technological concerns operating out of Lucent Shipyards, Yellow Dwarf vessels are the most common ships in the Dawn Patrol's navy. A Yellow Dwarf boasts decent weaponry to deter any ne'er-do-wells who might try to illegally breach the tunnel, as well as a brig to hold captured miscreants. A Yellow Dwarf can also ferry cargo and passengers, such as church dignitaries, to and from the Archipelago when necessary. Most Yellow Dwarfs lack a Drift engine, but each crew's tour of duty can last for several months, and so the ship has comfortable crew quarters and a galley. Some captains convert their Yellow Dwarf's passenger seating into a recreation area to help keep the crew entertained and fit during long assignments.
Awarded to squadron leaders, captains, and those who excel at commanding others, this brass medallion allows you to increase the bonus provided by a successful aid another action to +4 once per day; this takes no additional action.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//authority medallion// | 1 | 225 | L |
</div>
This device monitors your blood pressure, heart rate, respiration, and temperature. When one or more of these vital signs falls below an acceptable level, the device administers aid, injecting you with stimulants and resuscitating you with a defibrillator as necessary. If you have 0 Hit Points and are dying, at the end of your next turn the auto-CPR unit attempts to stabilize you, attempting a [[Medicine]] check to administer first aid to stabilize you with a +5 total skill bonus. If you have a [[computer interface]], you can have the computer control activate the auto-CPR unit to attempt first aid when you have the [[bleeding]] condition, and you add the tier of the computer in the interface to the auto-CPR unit's total Medicine bonus.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|auto-CPR unit | 2 | 850 | 1 | any | L |
</div>
Auto-fire is a miniaturized computer and tracking system that syncs with a single weapon mount on the vehicle, which must be fitted with a ranged weapon. Syncing auto-fire onto a weapon mount requires 1 minute of work and careful calibrations. Once auto-fire is synced, you can lock onto an enemy within the synced weapon’s range as a standard action. Once per round until deactivated, at the beginning of the vehicle pilot’s turn, the weapon in the synced weapon mount automatically shoots at the target. Auto-fire has an attack modifier equal to the vehicle’s item level. If the synced weapon is ever out of ammunition or charges, or auto-fire is ever out of charges, auto-fire immediately deactivates. You must have a weapon mount with a ranged weapon installed for auto-fire to function.
<div class= "table-wrapper">
|Modification | Level | Price | Capacity | Usage |h
|auto-fire | 10 | 18,250 | 20 charges | 5/day |
</div>
An auto-flight module leverages a squadron's [[data link]] to keep multiple starships in formation with minimal effort, with subordinate starships mimicking the maneuvers of a primary pilot. Each participating squadron starship must have its own auto-flight module and a data link system. Whenever two or more squadron starships with auto-flight modules begin a round adjacent to at least one other participating starship and facing the same direction, they are considered to be in formation, and one of the starships is designated the primary starship (the others are referred to as secondary starships).
When starships would attempt [[Piloting]] checks to determine the order in which starships move during the helm phase, starships in formation can choose to have the primary pilot attempt a Piloting check with a cumulative –2 penalty for each participating secondary starship; each starship in the formation uses that result to determine the order in which they move. When the primary pilot takes an action to move (such as [[fly|Fly (pilot action)]] or [[stunt]]), they can temporarily reduce their maneuverability and speed to match the worst maneuverability and speed of ships in the formation. If they do so, each secondary starship can use the [[glide]] minor crew action to mirror the primary starship's exact movement and turns, including any special movement as a result of the primary starship's successful stunts. However, secondary starships don't also perform any stunts that apply to a specific enemy starship, such as [[flyby]]. Secondary starships gain only half the normal bonus to AC and TL when mirroring the [[evade]] stunt. An auto-flight module's cost depends on the starship's size. For the purpose of this calculation, Tiny = 1, Small = 2, etc.
<div class= "table-wrapper">
|System | PCU | Cost (in BP) |h
|auto-flight module | — | 3 × size category |
</div>
This armor upgrade has a compartment the size of a small vial. As a full action, you can place a single [[serum]] or [[spell ampoule]] within the compartment. As a move action, you can activate the upgrade to inject the serum into your body, where it affects you as though you had drunk it.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|auto-injector | 7 | 7,000 | 1 | any | — |
</div>
You can create compact devices that inject their user with a biohack booster in response to specific conditions. While spending 10 minutes to create [[biohacks]], you can transform any number of the created biohacks into auto-injectors and implant them in nearby creatures to whom your [[custom microlab]] is attuned. Each auto-injector occupies either the recipient's endocrine body system for augmentations or one of their armor's upgrade slots. When implanting the device, you must choose both the auto‑injector's biohack and its triggering condition, such as "this ally is attacked" or "this ally attempts a Fortitude save." When the triggering condition occurs, the auto-injector activates, injecting the booster into the ally without using an action. The injection takes effect before resolving the triggering action, so a granted AC bonus might avert an otherwise successful hit, a saving throw bonus applies to the triggering save, and so on. The biohacker can use a reaction to delay this auto-injector, preventing it from activating when its condition triggers. With 1 minute of work, the biohacker can remove an auto-injector and install it into another ally's armor, or they can change the auto-injector's triggering condition.
An auto-injector counts against the biohacker's total number of biohacks they can have ready at one time and remains functional for 24 hours or until they create a biohack to replace it.
This modifies the [[biohacks]] class feature and replaces the minor biohacks class feature.
Though it lacks the penetrating power of an [[artillery laser]], an autobeam artillery delivers sustained laser fire. It uses a rotating array of lenses to prevent the intense heat of sustained fire from melting the weapon's housing.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|autobeam artillery, tactical | 10 | 19,400 | 2d8 F | 120 ft. | [[burn]] 1d8 | 40 charges | 1 | 2 |[[automatic]] |
|autobeam artillery, advanced | 16 | 145,700 | 4d8 F | 120 ft. | [[burn]] 2d8 | 40 charges | 1 | 2 |[[automatic]] |
|autobeam artillery, elite | 19 | 543,300 | 6d8 F | 120 ft. | [[burn]] 2d10 | 40 charges | 1 | 2 |[[automatic]] |
</div>
Autobeam rifles can fire in automatic mode, spraying a cone of lasers from the barrel.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|autobeam rifle, tactical | 11 | 26,900 | 5d4 F | 60 ft. | [[burn]] 2d4 | 40 charges | 4 | 2 |[[automatic]] |
|autobeam rifle, advanced | 15 | 95,500 | 7d4 F | 60 ft. | [[burn]] 3d4 | 100 charges | 10 | 2 |[[automatic]] |
|autobeam rifle, elite | 19 | 548,100 | 12d4 F | 60 ft. | [[burn]] 5d4 | 100 charges | 5 | 2 |[[automatic]] |
</div>
This handheld holographic display unit has an underslung rack housing dozens of miniaturized flying microbots. When you activate the autocartographer, you pick a grid intersection within 50 feet to which you have line of effect. The microbots scatter in a 100-foot cube, scanning the environment and sending data back to the display unit for aggregation and analysis. The microbots transmit the dimensions and basic layout of rooms, corridors, and sizable natural features, including large furnishings. Their sensors ignore living creatures, fine details (such as images on computer screens), and temporary magical effects, but they record permanent ones, including illusory obstacles. They can't differentiate between illusions or holograms and real objects. The microbots' data is sent by a wireless signal and is therefore vulnerable to countermeasures such as [[signal jammers]].
Individual microbots are small enough to pass through any opening at least an inch wide. They can operate both in air or vacuum, but heavy gravity or strong or stronger winds overwhelm their delicate propulsion systems and render them inactive. The microbots emit a distinctive whir and can be detected with a successful DC 15 [[Perception]] check.
One minute after you release the microbots, the autocartographer displays a composite map showing all features within the scanned 100-foot cube as a three-dimensional holographic image, and the microbots return to the unit. You can save these images in a data file that can be displayed later, although you need to rescan an area to obtain updated information, such as opened doors or repositioned furniture. Each file is tagged with global or astronomical positioning data, allowing you to connect multiple maps in space and scroll between them.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|autocartographer | 9 | 13,500 | 1 | 100 | 10/hour |
</div>
This advanced device has adjustable arms that can be folded into multiple configurations, allowing you to bend, open, and twist objects made of metal and other durable materials. Powered by electric motors, an autoclaw takes 1 minute to configure for a specific task and has an effective Strength score of 30 (a +10 bonus) for the purpose of attempting Strength checks to break down doors and similar efforts; your own Strength score doesn't affect checks attempted with the autoclaw.
Autoclaws are frequently used in tasks beyond industrial uses. Free Captains and other space pirates use autoclaws to open stolen containers, while the Stewards' special tactical units use autoclaws to force doors open.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|autoclaw | 8 | 9,000 | 1 | 40 | 1/round |
</div>
An autodestruct system is a self-destruct mechanism that removes the crew's ability to avoid destruction in a crisis. When a starship outfitted with an autodestruct system is reduced to 0 Hull Points, the autodestruct system activates, destroying the ship it's built into. Starships in hexes adjacent to a starship as it autodestructs take damage to the appropriate quadrants equal to half the destroyed starship's maximum Hull Points, mitigated by shields as normal.
An autodestruct system is hardwired into the ship and has no interface that can be hacked or disabled. Once installed, it can be removed only with 1 day of work and a successful [[Engineering]] check (DC = 15 + 1-1/2 × the starship's tier). Failing this check means the autodestruct system remains active, and the engineer is aware of that fact.
<div class= "table-wrapper">
|System | PCU | Cost (in BP) |h
|autodestruct system | 0 | 1 × size category |
</div>
This sleek armor integrates extensive wiring and recycled material directly into the fabric, reinforcing key areas with advanced plating. You can spend 10 minutes programming your armor with either an alternate appearance or a stealth routine. Your armor then disguises your features to technological sensors (including cameras and creatures with the technological subtype). For an alternate appearance, this functions as if you used [[Disguise]] to change your appearance, with a [[Perception]] check DC to pierce the disguise equal to 15 + 1-1/2 × the armor’s item level. For a stealth routine, the armor disrupts how technological scanners perceive you, granting you a +2 circumstance bonus to [[Stealth]] checks against technological sensors and 10% miss chance against attacks made by technological sources. The armor’s sensor-disrupting effect is imperceptible to non-technological sources, which can perceive you normally.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br/>Bonus | KAC<br/>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br/>Slots | Bulk |h
|autoencoded veil I | 4 | 2,100 | +4 | +4 | +4 | — | — | 1 | 1 |
|autoencoded veil II | 8 | 9,500 | +9 | +10 | +5 | — | — | 2 | 1 |
|autoencoded veil III | 12 | 36,500 | +13 | +15 | +5 | — | — | 2 | 1 |
|autoencoded veil IV | 16 | 175,000 | +19 | +20 | +6 | — | — | 3 | 1 |
|autoencoded veil V | 20 | 850,000 | +22 | +22 | +7 | — | — | 4 | 1 |
</div>
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* CN Diminutive construct (swarm, technological)
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +8
!!! DEFENSE
* ''HP'' 40
* ''EAC'' 14; ''KAC'' 16
* ''Fort'' +3; ''Ref'' +3; ''Will'' +0
* ''Defensive Abilities'' [[swarm defenses]]; ''Immunities'' [[construct immunities]], [[swarm immunities]]
* ''Weaknesses'' sunlight dependency
!!! OFFENSE
* ''Speed'' 10 ft., fly 30 ft. ([[Ex]], perfect)
* ''Melee'' swarm attack (1d4 P plus consume flesh)
* ''Space'' 10 ft.; ''Reach'' 0 ft.
* ''Offensive Abilities'' [[distraction]] (DC 12)
!!! STATISTICS
* ''Str'' –3; ''Dex'' +4; ''Con'' —; ''Int'' +1; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Stealth]] +13
* ''Languages'' Common (can't speak any language)
* ''Other Abilities'' rebuild, [[unliving]]
!!! ECOLOGY
* ''Environment'' any (Aballon)
* ''Organization'' solitary or tempest (5–20)
!!! SPECIAL ABILITIES
''Consume Flesh ([[Ex]])'' The autofly swarm strips the flesh from living creatures and breaks down the material into components it can use to create more autoflies. For every 2 damage dealt by an autofly swarm to living creatures in a single round, the autofly swarm regains 1 Hit Point.
''Rebuild ([[Ex]])'' The autofly swarm can also repair other constructs. Once per day as a full action, the autofly swarm can restore 1d8 Hit Points to any constructs or objects that share its space.
''Sunlight Dependency ([[Ex]])'' Like [[anacites]], autoflies are solar-powered constructs, though they can function at reduced capacity away from light. In areas of darkness, the autofly swarm gains the [[staggered]] condition.
</div>
Originating from Aballon, an autofly swarm consists of hundreds of 6-inch-long metallic insects. Because they are designed to rebuild both themselves and other constructs, constructs see them as beneficial, potentially immortal guardians. However, due to their nature as protectors, they are ravenous when around most living things.
While autofly swarms can fix physical damage to constructs and machines, they cannot restore data or uncorrupt code. Over the centuries, their original programming has corrupted, so even though they were once designed to serve a particular area, they now roam the blasted lands of Aballon and beyond. They are attracted to creatures of flesh and blood for consumption, but they are also drawn toward high electrical activity, such as that produced by large machines, constructs, and cities (which are usually also filled with living beings).
Anacites do not consider autoflies to be part of their own species, though the swarms can be incredibly useful to them. However, autoflies are mindless and can't be reasoned with, a fact that frustrates most anacites. Since their discovery on Aballon, autoflies have been accidentally brought aboard the ships of unfortunate starfarers and have now spread across the galaxy, despite all attempts to contain them.
The autograppler is a high-power version of the standard tethering device and functions as a [[grappler]], with one key exception: the autograppler houses a powerful winch that can retract its attached cable line, pulling its user along the cable.
''Basic:'' You can toggle the autograppler's winch to retract its cable as a move action, during which time the items usage rating increases to 3/minute. The device is strong enough to pull a Medium or smaller user up inclines at a speed of 20 feet per round, as if the user were climbing. If used to target a smaller object, the winch can also drag or hoist an object whose bulk is 10 or less; increase your bulk carried by an equal amount while moving an object in this way. If you successfully grapple a creature with the autograppler and activate the winch, you can attempt a [[reposition|Reposition (combat maneuver)]] combat maneuver against the target with a +2 circumstance bonus, but only to move the target closer to you. If you fail the maneuver's melee check by 5 or more, you lose your grip on the autograppler, which lands in a space between you and the target 1d4 × 5 feet away from you.
''Advanced:'' This functions as a basic autograppler except its winch is strong enough to pull targets that are Large or smaller. It retracts its attached cable at a speed of 40 feet per round and can hoist objects of up to 20 bulk.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|autograppler, basic | 4 | 2,000 | L | 40 | 1/minute |
|autograppler, advanced | 9 | 12,800 | L | 40 | 1/minute |
</div>
A weapon with this special property can aim and fire autonomously following its programmed protocols. Unless manually operated by a gunner or instructed not to attack, the weapon fires every round during the gunnery phase, using the [[shoot]] crew action with a total gunnery bonus equal to the starship's tier (minimum +0). It always fires at the closest enemy starship in range; if more than one enemy vessel is equally close, the weapon determines its target among these options at random. Weapons with the [[mine|Mine (starship weapon property)]] special property can't also have the automated special property.
This device attaches to powered armor and consists of a small robotic arm and a storage compartment that holds up to 2 bulk of ammunition and batteries. You can activate the automated loader as a move action to reload or recharge a weapon that's mounted to the powered armor (but not to replace the batteries of the powered armor itself). Abilities that let you reload faster than a move action don't apply to an automated loader.
This upgrade can be installed only in powered armor.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|automated loader | 2 | 750 | 1 | powered | 1 |
</div>
This armor upgrade is perfect for those who don’t have time to get their armor fixed after a scrap or two. When you install this armor upgrade, you must place a number of UPBs equal to 100 × the item level of the armor in which it is installed. When you activate the upgrade with a move action, it expends a number UPBs from its reserve equal to 10 × the item level of the armor to repair the armor, restoring a number of Hit Points to the armor equal to the armor’s item level; this process takes 1 minute. This armor upgrade can repair [[broken]] armor but not destroyed armor. You can refill the upgrade’s UPB reserve to the maximum of 100 × the armor’s item level in a process that takes 1 minute.
<div class= "table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|automated self-repairer | 1 | 100 | 1 | light, heavy | L |
</div>
In addition to making ranged attacks normally, a weapon with this special property can fire in fully automatic mode. No action is required to toggle a weapon between making normal ranged attacks and using automatic mode.
When you make a full attack with a weapon in automatic mode, you can attack in a cone with a range of half the weapon's range increment. This uses all the weapon's remaining ammunition. Roll one attack against each target in the cone, starting with those closest to you. Attacks made with a weapon in automatic mode can't score critical hits. Roll damage only once, and apply it to all targets struck. Each attack against an individual creature in the cone uses up the same amount of ammunition or charges as taking two shots, and once you no longer have enough ammunition to attack another target, you stop making attacks.
For example, if you were using a tactical X-gen gun with 27 rounds remaining, you would target the nearest 6 creatures in the cone and use up all 27 rounds.
If more than one creature is equidistant and you don't have enough cartridges remaining to shoot at all equidistant creatures, determine randomly which one you target. You can't avoid shooting at allies in the cone, nor can you shoot any creature more than once, even if you have enough cartridges to fire more shots than you have targets. Attacks in automatic mode take the same penalties as other full attacks.
When you attack with a weapon in automatic mode, you can reload the weapon as part of the full action used to make the attack. You must reload the weapon with a full set of ammunition, such as a full clip, cartridge, or battery, as appropriate for the weapon.
The vehicle has a virtual intelligence that can perform sophisticated piloting tasks. This functions as the [[autopilot]] feature with a [[Piloting]] modifier equal to 4 + the vehicle's item level.
<div class= "table-wrapper">
|Modification | Level | Price |h
|autopilot | 2 | 800 |
</div>
<div class="statblock">
* <<levels>>
* ''School'' conjuration
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one vehicle
* ''Duration'' 1 hour/level
* ''Saving Throw'' none
''Spell Resistance'' no
</div>
You install an AI into a vehicle that can control the vehicle in place of an actual pilot. During the spell’s duration, you can engage or disengage the autopilot AI as a swift action. You can input a destination into the autopilot AI as a move action, and the autopilot AI attempts to reach that location if doing so is possible.
The vehicle is considered controlled when the autopilot AI is engaged. The autopilot AI’s actions are dictated by the GM, and the autopilot AI can take any of the actions to pilot a vehicle that an actual pilot can. The autopilot AI has a [[Piloting]] modifier of +14.
Some vehicles have an autopilot AI that can control the vehicle in place of an actual pilot. You can engage or disengage an autopilot as a swift action. You can input a destination into an autopilot as a move action, and the autopilot attempts to reach that location if doing so is possible (provided the autopilot isn't locked by a passcode or otherwise programmed not to obey).
A vehicle is considered controlled when the autopilot is engaged. An autopilot's actions are dictated by the GM, and an autopilot can take any of the actions to pilot the vehicle that an actual pilot can. However, autopilots tend to be cautious, rarely risking the integrity of the vehicle and never attempting to ram or run over a target unless specifically programmed as a war machine (indicated in its stat block).
The Systems entry in a vehicle's statistics lists the autopilot's modifier to the [[Piloting]] skill. For Piloting checks attempted for the Autopilot, apply this modifier first and then apply the vehicle's modifier (listed in the vehicle's Modifiers entry) to the Piloting checks.
!! Autocontrol
Some vehicles have //autocontrol//, which enables you to spend your actions on tasks other than piloting, but is far less capable than an autopilot. You can engage autocontrol as a swift action after taking a [[drive]] or [[race]] action, and it lasts until it is disengaged (also a swift action) or until the vehicle is no longer capable of moving. When you're using autocontrol, the vehicle becomes [[uncontrolled]], but each round it moves in a straight line for the same distance and at the same heading and speed as the last pilot action (moving as if taking two drive actions if drive was the last action the pilot took, or as a race action if that was the last action the pilot took). The autocontrol uses the result of the pilot's most recent Piloting check as the result of its Piloting checks.
Originally created for use by law-enforcement field agents, this scanner comes in a compact metal case that unfolds to reveal a small monitor and two attached sets of color-coded medical electrodes. Neat text etched directly on the case includes basic instructions, making it usable with little training.
As a full action, you can attach an //autopsic scanner’s// electrodes to a corpse, causing an outline of its body to display on the device’s screen, marking major injuries. While using the device in this way, you can attempt checks to determine the cause of a creature’s death even if untrained, and you gain a +2 insight bonus to perform such checks.
While the electrodes are affixed to a corpse with an intact brain (or equivalent structure), you can use the scanner to analyze the brain, attempting to retrieve one piece of information the creature knew in its last 10 minutes of life. This can be a still image of one moment the creature experienced, though details the creature didn’t consider relevant at the time are less distinct. Alternatively, the scanner can attempt to ask the corpse one question about its final moments, as //[[speak with dead]]//; although the effect grants no saving throw, there’s only a 20% chance the corpse’s response transliterated to the screen is intelligible. Either method of interrogation subtly changes the brain’s chemistry, making it immune to subsequent uses of the device.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//autoscopic scanner// | 7 | 6,300 | 1 |
</div>
<div class="statblock">
* ''Type'' melee or ranged (when engaged only); ''Special'' [[reach]], [[thrown]] (40 ft.)
* ''Damage'' medium; ''Damage'' Type P; ''Critical'' —
* ''Slots'' 2 (upper limb)
* ''Projectile Mode (1 PP)'' As a move action, the mech reconfigures the autospear from a melee weapon into a ranged weapon that fires flechettes. The autospear loses the [[reach]] and [[thrown]] weapon special properties in this form and gains the [[line|Line (weapon property)]] weapon special property, a range of 100 feet, and a capacity of 5. The autospear's other statistics don't change. The mech can reconfigure the autospear back into a melee weapon as a move action, which expends no additional Power Points.
* ''Cost'' 2 × level
</div>
This weapon's pointed head conceals a flechette cannon.
This system of finely tuned energy rods and powerful heat sinks allows a pilot to boost the mech's attack accuracy in exchange for stabilizing its weapons' output.
''Accurate Strikes (1 PP)'' For 1 round, the mech treats all of its operators as though they each had a number of [[Piloting]] ranks equal to their respective levels for the purpose of calculating the mech's attack bonuses.
An automatic model of the basic rifle, autotarget rifles fire continuously for as long as the trigger is depressed and fresh rounds are available in the magazine.
<div class="table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|autotarget rifle | 2 | 755 | 1d6 P | 60 ft. | — | 10 rounds | 1 | 2 |[[analog]], [[automatic]] |
</div>
A translucent set of additional, semi-autonomous eyelids make your eyes more resilient to sudden changes in light; their design is adapted from studies on [[oma]] adaptations to nebula navigation. You’re immune to the [[dazzled]] condition, and you get a +2 circumstance bonus to saving throws against effects that would cause you to gain the [[blinded]] condition.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|auxiliary eyelids | 8 | 8,530 | eyes |
</div>
Auxiliary systems can provide mechs with an array of additional features, from augmenting the machine's already impressive performance to granting completely unique abilities. Most auxiliary systems cost no Mech Points, but some systems have special requirements that a mech must fulfill to install them.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
This small module secretes a terrible-tasting chemical compound. The aversion coating grants you gain a +2 bonus to AC against bite attacks. If you are subject to the [[swallow whole]] universal creature rule, the swallowing creature must succeed at a Fortitude saving throw (DC = 15 + the armor's level) or become [[nauseated]] for 1d4 rounds. On a successful save, the creature is [[sickened]] for 1d6 rounds instead.
<div class= "table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk | Capacity | Usage |h
|aversion coating | 1 | 200 | 1 | light, heavy | — | — | — |
</div>
<div class="statblock">
* ''CR'' 13; ''XP'' 25,600
* CG Medium outsider (azata, chaotic, extraplanar, good)
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +23
!!! DEFENSE
* ''HP'' 210
* ''EAC'' 27; ''KAC'' 28
* ''Fort'' +14; ''Ref'' +16; ''Will'' +14
* ''Immunities'' electricity, petrification; ''Resistances'' cold 10, fire 10
!!! OFFENSE
* ''Speed'' 30 ft., Fly 60 ft. ([[Su]], perfect)
* ''Melee'' //[[limning]] [[shock]]// ultrathin [[longsword]] +25 (4d8+17 E & S plus revealing strike)
* ''Ranged'' electric bolt +25 (2d10+13 E plus revealing strike)
* ''Offensive Abilities'' revealing strike
* ''Spell-Like Abilities'' (CL 13th)
** 1/day—//[[break enchantment]]//, //[[holographic image]]// (5th level, DC 22)
** 3/day—//[[arcane eye]]//, //[[discern lies]]// (DC 21), //[[mind probe]]// (DC 21)
** At will—//[[clairaudience/clairvoyance]]//, //[[hologram memory]]// (DC 20)
!!! STATISTICS
* ''Str'' +1; ''Dex'' +4; ''Con'' +0; ''Int'' +8; ''Wis'' +6; ''Cha'' +2
* ''Skills'' [[Computers]] +28, [[Diplomacy]] +28, [[Engineering]] +23, [[Mysticism]] +23, [[Sense Motive]] +28
* ''Languages'' Celestial, Common; [[truespeech]]
* ''Other Abilities'' digital transfer
* ''Gear'' //[[limning]] [[shock]]// ultrathin [[longsword]]
!!! ECOLOGY
* ''Environment'' any (Elysium)
* ''Organization'' solitary, pair, or cell (3–8)
!!! SPECIAL ABILITIES
''Digital Transfer ([[Su]])'' An avigwyr can turn themself into code to merge with a computer. This functions as //[[transfer consciousness]]//, but the avigwyr can target only computers with this effect. An avigwyr's body and gear disappear while they're merged, and they can transfer to any other computer they're connected to via a control module, infosphere, or network, provided that computer is a valid target for transfer consciousness. An avigwyr can exit a computer they're merged with at any time, appearing in an adjacent space.
''Electric Bolt ([[Ex]])'' An avigwyr can hurl deadly bolts of electricity as a ranged attack with a range increment of 50 feet.
''Revealing Strike ([[Sp]])'' An avigwyr's attack reveals the true nature of their opponent. When a target is hit by an avigwyr's attack, any illusions or spells that change the target's appearance or shape (such as //[[polymorph]]//) are subject to //[[dispel magic]]// with a caster level equal to the avigwyr's CR. If the target is disguised, all creatures viewing the target can attempt a [[Perception]] check with a +10 circumstance bonus to pierce the disguise.
</div>
Like other azatas, avigwyrs value freedom and truth. While [[tritidairs]] carry messages between stars, avigwyrs root out corruption and avarice on city streets, investigating greedy corporations and corrupt politicians. Their indigo skin, neon hair, and sparking fingertips make them easily recognizable, so they prefer operating behind the scenes. They often work together in covert cells or alongside like-minded vigilante groups of mixed species. Avigwyrs too paranoid to trust a team work alone and likely assume any strangers who cross their path are agents sent by their enemies.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 10 minutes
* ''Range'' touch
* ''Targets'' one computer
* ''Duration'' instantaneous
* ''Saving Throw'' no (object)
* ''Spell Resistance'' no (object)
</div>
You infuse a computer with a spark of advanced technology, granting it an artificial personality. For this spell to take effect, you must have access to the computer, through either hacking it and bypassing any countermeasures it has or having unsecured access, but you don't need root access. Further, if the target computer's tier is equal to half your caster level or higher, you must expend credits equal to 5% of its base price while you cast this spell or the spell has no effect. This spell has no effect on computers that already have an artificial personality upgrade.
You decide the details of the computer's personality when you cast this spell, including its name, mannerisms, and sense of humor. The artificial personality recognizes you as its creator unless you remove that detail from its memory while casting. You can designate yourself and up to four other creatures as authorized users of the personality. This spell configures the personality with cunning and charm, granting it a bonus to [[Bluff]], [[Diplomacy]], [[Intimidate]], and [[Sense Motive]] checks equal to 3 × its tier.
As a standard action, you elevate the energy levels in the body of a target creature within 30 feet, causing it to combust if it moves. Until the end of your next turn, the first time the creature moves from its space, it gains the [[burning]] condition (Fortitude negates), dealing 1d6 fire damage per round. This damage increases by 1d6 at 6th level and every 4 levels thereafter. If you’re attuned or fully attuned when you score a critical hit against a creature, you can attempt to use this revelation as a swift action against the creature rather than as a standard action until the end of your next turn. Once you’ve targeted a creature with this revelation, you can’t target it again with awakened flames for 24 hours.
The //axiomatic// fusion imbues a weapon with divine energy from a lawful deity. Any attacks with the weapon are lawful-aligned. Damage from the weapon bypasses [[DR]]/lawful and ignores the [[energy resistance]] of chaotic dragons and chaotic outsiders. The //axiomatic// fusion can't be added to weapons that have the //[[anarchic]]// fusion.
Azatas are celestials, or good outsiders, native to Elysium.
* ''Traits:''
** [[darkvision]] 60 ft., [[low-light vision]]
** [[immunity]] to electricity and petrification
** [[resistance]] 10 to cold and fire
** [[truespeech]]
Summoned azatas are called from Elysium, and they appear to be humanoids with a mixture of elven and animalistic features. Azatas wield golden celestial bows that almost never leave their hands.
* ''Type:'' outsider (azata, chaotic, extraplanar, good)
* ''Alignment:'' change to CG
* ''Traits:''
** [[low-light vision]]
** base speed increases to 30 ft.
** [[immunity]] to electricity and petrification
** [[resistance]] equal to creature's CR to cold and fire
** if base stat block has [[DR]], change to DR/evil
* ''Skills:'' add [[Culture]]
* ''Languages:'' Common and Celestial
* ''Attack:'' the summoned creature gains a celestial bow ranged attack, which has a range increment of 120 ft. and acts as a [[natural weapon]]
<div class="table-wrapper">
| CR |Attack Adjustment |h
| 1/3 |change melee attack bonus to +2 and add ''Ranged'' celestial bow +5 (1d4 P) |
| 1 |change melee attack bonus to +6 and add ''Ranged'' celestial bow +9 (1d6+1 P) |
| 3 |change melee attack bonus to +9 and add ''Ranged'' celestial bow +12 (1d6+3 P) |
| 5 |change melee attack bonus to +12 and add ''Ranged'' celestial bow +15 (1d8+5 P) |
| 7 |change melee attack bonus to +15 and add ''Ranged'' celestial bow +18 (2d8+7 P) |
| 11 | change melee attack bonus to +21 and add ''Ranged'' celestial bow +24 (3d10+11 P) |
</div>
Azatas are celestials, or good outsiders, native to Elysium.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
<div class="statblock">
* ''CR'' 2; ''XP'' 600
* Azer mechanic
* LN Medium outsider (extraplanar, fire)
* ''Init'' +1; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +7
!!! DEFENSE
* ''HP'' 23
* ''EAC'' 13; ''KAC'' 14
* ''Fort'' +5; ''Ref'' +3; ''Will'' +3
* ''Immunities'' fire; ''SR'' 13
* ''Weaknesses'' [[vulnerable]] to cold
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' [[assault hammer]] +7 (1d6+1 B; critical [[burn]] 1d4)
* ''Ranged'' [[wave modulator]] I +7 (1d4+2 F or So; critical [[burn]] 1d4)
* ''Offensive Abilities'' elemental fire, [[combat tracking]]
!!! STATISTICS
* ''Str'' +1; ''Dex'' +1; ''Con'' +2; ''Int'' +4; ''Wis'' +0; ''Cha'' –1
* ''Skills'' [[Athletics]] +7, [[Computers]] +12, [[Engineering]] +12, [[Physical Science]] +7, [[Piloting]] +7
* ''Languages'' Common, Ignan
* ''Other Abilities'' artificial intelligence ([[exocortex]]), [[custom rig]] (cerebral implant with standard [[datajack]]), mechanic tricks ([[neural shunt]])
* ''Gear'' [[freebooter armor]], [[assault hammer]], [[wave modulator]] I with 2 batteries (20 charges each)
!!! ECOLOGY
* ''Environment'' any (Plane of Fire)
* ''Organization'' solitary, pair, order (3–6), guild (11–20), and union (30–100)
!!! SPECIAL ABILITIES
''Elemental Fire ([[Su]])'' Azers can cause any weapon they wield to deal half its damage as fire damage, becoming lethal and non-[[archaic]] if it is not already. If the weapon already deals two damage types, this effect replaces one with fire. In addition, azers can grant weapons they wield the [[burn]] critical hit effect (1d4, 2d4 at CR 6, 3d4 at CR 11, and 3d4 at CR 16+). If the weapon has any other critical hit effects, the azer chooses only one to apply on a critical hit.
</div>
Azers maintain regimented societies whose members are born into a caste reflecting the trade practiced by their ancestors. Caste determines how azers participate in their society. Members of the brass caste are often noble-born ambassadors or politicians. Bronze-caste azers work as merchants or artisans. Members of the copper caste work as mechanics and crafters who build the starships, weapons, and armor regulated or sold by other castes. While most azers prefer order, discipline, and hard work, a few choose to spurn tradition, opting for mercenary work or other venturesome vocations.
Independent azers build settlements on the Plane of Fire and some fiery Material Plane worlds. They are also part of other societies, including that of Corona on the Burning Archipelago. In the City of Brass and other efreet-ruled domains, azers are second-class citizens or worse. Free azers dislike efreet, but azers raised among those genies are proud servants upholding a hierarchy not their own.
An azer is 4 feet tall and weighs 200 pounds.
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* N Medium construct (magical)
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +8
!!! DEFENSE
* ''HP'' 42
* ''EAC'' 14; ''KAC'' 16
* ''Fort'' +3; ''Ref'' +3; ''Will'' +0
* ''Defensive Abilities'' aeon slot (+1, 10 HP), integrated weapons
* ''Immunities'' [[construct immunities]]
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' slam +9 (1d6+5 B)
* ''Ranged'' integrated azimuth [[laser rifle]] +12 (1d8+3 F)
!!! STATISTICS
* ''Str'' +2; ''Dex'' +4; ''Con'' —; ''Int'' +1; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +8, [[Culture]] +8, [[Sense Motive]] +13
* ''Languages'' Azlanti
* ''Other Abilities'' [[unliving]]
* ''Gear'' azimuth [[laser rifle]] with 2 batteries (20 charges each), slotted //[[iridescent spindle]] aeon stone//
!!! ECOLOGY
* ''Environment'' any (Azlanti Star Empire)
* ''Organization'' solitary or complement (2–6)
!!! SPECIAL ABILITIES
''Aeon Slot ([[Su]])'' The body of every Azlanti adjutant robot contains a slot to house a single //[[aeon stone]]//, usually in the center of its faceplate. A slotted //aeon stone// doesn't provide its usual bonus, but instead gives the robot a bonus equal to half the //aeon stone's// level (minimum +1) to saving throws against effects that deal energy damage and effects that specifically target constructs or electronic systems. As a standard action, the robot can burn out the slotted //aeon stone// to recover a number of Hit Points equal to 5 times the //aeon stone's// level. An //aeon stone// burned out in this way is forever nonmagical and does not provide this or any other robot with any bonus to saving throws. Removing or slotting an //aeon stone// into an Azlanti adjutant robot is a full action.
''Integrated Weapons ([[Ex]])'' An Azlanti adjutant robot's rifle is integrated into its frame and can't be disarmed.
</div>
Designed and manufactured long ago by a technomagical robotics firm loyal to the Aeon Throne, adjutant robots are ideal assistants for busy officers: in addition to serving as scribes, valets, and social secretaries, the robots make rapid strategic calculations to aid real-time combat decisions. Centuries ago, when the Aeon Throne mandated the presence of an adjutant robot on all large starships and in every military engagement, most officers were pleased with the aid.
Shortly afterward, rumors began to circulate that the imperially mandated robots were not mere helpers, but spies for the Aeon Throne, recording and transmitting information about their assigned officers to loyalty evaluators. Growing suspicious, many officers began circumventing their adjutant robots when possible. More canny officers reprogrammed their robots to submit only reports favorable to themselves— and unfavorable to their rivals. Why the Aeon Throne ceased assigning these robots is information lost in the Gap, but the Star Empire hasn't manufactured a new one in centuries. Some adjutant robots still operate at the fringes of the Azlanti Star Empire, either maintaining their old vigils or assisting—and still transmitting information on—descendants of remote planetary governors.
Although housing designs of adjutant robots differ, most are humanoid, with four arms able to handle multiple physical tasks simultaneously. Designed to be useful on the battlefield, adjutant robots carry an integrated weapon, have an aeon slot for magical protection, and have tracked wheels instead of feet to handle rugged terrain.
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* N Medium construct (technological)
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +18
!!! DEFENSE
* ''HP'' 90
* ''EAC'' 18; ''KAC'' 20
* ''Fort'' +6; ''Ref'' +6; ''Will'' +3
* ''Immunities'' [[construct immunities]]; ''SR'' 17
* ''Weaknesses'' Azlanti programming, [[vulnerable]] to electricity
!!! OFFENSE
* ''Speed'' 40 ft.
* ''Melee'' slam +17 (1d8+11 B)
* ''Ranged'' disintegrator beam +14 (2d6+6 A; critical [[corrode]] 1d6)
* ''Offensive Abilities'' self-destruct (3d6 P, DC 14)
!!! STATISTICS
* ''Str'' +5; ''Dex'' +3; ''Con'' —; ''Int'' +0; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Engineering]] +13, [[Intimidate]] +13
* ''Languages'' Azlanti
* ''Other Abilities'' embedded aeon stone (//[[purple sphere]] aeon stone//), [[unliving]]
!!! ECOLOGY
* ''Environment'' any urban (Azlanti Star Empire)
* ''Organization'' solitary, pair, or patrol (3–7)
!!! SPECIAL ABILITIES
''Azlanti Programming ([[Ex]])'' An Azlanti battle robot's programming is so meticulous that it is incapable of attacking an Azlanti human. However, its sensors aren't foolproof and a creature can deceive the robot with a successful [[Disguise]] check.
''Disintegrator Beam ([[Ex]])'' An Azlanti battle robot has a disintegrator beam as a natural weapon built into one of its arms. This beam has a range increment of 30 feet and prevents the robot from wielding any other weapon that requires two hands.
''Embedded Aeon Stone ([[Ex]])'' As a full action, an //[[aeon stone]]// can be slotted into (or removed from) an Azlanti battle robot's forehead while the robot is [[helpless]], [[pinned]], or willing. The robot gains the benefit of a slotted //aeon stone// provided the stone's item level is no greater than the robot's CR + 1.
''Self-Destruct ([[Ex]])'' When an Azlanti battle robot's Hit Points are reduced to 10 or fewer, it explodes on its next turn in a 10-foot-radius burst, even if it has already been destroyed. Creatures within range take 3d6 piercing damage (Reflex DC 14 half). As a full action that provokes attacks of opportunity, a creature adjacent to the robot can attempt a DC 24 [[Engineering]] check to disarm the self-destruct mechanism before it detonates.
</div>
Azlanti battle robots can be found at the front of most Azlanti Star Empire advances. Their unwavering loyalty and disposability, coupled with their propensity to self-destruct amid enemy soldiers, makes them invaluable on the battlefield. These robots resemble members of the iconic [[Aeon Guard]] with exposed gears and pistons, which call back to the wondrous clockwork creations of the ancient Azlanti people of lost Golarion. Further, these constructs are incapable of directly assaulting anyone of pure Azlanti heritage. However, field tests have shown that exceptional disguises can trick the robots. Azlanti roboticists are hard at work correcting this flaw.
Mass-produced in imperial factories, each Azlanti robot stands 7 feet tall and weighs 500 pounds.
The Azlanti frown upon non-Azlanti and non-nobility wearing these silvery cloaks. When you wear an //Azlanti noble's cloak//, once per day, you can choose one attack roll that hits you. That roll must be rerolled, requiring no action on your part. In addition, once per day as a reaction to an attack hitting or missing you, you can turn [[invisible]], per the //[[invisibility]]// spell, for 1 minute. You can take this reaction during a surprise round even if you can't otherwise act during that round. If you use a given //Azlanti noble's cloak//, you can't benefit from a different one for 24 hours.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//Azlanti noble's cloak// | 7 | 6000 | L |
</div>
Zolan's minions took Parept Ameondria's armor from the Royal Venture and turned it over to him when they left Nakondis. Extremely rare, suits of //Azlanti royal battle regalia// are reserved for the upper echelons of Azlanti nobility and are usually marked with insignia of the wearer's lineage. When caught, any non-Azlanti audacious enough to don one of these ceremonial suits is tortured for years before being put to death.
The suit has 4 upgrade slots, one of which can be used only to hold an //[[aeon stone]]//. The wearer gains a +4 circumstance bonus to [[Bluff]], [[Diplomacy]], and [[Intimidate]] checks against Azlanti. Each suit has a special contingency mechanism that activates once per day when its wearer is reduced to 15 or fewer Hit Points, whisking him away to a spot he visualizes as if he were targeted with a //[[dimension door]]// spell. //Azlanti royal battle regalia// is sold only in the Azlanti Star Empire to members of the nobility. Though it is a magic suit of armor, it doesn't count as a worn item
<div class="table-wrapper">
|Armor | Level | Price | EAC<br>Bonus | KAC<br>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br>Slots | Bulk |h
|//Azlanti royal battle regalia// | 7 | 8,000 | +7 | +8 | +5 | — | — | 4 | 1 |
</div>
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* N Medium construct (magical, technological)
* ''Init'' +6; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +23
!!! DEFENSE
* ''HP'' 185
* ''EAC'' 26; ''KAC'' 27
* ''Fort'' +12; ''Ref'' +12; ''Will'' +16
* ''Defensive Abilities'' [[void adaptation]]; ''DR'' 10/magic; ''Immunities'' [[construct immunities]]; ''Resistances'' fire 20; ''SR'' 23
!!! OFFENSE
* ''Speed'' 40 ft., fly 80 ft. ([[Ex]], perfect)
* ''Melee'' nanite blade +20 (6d4+15 S; critical nanite burst [DC 21])
* ''Ranged'' radiance beam +22 (2d10+13 F; critical [[blind]] [DC 21])
* ''Offensive Abilities'' self-destruct (5d10 P, DC 21)
* ''Spell-Like Abilities'' (CL 13th; melee +20)
** 1/day—//[[control machines]]// (DC 24), //[[transfer consciousness]]// (DC 24)
** 3/day—//[[destruction protocol]]// (DC 23), //[[digital doorway]]//, //[[overload systems]]// (DC 23)
** At will—//[[discharge]]// (DC 22), //[[invisibility to technology]]//, //[[manipulate tech]]//
!!! STATISTICS
* ''Str'' +2; ''Dex'' +6; ''Con'' +4; ''Int'' +8; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +23 (+31 to fly), [[Computers]] +28, [[Engineering]] +28, [[Stealth]] +28
* ''Languages'' Azlanti, Common, Vesk, plus any 6 languages
* ''Other Abilities'' [[spaceflight]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Nanite Blade ([[Ex]])'' An Azlanti stellar scout’s blade is composed of the same nanites as the construct itself, and functions as if it has the [[nanite]] weapon fusion
.
''Nanite Repair ([[Ex]])'' Every hour, an Azlanti stellar scout regains 13 Hit Points as its nanites repair its body. Once per day as a full action, it can restore 5d8 Hit Points to itself, or to a touched construct or object.
''Self-Destruct ([[Ex]])'' When an Azlanti stellar scout’s Hit Points are reduced to 10 or fewer, it explodes on its next turn in a 15-foot-radius burst, even if it has already been destroyed. Creatures within range take 5d10 piercing damage (Reflex DC 21 half). As a full action that provokes attacks of opportunity, a creature adjacent to the scout can attempt a DC 34 [[Engineering]] check to disarm the self-destruct mechanism before it detonates.
</div>
Stellar scouts are among the Azlanti Star Empire’s most sophisticated robots. Each is an anthropomorphic construct housing countless arcane nanites the robot can shape into powerful weapons and armor. Azlanti invasions often disperse dozens of these constructs prior to a major battle, relying on the robots’ spaceflight abilities to reach enemy starships. Once on board, a stellar scout infiltrates the starship’s essential systems, quietly sabotaging core functions, stealing data, neutralizing key crew members, or planting explosives. As with so many Azlanti technologies, a stellar scout offensively self-destructs when at risk of capture.
Each stellar scout’s core contains an aeon stone. By resonating the stone at specific frequencies, the robot can emulate magical feats, and the stressed aeon stone generates interference that stymies technological sensors and can overwhelm mundane programming. This construction requires regular replacement, so stellar scouts rarely remain active more than a few years before destroying the magic item.
When you activate your [[supernova]] stellar revelation while in an area with an atmosphere, you can choose for the revelation to create intense turbulence in the affected area. Your supernova disperses fog, smoke, and similar effects as though it were strong wind. At the beginning of your next turn, the air implodes toward the area’s center, creating strong winds for 1 round and causing all creatures with the [[burning]] condition in the area to immediately take fire damage equal to the damage dealt by their burning condition (Reflex negates the additional damage).
The starship moves up to half its speed in the direction of the aft edge without changing facing. It can't take any turns during this movement. To perform this stunt, you must succeed at a [[Piloting]] check (DC = 10 + 1-1/2 times your starship's tier). On a failed check, your starship moves backward only 1 hex. If you fail this check by 5 or more, your starship does not move at all and takes a –4 penalty to its AC and TL until the start of the next round.
You aren't as easy to hit when surrounded.
''Prerequisites:'' Perception 3 ranks.
''Benefit:'' You gain a +1 circumstance bonus to KAC against attacks from foes that flank you. If either foe has a CR that's equal to or higher than your level, you don't gain this bonus.
''Teamwork Benefit:'' If you're adjacent to an ally who also has this feat, you instead gain a +2 circumstance bonus to KAC against attacks from foes that flank you, and you gain this bonus no matter the CR of your opponents.
Backpacks have numerous pockets for storing items that you might need while adventuring and include industrial-strength straps for attaching additional items for easy access. Padded bands strap across the wearer's chest and waist to evenly distribute the backpack's weight, and it can carry roughly 2 bulk of items. When fitted properly and worn, the bulk of the backpack itself does not count against your bulk carried (though it does if you carry it in your hands), but the bulk of any items within it does.
!!Consumer
When wearing a properly fitted consumer backpack, you treat your Strength score as 1 higher for the purpose of determining your carrying capacity.
!! Industrial
When wearing a properly fitted industrial backpack, you treat your Strength score as 2 higher for the purpose of determining your carrying capacity. This does not stack with the effect of a consumer backpack.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|consumer | 1 | 3 | 1 |
|industrial | 1 | 25 | 1 |
</div>
You can connect charged electric items such as batteries to this miniature generator to recharge them. The electricity comes from the kinetic energy of your movement, which generates 1 charge every 10 minutes of movement. No more than one item can be plugged in at a time, and the generator doesn't produce charges when you're resting or otherwise stationary.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|backup generator | 4 | 2,100 | 1 | any, shield | 1 |
</div>
You install a secondary lobe in your brain that can shore up your mental faculties when your mind is compromised. At the beginning of your turn, you can spend 1 Resolve Point (this doesn't require an action) to ignore one of the following conditions until the beginning of your next turn: [[confused]], [[frightened]], or [[shaken]]. Alternatively, at the beginning of your turn, you can spend 2 Resolve Points (this doesn't require an action) to ignore one of the following conditions until the beginning of your next turn: [[cowering]], [[dazed]], [[panicked]], or [[stunned]]. If you spend any Resolve Points in this fashion, you are [[staggered]] until the beginning of your next turn. The condition still functions normally for the purposes of duration and removing it.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|backup lobe | 11 | 23,400 | brain |
</div>
With a few quick words and menacing body language, you can make a foe reconsider starting a fight. When you roll initiative, make an [[Intimidate]] check against one creature you’re aware of within 30 feet. The DC of this check is equal to either 10 + your opponent’s total Intimidate skill bonus, or 15 + 1-1/2 × the opponent’s CR, whichever is greater; if the creature has a special bonus to saving throws against fear effects, it adds this bonus to the DC. If you succeed, roll your expertise die and apply the result as a penalty to that creature’s initiative result. Once you use this expertise talent, you can’t do so again until you rest for 10 minutes to regain Stamina Points. This is a mind-affecting fear effect.
As part of a move action, you can use Acrobatics to move across narrow surfaces and uneven ground without falling. A successful check allows you to move at half your land speed across such a surface. While balancing, you are [[flat-footed]]. If you fail the Acrobatics check to begin moving across a narrow surface or uneven ground, your move action ends at the point just before you'd need to begin balancing. If you fail the check while already balancing (having succeeded on a previous turn), you fall prone and the GM may rule that you start falling, depending on the type of surface you are moving across.
If you take damage while balancing, you must immediately attempt an Acrobatics check at the initial DC. On a success, you remain balancing (and can continue to move if it is your turn). If you fail, you fall [[prone]] and, depending on the type of surface you are balancing upon, the GM can rule that you start falling. You can't take 20 on Acrobatics checks to balance.
The DCs for Acrobatics checks to balance are based on the width of the surface you are traversing, but can also be adjusted based on environmental circumstances such as slope and surface conditions. Such modifiers are cumulative; use all that apply.
<div class= "table-wrapper">
|Surface Width | DC |h
|Greater than 3 feet wide* | 0 |
|3–1 feet wide* | 5 |
|11–7 inches wide | 10 |
|6–2 inches wide | 15 |
|Less than 2 inches wide | 20 |
|* No Acrobatics check is needed to move across these surfaces unless a DC modifier (see the table below) increases the DC to 10 or higher. |<|f
</div>
<div class= "table-wrapper">
|Circumstance* | DC Modifier |h
|Slightly obstructed (gravel, sand) | +2 |
|Severely obstructed (cavern, rubble) | +5 |
|Slightly slippery (wet) | +2 |
|Severely slippery (icy) | +5 |
|Slightly sloped (<45 degrees) | +2 |
|Severely sloped (>45 degrees) | +5 |
|Slightly unsteady (rough spaceflight) | +2 |
|Moderately unsteady (jostled spacecraft) | +5 |
|Severely unsteady (earthquake) | +10 |
|* These circumstances apply to the balance and tumble tasks of Acrobatics and the [[jump]] task of [[Athletics]]. |<|f
You can balance the shields, redirecting power from one quadrant to protect another. With a successful [[Computers]] check (DC = 10 + 1-1/2 times your starship's tier), you can shift Shield Points (SP) from the shield in one quadrant to the shield in another quadrant, including to depleted shields (after rebalancing, every shield must have at least 10% of the total current SP). Alternatively, you can add up the SP from all the remaining shields and evenly distribute them to all four quadrants, putting any excess SP in the forward quadrant.
''Critical:'' While rebalancing the shields, you discover latent power in the shield systems. Before redistributing the Shield Points, you increase the total Shield Points by 5% of the starship's PCU rating, up to the shields' maximum value.
The speedy aberrations known as [[bantrids]] roll about on their foot orbs with grace and agility. Gyrostabilizers within your own feet (or similar appendages) grant you a +2 enhancement bonus to your AC against [[trip|Trip (combat maneuver)]] combat maneuvers and allow you to stand up from [[prone]] as a swift action.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|balanced graft | 1 | 350 | all feet |
</div>
<div class="statblock">
* <<levels>>
* ''School'' transmutation (polymorph)
* ''Casting Time'' 1 round
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one creature
* ''Duration'' 1 minute/level (D)
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
You change a target's shape to that of a smaller, weaker creature.
''1st:'' The target shrinks slightly (though it retains its size category) and gains a few cosmetic bestial features of an animal you choose. The target takes a –1 penalty to AC, attack rolls, melee damage rolls, Reflex saving throws, and Strength- and Dexterity-based ability checks and skill checks. //[[Lesser remove condition]]// and similar spells can end this effect.
''2nd:'' As per the 1st-level version, but the target takes a –2 penalty and must attempt an additional saving throw each round until it fails or the spell's duration ends. If the target fails this second saving throw, its appearance becomes more bestial and the penalty increases to –3. //[[Break enchantment]]//, //[[remove affliction]]//, or //[[remove condition]]// can end the spell's effect.
''3rd:'' As per the 2nd-level version, but you can make the target one size category smaller (its equipment resizes to remain functional, though it may lose reach with its new size). The target must attempt a saving throw every round, with the penalty to AC, attack rolls, melee damage rolls, Reflex saving throws, and Strength- and Dexterity-based ability checks and skill checks worsening by 1 each time the target fails one of these saving throws, to a maximum penalty of –4. If the target succeeds at this saving throw after the penalty has reached its maximum, it is no longer required to attempt saving throws. If the target fails this saving throw after the penalty has reached its maximum, you can change the duration to permanent (D). If an object leaves the creature's possession for 1 round or more, it reverts to normal.
''4th:'' As per the 3rd-level version, but the penalty begins at –3, and the target must attempt a saving throw every round, with the penalty worsening by 1 each time the target fails one of these saving throws (to a maximum penalty of –5). If the target succeeds at this saving throw after the penalty has reached its maximum, it is no longer required to attempt saving throws. If the target fails this saving throw after the penalty has reached its maximum, you can change the duration to permanent (D). If an object leaves the creature's possession for 1 round or more, it reverts to normal.
''5th:'' As per the 4th-level version, except if the target fails its saving throw after the penalty has reached –5, instead of making the duration permanent (D), for the remainder of the duration you can turn the target into a Small animal or similar beast that has EAC 10 and KAC 12, can't make attacks or cast spells or spell-like abilities, and can't use extraordinary or supernatural abilities. The target retains its Intelligence, Wisdom, and Charisma scores in animal form, but it can't speak or use any abilities of its normal form. Equipment the target is wearing is absorbed into this form, and the target still benefits from any environmental protections on its armor, but the target drops gear it's holding or carrying but not wearing.
''6th:'' As per the 5th-level version, except if the target fails its saving throw after the penalty has reached –5, you can both make the duration permanent (D) and turn the target into a Small animal or similar beast.
<div class="statblock">
* <<levels>>
* ''School'' transmutation (polymorph)
* ''Targets'' up to four creatures, no two of which can be more than 30 ft. apart
</div>
This spell functions as //[[baleful polymorph]]//, except as noted in this description. Each target must take the same form.
"""
''4th:'' This spell causes all targets to suffer the effects of the 1st-level version of //baleful polymorph//.
''5th:'' This spell causes all targets to suffer the effects of the 2nd-level version of //baleful polymorph//.
''6th:'' This spell causes all targets to suffer the effects of the 3rd-level version of //baleful polymorph//.
"""
<div class="statblock">
* <<levels>>
* ''School'' illusion (mind-affecting)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one creature
* ''Duration'' 1 round/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
You overstimulate the senses of the affected creature, causing its senses to interfere with another. While a creature is under the effects of this spell, sensory input is processed by the wrong senses, such that noise triggers bursts of colors, smells create sounds, and so on. The affected creature moves at half speed, has a 20% miss chance on all attacks, has the [[flat-footed]] condition, and takes a –4 penalty on skill checks and Reflex saving throws.
Effects that negate or reduce the miss chance from concealment don’t affect the miss chance effect from //baleful synesthesia//.
<div class="statblock">
* ''CR'' 9; ''XP'' 6,400
* N Large construct (magical, technological)
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +17
!!! DEFENSE
* ''HP'' 145
* ''EAC'' 22; ''KAC'' 24
* ''Fort'' +9; ''Ref'' +9; ''Will'' +6
* ''Defensive Abilities'' kinetic displacement; ''DR'' 10/—; ''Immunities'' [[construct immunities]]
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' slam +22 (2d10+15 B; critical [[knockdown]])
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' felling blow
!!! STATISTICS
* ''Str'' +6; ''Dex'' +3; ''Con'' +4; ''Int'' +2; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Athletics]] +22, [[Engineering]] +17, [[Sense Motive]] +17
* ''Languages'' Aklo, Azlanti, Common
!!! ECOLOGY
* ''Environment'' any (Shadari Confederacy)
* ''Organization'' solitary, pair, or coterie (3–10)
!!! SPECIAL ABILITIES
''Felling Blow ([[Ex]])'' As a swift action upon successfully striking an opponent with a melee attack, a balrodd can apply the critical effect of the unarmed strike or melee weapon in addition to doing damage (which isn’t doubled). A balrodd can use this ability once every 1d4 rounds.
''Kinetic Displacement ([[Su]])'' As reaction to taking damage that is wholly or partially absorbed by their damage reduction, a balrodd can redistribute that kinetic force outward in a 5-foot radius. Each creature in the area must succeed at a DC 16 Fortitude save or take an amount of bludgeoning damage equal to the amount of damage blocked by the balrodd’s [[DR]] and be pushed 5 feet away from the balrodd. On a success, the creature takes half damage and isn’t pushed.
</div>
No one—not even balrodds—are certain who originally crafted them many millennia ago, but they lived peacefully on their quiet moon orbiting a stormy gas giant until the Azlanti arrived. Fresh off their victory over the screedreeps on Eostrillon, the Azlanti enslaved the balrodds as part of their attempt to conquer the entire system, forcing the constructs into positions of menial labor and cannon-fodder infantry. Less than a century later, the balrodd population revolted against their Azlanti masters and left the system to eventually settle within the Shadari Confederacy. Today, they’re proud citizens of that system, with many even now following the philosophy of Ataxxea and receiving the Eye of Entropy tattoo.
A balrodd is a towering, barrel-chested construct with a malleable artificial “skin” stretched over a sturdy metal frame. When first constructed—through a process that is kept a closely guarded secret—a balrodd has almost no clearly defined features. Their face is smooth and their limbs no more than curving planes. Over time, they are encouraged to “find their face” and sculpt it as they feel is appropriate for their identity.
Despite their intelligence and tradition of self‑actualization as a populace, balrodds often find themselves pigeonholed into martial roles because of their stature and abilities. Some accept these destinies, while others manage to shape themselves—figuratively and literally—into trusted figures who hold positions of greater responsibility in their communities. These balrodds are known to defend their higher status with fierce determination.
This //aeon stone// functions as a specialized scrying sensor that’s constantly alert for a specific trigger. Once per hour as a move action, you can task the //aeon stone// with watching for a specific simple stimulus such as “any Medium or larger creature,” “the sound of an approaching creature,” or “smoke.” The //aeon stone// constantly perceives your surroundings in a 30-foot radius with human-like senses and [[darkvision]]; the stone cannot detect anything beyond that range. The stone has a +15 modifier to [[Life Science]], [[Perception]], or [[Physical Science]] checks to identify that assigned stimulus. If the stone senses the stimulus, it telepathically signals you, imparting information about the stimulus’s direction and distance for 1 round. The stone can provide up to three such signals per hour and no more than one per minute. The stone watches for its assigned stimulus until you deactivate the aeon stone or task it with detecting a new stimulus.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//banded malachite cabochon// | 4 | 2,100 | — |
</div>
You cultivate a menacing persona to coerce your targets.
* ''Associated Skills:'' [[Intimidate]] and [[Sense Motive]]. You can attempt an Intimidate check with a +4 bonus to make a [[trick attack]] by menacing or threatening your foe.
* ''Specialization Exploit:'' [[disarming command]]
* ''Commanding Presence ([[Ex]]):'' At 11th level, you can spend 1 Resolve Point as a standard action to attempt an Intimidate check to [[demoralize]] any number of creatures within 60 feet, though you take a cumulative –1 penalty to your Intimidate check for every two creatures you attempt to demoralize in this way (rounded down). Then choose a number of creatures you successfully demoralized (up to a number of creatures equal to your Charisma modifier). Those creatures follow a single command you issue for 1 round, per command (Will negates). Once you've targeted a creature with commanding presence, it's immune to your commanding presence for 24 hours. This is a mind-affecting, sense-dependent fear effect; the secondary command effect is also language-dependent.
The //bane// fusion enhances the power of critical hits against certain foes. Against a designated foe, the //bane// weapon gains the [[stunned]] critical hit effect. If the weapon already has a critical hit effect, when you score a critical hit against an appropriate foe, you can apply either the weapon's normal critical hit effect or the stunned effect. When you add this fusion to a weapon (or create it as a fusion seal), you must select a single creature type (aberration, animal, construct, dragon, fey, humanoid, magical beast, ooze, outsider, plant, undead, or vermin) against which it will apply. If you select humanoid or outsider, you must also select one subtype. The stunned critical hit effect applies only against creatures of the selected type (and subtype, if selected). Once selected, the creature type and subtype can't be changed.
//Banishing blades// are magic weapons capable of forcing extraplanar foes back to their native plane. These weapons were once used primarily by the Church of Iomedae in its crusades against fiendish incursions, but the Drift Crisis brought growing concerns that other extraplanar creatures might threaten the Material Plane, and production of these weapons accelerated. All //banishing blades// function as if they had the //[[holy]]// fusion in addition to the rest of their abilities. This counts against how many total fusions a banishing blade can have.
If you score a critical hit against a creature with the extraplanar subtype, that creature must succeed at Will save (DC = 10 + item level + your key ability score modifier) or be sent back to its home plane, as the spell //[[dismissal]]//, with the following exceptions: if the creature also has the evil subtype, the //banishing blade// counts as an object the subject opposes, granting a +2 to the save DC and a +1 on caster-level checks to overcome the subject’s [[spell resistance]], if any. If you must make a caster-level check to overcome a target’s spell resistance to use this effect, use the //banishing blade’s// item level as your caster level. For mk 1 and mk 2 //banishing blades//, the banished creature automatically returns in the same spot from where it was banished after 1 minute has elapsed.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |Equivalent Weapon |h
|//banishing blade//, mk 1 | 8 | 10,500 | 1 |sintered [[longsword]] |
|//banishing blade//, mk 2 | 12 | 39,000 | 1 |ultrathin [[longsword]] |
|//banishing blade//, mk 3 | 17 | 289,000 | 1 |molecular rift [[longsword]] |
|//banishing blade//, mk 4 | 20 | 967,000 | 1 |dimensional slice [[longsword]] |
</div>
Until recently, the small Liavaran shepherd moon named Hibb was believed to be uninhabited. With rolling hills covered in stubby grasslike protrusions and very few bodies of water, Hibb held little of interest for explorers. The moon's lack of natural resources and the pervasive stench that issued from the ground, which no manner of filtration could suppress, further contributed to Hibb not being colonized by the barathus—or anyone else in the Pact Worlds, for that matter.
However, less than 5 years ago, previously unnoticed machinery under Hibb's surface began to stir. All across the moon, apertures opened in the ground, from which rose tall towers with spiraling ramps. Heretofore unknown creatures emerged from these towers, their small visual sensors adjusting to the light of the distant sun. The members of this sentient species, who call themselves bantrids, had slumbered in stasis for eons before their ancient computers woke them. Because of the Gap and faulty data-storage drives, however, the bantrids had no knowledge of the solar system's current political climate and no recollection of why their people entered stasis in the first place. Some believe they were hiding from an imminent threat or natural disaster, while others posit that bantrids were the first sentient species in the system and that they put themselves to sleep to wait for others to interact with.
Bantrids have unusual anatomy. Their lower halves are nothing more than dense organic spheres. Bantrids move by spinning these foot-orbs using hundreds of thousands of cilia on the underside of partial sheaths that cover the orbs. Their upper torsos are stout columns that taper slightly at the top. Bantrids have no heads in the fashion most humanoids do. Instead, their visual and auditory sensors are located in the middle of their torsos, directly under small mouths containing a few teeth made only for chewing fruits and nuts. Bantrids have no noses and, in fact, no sense of smell at all. Near the apex of their torsos, bantrids have a pair of appendages that resemble large, flat hands with several thin fingers. Bantrids' skin often bears striped coloration along the length of their torsos and across their upper limbs.
Most bantrids are curious about the "new" galaxy they now find themselves in and are eager to learn about all the other sentient species that inhabit it. This leads them to rush (sometimes literally) into situations before fully understanding them. Some of their Pact Worlds neighbors find this trait endearing and happily bring bantrids into their businesses or starship crews, while a few others are put off by their appearance. Bantrids don't hesitate to write off those who don't accept them, and they easily move on to new opportunities.
Bantrid culture revolves around motion, from their ramped tower-dwellings to their treadmill-chairs. A bantrid who isn't moving starts to feel an overwhelming dread akin to claustrophobia. If this lasts too long, the bantrid will simply leave wherever they are at the moment, despite the social consequences. A restrained bantrid will keen wildly and hyperventilate, usually passing out.
Bantrids have no gender and reproduce via a form of budding that creates tiny bantrids whose foot-orbs are not yet sufficiently developed to allow locomotion. These offspring must be carefully watched over until they can move on their own, which takes about 5 months.
!! Racial Traits
* ''Ability Adjustments:'' +2 Dex, +2 Con, -2 Int
* ''Hit Points:'' 4
* ''Size and Type:'' Bantrids are Small aberrations.
* ''Anosmatic:'' Bantrids have no sense of smell and are immune to sense-dependent effects that rely on smell.
* ''Balanced:'' Bantrids receive a +2 racial bonus to AC against trip combat maneuvers and can stand up from [[prone]] as a swift action.
* ''Daredevil:'' Bantrids receive a +2 racial bonus to [[Acrobatics]] checks.
* ''Darkvision:'' Bantrids can see up to 60 feet in the dark.
* ''Swift:'' Bantrids have a land speed of 40 feet.
!!! Alternate Racial Traits
* ''Magnetic Orb:'' With proper diet and medication, bantrids can give their foot-orb a metallic, magnetic core. After sufficient practice, they can direct this magnetic force or even invert it so they can roll along metal walls or ceilings. They gain a climb speed of 30 feet that they can use only on metallic surfaces, and can move across metal surfaces at their land speed, even in zero gravity. They also gain a +2 racial bonus to KAC against [[bull rush]] and [[trip]] combat maneuvers when standing on a metal surface. Magnetic orbs are heavier than the typical bantrid foot-orb, and the land speed of these bantrids is reduced to 30 feet. This replaces balanced, daredevil, and swift.
* ''Hollow Orb:'' By changing their diet, bantrids can cause their foot-orb to gain hollow, honeycomb-like cells throughout its structure. These bantrids are faster and float more easily in water, but the extra speed comes with a loss of fine control. These bantrids' land speed increases to 50 feet, and they gain a +2 racial bonus to [[Athletics]] checks to [[swim]]. This replaces balanced, daredevil, and swift.
* ''Hotshot:'' Bantrids have a natural skill for moving carefully at high speeds. With a bit of practice, this makes them magnificent pilots and drivers. Bantrids with this trait gain a +2 racial bonus to [[Piloting]] checks. This replaces balanced.
!! Balanced Graft
{{Balanced}}
This helm replaces a suit of armor's normal helmet (if any) and is incorporated into the armor's normal environmental protections; these protections do not function if the helm is removed. If the armor has an available [[upgrade slot|Armor Upgrades]], a //barachius helm// takes up one upgrade slot; otherwise, the helm counts as one of your two worn magic items.
While wearing a //barachius helm//, once per day as a standard action, you can activate its ability to detect evil in your environment. Any creature you can see within 60 feet that has the evil subtype (such as a devil or an evil dragon) appears to have an obvious glowing outline visible only to you. Evil magic weapons (such as a rifle with the [[unholy]] weapon fusion) and other forms of evil technology gain a similar glowing outline. This does not increase your visual range or allow you to see [[invisible]] creatures.
In addition, once per day, the wearer of a //barachius helm// can use the barachius's firewall supernatural ability.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//barachius helm// | 5 | 3,000 | L |
</div>
Barathus are the sentient apex of Bretheda's gas-giant ecosystem, blimp-like creatures vaguely reminiscent of jellyfish, with several unusual evolutionary adaptations. The first is their ability to rewrite their own genetic code instinctively and at will, adjusting their own biology to allow them to manufacture a huge array of substances—and even advanced biotechnology—within the crucibles of their own bodies. Yet while this ability makes them quite successful in the Pact Worlds economy, and has deeply influenced their culture's understanding of wealth and trade, their more notable adaptation is the ability to combine with others of their kind into larger, hive-minded superentities. These mergings create not merely amalgams of their component beings, but entirely new entities with unique and independent consciousnesses, yet which in turn often disband back into their component individuals after a particular need or threat has passed.
Barathu culture tends to be easygoing but hard for some other races to understand, as the barathus' frequent merging makes the concept of "self" somewhat nebulous to them. Young barathus who grow up surrounded by humanoids are an exception, as they are better able to appreciate the mindsets of creatures who exist in static, solitary configurations. Compared to older barathus, early stage barathus are more adventurous and individualistic, and their adaptation to the humanoid mindset makes it more difficult for them to merge completely with others of their kind. Most of these early stage barathus grow out of this phase, gaining the ability to fully integrate with others, yet recent generations have seen more and more barathus deliberately clinging to their juvenile mindsets. While plenty of barathus remain discrete entities for most of their lives, barathus nearing the ends of their lives often merge with massive, permanent combinatory entities that serve as corporations, governments, or cultural repositories.
!! Racial Traits
* ''Ability Adjustments:'' +2 Con, +2 Wis, –2 Dex
* ''Hit Points:'' 6
* ''Size and Type:'' Early stage barathus are Medium aberrations.
* ''Darkvision'' Early stage barathus have [[darkvision]] with a range of 60 feet.
* ''Early Stage Adaptation:'' An early stage barathu's body is mutable and can adapt to many different situations. Once every 1d4 rounds as a swift action, an early stage barathu can reshape its body and adjust its chemistry to gain one of the following qualities. The adaptation lasts until the beginning of the early stage barathu's next turn. Unlike more mature barathus, early stage barathus are not generally capable of more complex adaptations.
** Upper limb refinements enable the barathu to add an additional amount of damage to melee attacks equal to its Strength modifier.
** A toughened dermal layer grants its a +1 racial bonus to AC.
** Developed lower limbs grant it a base speed of 15 feet.
** Molecular-level modifications grant it [[resistance]] 2 against a single energy type (acid, cold, electricity, fire, or sonic).
** Elongated limbs extend its [[reach]] to 10 feet.
* ''Floaters:'' Early stage barathus have a base speed of 0 feet and an extraordinary fly speed of 30 feet with average maneuverability.
* ''Limited Telepathy:'' Early stage barathus can communicate telepathically with any creatures within 30 feet with whom they share a language in common.
* ''Strange Anatomy:'' Early stage barathus gain a +1 racial bonus to Fortitude saving throws.
!!! Alternate Racial Traits
* ''Collective Connection:'' Barathus born from a collective of merged adults sometimes glean fragments of memories from that collective. These barathus receive a +2 racial bonus to checks to [[recall knowledge]]. This ability replaces strange anatomy.
* ''Fluid Self:'' The species' unique sense of self makes barathus difficult to affect mentally, an ability particularly common among newly budded barathus and those who have recently split from a collective. A barathu with this trait gains a +2 racial bonus to saving throws against mind-affecting effects. This ability replaces strange anatomy.
* ''Internal Chemistry:'' Although all barathus have a certain innate understanding of biochemistry, others have refined it into an art form, turning their bodies into living chemical factories. A barathu with internal chemistry gains the following options instead of the typical options available for the early stage adaptation ability. This modifies early stage adaptation.
** Spraying acid is a simple chemistry exercise. The barathu gains an acid spray ranged natural attack that deals 1d3 acid damage with a 30-foot range increment. A PC using this ability is considered armed and gains a unique [[Weapon Specialization]] with this attack at 3rd level, allowing them to add 1-1/2 × their character level to their damage rolls with this attack. The acid spray cannot be disarmed or sundered and doesn't require ammunition.
** The barathu secretes a frictionless slime. When the barathu uses early stage adaptation to gain this ability, they can immediately attempt to use [[Acrobatics]] to escape a grapple without spending another action.
** Lighter-than-air gases increase the barathu's fly speed by 15 feet.
** Soothing psychoactive chemicals grant the barathu a new saving throw against each ongoing mind-affecting effect that is affecting them.
** A cloud of fumes spreads over a 20-foot radius from the barathu, affecting the area as a [[smoke grenade]]. Barathus are immune to the choking effects of this cloud.
* ''Mineral Exoskeleton:'' Some barathus, especially those who explore beyond Bretheda and Liavara, modify themselves by building shells out of mineral deposits. A barathu with a mineral exoskeleton gains these options instead of the typical options available for the early stage adaptation ability. This modifies early stage adaptation.
** Added reinforcement to their external shell grants the barathu [[DR]] 1/–.
** Dangerous growths function as a natural weapon that deals 1d3 bludgeoning, piercing, or slashing damage. A barathu PC using this ability is armed, and this attack cannot be disarmed or sundered. If a barathu PC using this ability is at least 3rd level, they gain a unique [[Weapon Specialization]] with these natural weapons, allowing them to add 1-1/2 × their character level to damage rolls with this attack.
** Spikes grow from fleshy surfaces, dealing 1d6 piercing damage to each creature that hits the barathu with an unarmed or natural attack.
** Reinforced tentacles function as powerful but slow limbs, granting a burrow speed and land speed of 10 feet.
** The area covered by the barathu's shell expands, granting a +2 racial bonus to AC but reducing the barathu's flight speed to 0.
* ''Student of Liavara:'' Barathus respect and protect the Dreamers of Liavara, but few modify themselves to follow the Dreamers' path. Those who do gain a hint of the Dreamers' telepathic powers but forever lose the ability to modify themselves further. A barathu who selects this alternate racial trait cannot retrain it as it can others. This replaces early stage adaptation. You gain the following spell-like abilities.
** At will: //[[daze]]//, //[[telepathic message]]//
** 1/day: //[[mind link]]//, //[[mind thrust]]// (1st level)
!! Early Stage Adaptation Graft
{{Early Stage Adaptation}}
<div class="statblock">
* ''Level'' 13; ''Price'' 51,500
* ''EAC Bonus'' +16; ''KAC Bonus'' +22
* ''Max Dex Bonus'' +3; ''Armor Check Penalty'' –4; ''Speed'' 25 ft., fly 30 ft. (average)
* ''Strength'' 26 (+8); ''Damage'' 2d6 B
* ''Weapon Slots'' 2; ''Upgrade Slots'' 3
* ''Capacity'' 20; ''Usage'' 1/hour
* ''Size'' Large (10-ft. reach); ''Bulk'' 12
</div>
As bulbous and malleable as the barathus of Bretheda, this powered armor features a semirigid frame around gas chambers that provide protection and buoyancy. Barathus don’t think the blimp-like powered armor resembles one of their kind, but most accept the name in their typical easygoing fashion. Virtually any kind of creature can wear barathu battens, as the interior accommodates a variety of body types.
This cruel grenade propels exceptionally jagged shrapnel, causing lasting pain. Affected creatures that fail their Reflex saves against this grenade take the listed damage; as long as they take any damage from the grenade, the shrapnel also impedes them per the [[embed]] weapon critical hit effect. Both these grenades' sadistic effects and their common use by slavers to immobilize victims have resulted in wide-scale bans on these weapons, though more lawless regions rarely regulate the explosives.
<div class= "table-wrapper">
|Weapon | Level | Price | Range | Capacity | Bulk |Special |h
|barbed shrapnel grenade I | 3 | 225 | 20 ft. | drawn | L |[[explode]] (1d6 P, [[embed]] 1d6, 10 ft.) |
|barbed shrapnel grenade II | 6 | 580 | 20 ft. | drawn | L |[[explode]] (2d6 P, [[embed]] 1d6, 10 ft.) |
|barbed shrapnel grenade III | 10 | 2,500 | 20 ft. | drawn | L |[[explode]] (3d6 P, [[embed]] 2d6, 10 ft.) |
|barbed shrapnel grenade IV | 15 | 14,250 | 20 ft. | drawn | L |[[explode]] (7d6 P, [[embed]] 3d6, 10 ft.) |
</div>
<div class="statblock">
* ''CR'' 4; ''XP'' 1,200
* LE Medium outsider (evil, extraplanar, lawful, shapechanger)
* ''Init'' +6; ''Senses'' [[blindsense]] (scent) 30 ft., [[darkvision]] 60 ft.; ''Perception'' +10
!!! DEFENSE
* ''HP'' 50
* ''EAC'' 16; ''KAC'' 18
* ''Fort'' +6; ''Ref'' +6; ''Will'' +5
* ''DR'' 5/magic
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' bite +13 (1d6+8 P) or claw +13 (1d4+8 S; critical [[bleed]] 1d4)
* ''Ranged'' azimuth [[laser pistol]] +11 (1d4+4 F; critical [[burn]] 1d4)
* ''Offensive Abilities'' feed
* ''Spell-Like Abilities'' (CL 4th)
** 1/day—//[[charm monster]]// (DC 14), //[[dimension door]]// (self only), //[[fear]]// (2nd level, DC 13)
** At will—//[[flight]]// (2nd level), //[[nondetection]]//
!!! STATISTICS
* ''Str'' +4; ''Dex'' +2; ''Con'' +2; ''Int'' +2; ''Wis'' +2; ''Cha'' +2
* ''Skills'' [[Bluff]] +10, [[Intimidate]] +10, [[Sense Motive]] +10, [[Stealth]] +10
* ''Languages'' Abyssal, Common, Goblin, Infernal
* ''Other Abilities'' change shape (goblinoid or wolf)
* ''Gear'' basic [[lashunta tempweave]], azimuth [[laser pistol]] with 2 batteries (20 charges each)
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or cult (1 plus [[space goblin]] tribe)
!!! SPECIAL ABILITIES
''Change Shape ([[Su]])'' Each barghest has only one specific goblinoid form and one specific wolf form.
''Feed ([[Su]])'' A barghest can devour a nonevil humanoid's corpse as a full-round action. Once per month, if the creature consumed is of a level or CR no more than 2 lower than the barghest's, the barghest gains a growth point. When the barghest gains 2 growth points, its CR increases by 1, with commensurate changes to its statistics. Barghests that increase their CR sometimes gain additional spell-like abilities, changing into what is known as a greater barghest at CR 7.
</div>
Barghests are lupine outsiders that exist to spread fear and feed upon humanoid heroes. Cunning and disciplined but utterly self-centered hunters, barghests shun chaos. However, legend says the goddess of monsters, Lamashtu, freed the first barghests from the kennels of Hell. The greatest among them still live in a section of the Abyss they claim as their territory. Goblin belief holds that the strongest of these barghests helped create goblinkind in time immemorial. Evil goblins, therefore, revere barghests as wicked hero-gods.
These fiends hunt and kill good-hearted humanoids to feed on the spiritual energy left within the corpses of such foes. Although a barghest might slay the innocent or weak, and even eat such prey, it gains the growth-inducing nourishment it seeks only from worthy opponents. Barghests commit atrocities to attract the attention of such would-be champions before murdering and devouring them, growing in size, magical power, and social standing with each success.
Masters of deception, barghests can transform into goblinoids or wolves at will. They use such forms to remain beneath notice to travel incognito or until ready to pounce. A typical barghest is 6 feet long and weighs 200 pounds. When it gains power, a barghest also gains size. The mightiest among them are twice the size of their lesser kin.
The starship moves up to half its speed and flips along its central axis. For the next gunnery phase, the starship's port shields and weapons function as if they were in the starboard firing arc and vice versa. The starship reverts to normal at the beginning of the next round. To perform this stunt, your starship must be Large or smaller and you must succeed at a [[Piloting]] check (DC = 10 + 1-1/2 times your starship's tier). On a failed check, the starship moves half its speed but doesn't roll. If you fail by 5 or more, your starship moves half its speed, doesn't roll, and takes a –4 penalty to its AC and TL until the start of the next round.
Your drone gains the [[Barricade]] feat. Your drone must have [[Engineering]] as a class skill and [[manipulator arms]] for you to select this mod.
You are adept at creating quick, temporary cover.
''Prerequisites:'' [[Engineering]] 1 rank.
''Benefit:'' As a move action, you can stack and reinforce objects that are too small or too fragile to provide cover into a single square of adjacent cover. The GM has discretion over whether enough such objects are nearby to allow you to use this ability, but most urban and wilderness settings not specifically described as empty or barren have enough such material to allow at least one such temporary barricade to be built. The barricade grants partial cover against attacks with line of effect that pass through it. If the barricade is in a square that already granted partial cover, it instead grants normal cover.
The barricade is temporary and not particularly durable. When determining its hardness and Hit Points, treat it as a piece of equipment with an item level equal to half your total ranks in Engineering (minimum 1st level). Additionally, once it or a creature adjacent to it is hit by an attack, the barricade collapses at the beginning of your turn in 1d4 rounds (unless the barricade is destroyed completely by the attack). There isn't normally enough material for you to build a second barricade in exactly the same space unless you are in a particularly crowded area.
When you use the [[subdue boarding party]] open crew action, you increase your starship's Boarding Resistance by 2 for the purpose of determining how many of one boarding party you disable if the boarding party fails its boarding attack check.
A scaled-up version of the [[shield projector]], a barrier cannon blankets an area with deflective force, granting a short-lived force field to creatures within. These cannons are designed for officers in shock-trooper squads to shield their personnel from danger.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|barrier cannon, sentry | 6 | 4,300 | — | 15 ft. | — | 40 charges | 8 | 3 |[[blast]], [[shield]] 1d12, [[unwieldy]] |
|barrier cannon, defender | 10 | 18,500 | — | 15 ft. | — | 80 charges | 16 | 3 |[[blast]], [[shield]] 2d10, [[unwieldy]] |
|barrier cannon, guardian | 14 | 72,000 | — | 20 ft. | — | 80 charges | 16 | 3 |[[blast]], [[shield]] 3d12, [[unwieldy]] |
|barrier cannon, warden | 18 | 368,000 | — | 20 ft. | — | 100 charges | 25 | 3 |[[blast]], [[shield]] 5d12, [[unwieldy]] |
</div>
<div class="statblock">
* ''CR'' 1/3; ''XP'' 135
* N Diminutive vermin
* ''Init'' +1; ''Senses'' [[blindsense]] (vibration) 30 ft., [[darkvision]] 60 ft.; ''Perception'' +3
!!! DEFENSE
* ''HP'' 6
* ''EAC'' 10; ''KAC'' 12
* ''Fort'' +3; ''Ref'' +1; ''Will'' +0
* ''DR'' 5/—
!!! OFFENSE
* ''Speed'' 20 ft., burrow 5 ft., climb 20 ft.
* ''Melee'' bite +4 (1d6 P)
* ''Space'' 1 ft.; ''Reach'' 0 ft.
* ''Offensive Abilities'' scuttle
!!! STATISTICS
* ''Str'' +0; ''Dex'' +3; ''Con'' +1; ''Int'' —; ''Wis'' +0; ''Cha'' –3
* ''Skills'' [[Acrobatics]] +3, [[Athletics]] +3 (+11 to climb), [[Stealth]] +7
* ''Other Abilities'' [[mindless]]
!!! ECOLOGY
* ''Environment'' any (urban)
* ''Organization'' infestation (6–20) or swarm (21–100)
!!! SPECIAL ABILITIES
''Scuttle ([[Ex]])'' As a full action, a barro can move up to twice its speed, passing through a single enemy's square and making a melee attack against that enemy. When it does so, it attempts an [[Acrobatics]] check with a +8 racial bonus (DC = 20 + the CR or level of the enemy whose square it passes through). On a success, the targeted enemy can't make an attack of opportunity against the barro.
</div>
The nocturnal, wingless barros have six legs, two antennae, and two large compound eyes that protrude from their small heads. Barros are scavenging omnivores and can be found anywhere, but they favor dirty urban environments due to the abundance of food to scavenge and dark places to lay their eggs.
The presence of a single barro implies the existence of several, possibly even dozens, more lurking in walls and under floors. They can be hard to spot and harder to exterminate due to their tough exoskeletons and their preference to hide from larger creatures rather than attack them. However, under certain circumstances, barros have been known to attack in small groups or even to swarm. Such swarms can appear in devastated and abandoned urban areas, especially in places where food and bodies have been left to rot.
Female barros lay clutches of eggs in small, obscure spaces where the young can flourish in secret, such as cracks in a building's foundation or a corner of a little-used cabinet; some barros might choose the toe of a boot in a closet or a hard-to-reach pouch. Eggs hatch in less than a day, and the young feast on any particles of nourishment they can find. They reach maturity after another day. Over the course of a barro's short life span (no more than a year), females can lay six to eight clutches of eggs.
<div class="statblock">
* ''Tier'' 1/3
* Tiny racer
* ''Speed'' 14; ''Maneuverability'' perfect (turn 0)
* ''AC'' 16; ''TL'' 13
* ''HP'' 20; ''DT'' –; ''CT'' 4
* ''Shields'' none
* ''Attack (Forward)'' flak thrower (3d4)
* ''Attack (Aft)'' flak thrower (3d4)
* ''Power Core'' Micron Heavy (70 PCU); ''Drift Engine'' none
* ''Systems'' basic computer, budget short-range sensors, mk 3 armor
* ''Complement'' 1
!!! CREW
* ''Pilot'' gunnery +4, [[Piloting]] +10 (1 rank)
</div>
The Corpse Fleet launches waves of Barrow Boneshards to harry its foes. Typically, each Barrow Boneshard is piloted by one heavily damaged undead creature, perhaps missing its lower half or most of its limbs. Such pilots are wired directly into the controls and considered to be prime candidates for suicide missions.
<div class="statblock">
* ''Tier'' 8
* Huge bulk freighter
* ''Speed'' 6; ''Maneuverability'' poor (turn 3); ''Drift'' 1
* ''AC'' 21; ''TL'' 20
* ''HP'' 200; ''DT'' 5; ''CT'' 40
* ''Shields'' medium 100 (forward 25, port 25, starboard 25, aft 25)
* ''Attack (Forward)'' heavy laser cannon (4d8)
* ''Attack (Aft)'' heavy laser cannon (4d8)
* ''Attack (Turret)'' light carrion-missile launcher (3d6), light EMP cannon (special)
* ''Power Core'' Nova Ultra (300 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic medium-range sensors, [[crew quarters]] (basic), mk 5 armor, mk 5 defenses, mk 2 duonode computer; ''Expansion Bays'' [[cargo holds]] (4), [[passenger seating]] (4), [[shuttle bay]]
* ''Modifiers'' +2 to any 2 checks per round, +2 [[Computers]]
* ''Complement'' 40
!!! CREW
* ''Captain (1 officer, 2 crew)'' [[Diplomacy]] +16 (8 ranks), gunnery +12, [[Intimidate]] +16 (8 ranks), [[Piloting]] +16 (8 ranks)
* ''Engineers (2 officers, 7 crew each)'' [[Engineering]] +16 (8 ranks)
* ''Gunners (2 officers, 5 crew each)'' gunnery +12
* ''Pilot (1 officer, 2 crew)'' gunnery +12, [[Piloting]] +21 (8 ranks)
* ''Science Officers (2 officers, 2 crew each)'' [[Computers]] +18 (8 ranks)
</div>
Each Barrow Catacomb can hold two [[Grave Casket]] shuttles and a couple land vehicles that can survive atmospheric entry to launch planetside assaults on targets Corpse Fleet command wants destroyed.
<div class="statblock">
* ''Tier'' 16
* Colossal dreadnought
* ''Speed'' 4; ''Maneuverability'' clumsy (turn 4); ''Drift'' 1
* ''AC'' 25; ''TL'' 24
* ''HP'' 600; ''DT'' 15; ''CT'' 120
* ''Shields'' heavy 240 (forward 60, port 60, starboard 60, aft 60)
* ''Attack (Forward)'' particle beam (8d6), super negative-energy cannon (2d10×10)
* ''Attack (Port)'' heavy laser cannon (4d8), super plasma cannon (3d6×10)
* ''Attack (Starboard)'' heavy laser cannon (4d8), super plasma cannon (3d6×10)
* ''Attack (Turret)'' micromissile battery (2d6), micromissile battery (2d6)
* ''Power Core'' Gateway Ultra (500 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic computer, advanced long-range sensors, [[crew quarters]] (common), mk 7 armor, mk 7 defenses; ''Expansion Bays'' [[cargo holds]] (8), [[hangar bay]], [[passenger seating]] (6), [[shuttle bay]]
* ''Modifiers'' +4 [[Computers]]
* ''Complement'' 260
!!! CREW
* ''Captain (1 officer, 9 crew)'' [[Diplomacy]] +28 (16 ranks), gunnery +18, [[Intimidate]] +33 (16 ranks), [[Piloting]] +28 (16 ranks)
* ''Engineers (3 officers, 35 crew each)'' [[Engineering]] +28 (16 ranks)
* ''Gunners (4 officers, 20 crew each)'' gunnery +20
* ''Pilot (1 officer, 9 crew)'' gunnery +20, [[Piloting]] +28 (16 ranks)
* ''Science Officers (3 officers, 15 crew each)'' [[Computers]] +32 (16 ranks)
</div>
An impressive feat of necro-engineering, the Barrow Cenotaph is a machine of destruction, inside and out. Featuring bays for two sets of other vessels plus room to hold dozens of troops, this dreadnought sports some of the Corpse Fleet's most devastating weaponry. It is a lumbering vessel, but it can take more punishment than most starships manufactured in the Pact Worlds and beyond.
<div class="statblock">
* ''Tier'' 2
* Small light freighter
* ''Speed'' 8; ''Maneuverability'' good (turn 1); ''Drift'' 1
* ''AC'' 16; ''TL'' 15
* ''HP'' 40; ''DT'' –; ''CT'' 8
* ''Shields'' basic 40 (forward 10, port 10, starboard 10, aft 10)
* ''Attack (Forward)'' coilgun (4d4), light EMP cannon (special)
* ''Attack (Port)'' gyrolaser (1d8)
* ''Attack (Starboard)'' gyrolaser (1d8)
* ''Power Core'' Pulse Black (120 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' advanced medium-range sensors, basic computer, [[crew quarters]] (common), mk 3 armor, mk 2 defenses; ''Expansion Bays'' [[cargo bays]] (2), [[corpse recycler]]
* ''Modifiers'' +4 [[Computers]], +1 [[Piloting]]
* ''Complement'' 5
!!! CREW
* ''Captain'' gunnery +4, [[Intimidate]] +7 (2 ranks), [[Piloting]] +8 (2 ranks)
* ''Engineer'' Engineering +8 (2 ranks)
* ''Gunner'' gunnery +5
* ''Pilot'' gunnery+5, [[Piloting]] +13 (2 ranks)
* ''Science Officer'' [[Computers]] +11 (2 ranks)
</div>
Dirgesingers form the backbone of the Corpse Fleet's corpse collection efforts. Their crews search the galaxy for derelict vessels, fresh battlefields, and unlucky colonies where corpses can be found. These bodies are either turned into undead creatures or fashioned into necrografts. Every so often, a bloodthirsty Barrow Dirgesinger crew engages in battle to create the cadavers they seek.
<div class="statblock">
* ''Tier'' 12
* Gargantuan carrier
* ''Speed'' 4; ''Maneuverability'' poor (turn 3); ''Drift'' 1
* ''AC'' 24; ''TL'' 22
* ''HP'' 330; ''DT'' 10; ''CT'' 66
* ''Shields'' medium 160 (forward 40, port 40, starboard 40, aft 40)
* ''Attack (Forward)'' supermaser (2d8×10)
* ''Attack (Port)'' heavy laser array (6d4)
* ''Attack (Starboard)'' heavy laser array (6d4)
* ''Attack (Turret)'' linked light particle beams (6d6)
* ''Power Core'' Gateway Light (300 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic medium-range sensors, [[crew quarters]] (common), mk 6 armor, mk 5 defenses, mk 1 trinode computer; ''Expansion Bays'' [[cargo holds]] (6), [[hangar bay]]
* ''Modifiers'' +1 to any 3 checks per round, +2 [[Computers]], +1 [[Piloting]]
* ''Complement'' 144
!!! CREW
* ''Captain (1 officer, 5 crew)'' [[Diplomacy]] +22 (12 ranks), gunnery +14, ''Intimidate'' +27 (12 ranks), ''Piloting'' +23 (12 ranks)
* ''Engineers (2 officers, 30 crew each)'' [[Engineering]] +22 (12 ranks)
* ''Gunners (3 officers, 15 crew each)'' gunnery +16
* ''Pilot (1 officer, 5 crew)'' gunnery +16, [[Piloting]] +23 (12 ranks)
* ''Science Officers (2 officers, 10 crew each)'' [[Computers]] +24 (12 ranks)
</div>
A Barrow Eulogy can bring eight [[Necrofighters]] into battle, but it has enough firepower to defend itself if enemies threaten. Its port and starboard heavy laser arrays keep smaller craft from attacking its flanks while it launches its fighters.
<div class="statblock">
* ''Tier'' 10
* Huge cruiser
* ''Speed'' 8; ''Maneuverability'' average (turn 2); ''Drift'' 1
* ''AC'' 24; ''TL'' 23
* ''HP'' 230; ''DT'' 5; ''CT'' 46
* ''Shields'' medium 140 (forward 35, port 35, starboard 35, aft 35)
* ''Attack (Forward)'' mass driver (2d6×10)
* ''Attack (Port)'' light plasma cannon (2d12)
* ''Attack (Starboard)'' light plasma cannon (2d12)
* ''Attack (Turret)'' negative-energy cannon (5d8)
* ''Power Core'' Gateway Light (300 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic medium-range sensors, [[crew quarters]] (common), mk 6 armor, mk 6 defenses, mk 2 duonode computer; ''Expansion Bays'' [[cargo holds]] (4), [[synthesis bay]], [[tech workshop]]
* ''Modifiers'' +2 to any 2 checks per round, +2 [[Computers]]
* ''Complement'' 80
!!! CREW
* ''Captain (1 officer, 4 crew)'' [[Diplomacy]] +19 (10 ranks), gunnery +12, [[Intimidate]] +19 (10 ranks), [[Piloting]] +19 (10 ranks)
* ''Engineers (3 officers, 10 crew each)'' [[Engineering]] +19 (10 ranks)
* ''Gunners (3 officers, 6 crew each)'' gunnery +14
* ''Pilot (1 officer, 4 crew)'' gunnery +14, [[Piloting]] +24 (10 ranks)
* ''Science Officers (2 officers, 7 crew each)'' [[Computers]] +21 (10 ranks)
</div>
Barrow Reapers, while massive, are also surprisingly fast and maneuverable for their size. Barrow Reapers often act as escorts for Corpse Fleet capital ships, but their hardy crews make effective boarding parties or ground troops, as well.
<div class="statblock">
* ''Tier'' 5
* Medium explorer
* ''Speed'' 8; ''Maneuverability'' good (turn 1); ''Drift'' 2
* ''AC'' 19; ''TL'' 18
* ''HP'' 65; ''DT'' –; ''CT'' 13
* ''Shields'' light 60 (forward 15, port 15, starboard 15, aft 15)
* ''Attack (Forward)'' light plasma torpedo launcher (3d8)
* ''Attack (Port)'' light particle beam (3d6)
* ''Attack (Starboard)'' light particle beam (3d6)
* ''Attack (Turret)'' light plasma cannon (5d10)
* ''Power Core'' Pulse Green (150 PCU); ''Drift Engine'' Signal Booster
* ''Systems'' basic medium-range sensors, [[crew quarters]] (common), mk 4 armor, mk 3 defenses, mk 2 trinode computer; ''Expansion Bays'' [[arcane laboratory]], [[cargo holds]] (2), [[guest quarters]] (good)
* ''Modifiers'' +2 to any 3 checks per round, +2 [[Computers]], +1 [[Piloting]]
* ''Complement'' 6
!!! CREW
* ''Captain'' [[Computers]] +13 (5 ranks), [[Diplomacy]] +11 (5 ranks), [[Intimidate]] +11 (5 ranks)
* ''Engineer'' [[Engineering]] +11 (5 ranks)
* ''Gunners (2)'' gunnery +9
* ''Pilot'' gunnery +9, [[Piloting]] +12 (5 ranks)
* ''Science Officer'' [[Computers]] +18 (5 ranks)
</div>
The crews of Barrow Reliquaries are among the most diplomatic and educated of all Corpse Fleet soldiers. Although the navy fields only a handful of these vessels, their crews are tasked with exploring the Vast in search of necromantic objects and alien undead creatures whose goals align with those of the Corpse Fleet. Some of these new allies are transported back to Corpse Fleet holdings in order to coordinate plans with the navy's high-ranking officials.
<div class="statblock">
* ''Tier'' 7
* Large destroyer
* ''Speed'' 8; ''Maneuverability'' average (turn 2); ''Drift'' 1
* ''AC'' 19; ''TL'' 20
* ''HP'' 170; ''DT'' –; ''CT'' 34
* ''Shields'' light 80 (forward 20, port 20, starboard 20, aft 20)
* ''Attack (Forward)'' heavy torpedo launcher (5d8), negative-energy cannon (5d8)
* ''Attack (Port)'' coilgun (4d4)
* ''Attack (Starboard)'' coilgun (4d4)
* ''Attack (Aft)'' coilgun (4d4)
* ''Attack (Turret)'' negative-energy gun (2d6)
* ''Power Core'' Pulse Orange (250 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic medium-range sensors, [[crew quarters]] (common), mk 3 armor, mk 4 defenses, mk 2 trinode computer; ''Expansion Bays'' [[arcane mortuary]], [[cargo holds]] (2), [[ghost drive]]
* ''Modifiers'' +2 any 3 checks per round, +2 [[Computers]]
* ''Complement'' 9
!!! CREW
* ''Captain'' [[Computers]] +16 (7 ranks), gunnery +11, [[Intimidate]] +14 (7 ranks)
* ''Engineers (2)'' [[Engineering]] +19 (7 ranks)
* ''Gunners (3)'' gunnery +11
* ''Pilot'' gunnery +11, [[Piloting]] +14 (7 ranks)
* ''Science Officers (2)'' [[Computers]] +16 (7 ranks)
</div>
A Barrow Spectre is a silent assassin of space, quickly moving into engagements, tearing through foes, and disappearing into the void. Due to the frequent use of ghost drives by Barrow Spectre crews, those who have survived encounters with these vessels often babble about ethereal starships that can't be shot.
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Classes' 'nsort[level]'>>
</div>
A fleet's class establishes what types of starships comprise it, as well as its base statistics.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
<$list filter="[list[$:/StoryList]is[current]]" >
Each starship has a base frame that determines its size, maneuverability, starting weapon mounts, hull strength, room for expansion, and other capacities. Although two ships that use the same frame might look radically different, they both have some of these base statistics in common. The frame of a starship includes all life support and artificial gravity systems necessary to keep the crew (and any passengers) alive and comfortable. The starship's frame is also built with a transponder that is essentially the ship's "address" for standard system-wide and unlimited-range communications (see page 430); this transponder can be turned off, during which time the starship can't send or receive messages, but neither can it be tracked down by conventional means.
<div class="table-wrapper">
|Size | Length | Weight | AC and TL Modifier |h
|Tiny | 20–60 ft. | 2–40 tons | +2 |
|Small | 60–120 ft. | 30–250 tons | +1 |
|Medium | 120–300 ft. | 50–2,500 tons | +0 |
|Large | 300–800 ft. | 2,000–50,000 tons | –1 |
|Huge | 800–2,000 ft. | 40,000–640,000 tons | –2 |
|Gargantuan | 2,000–15,000 ft. | 600,000 tons to 250 megatons | –4 |
|Colossal | Over 15,000 ft. | 200–2,000 megatons | –8 |
</div>
The base frames below are organized by size (from smallest to largest) and cost in Build Points (with less expensive frames coming first within a size). In general, the size and expansion bay capacities of a base frame can't be changed without a great deal of time and money (and the GM's permission), so it can be more effective to just start over with a different base frame when upgrading those aspects of a starship.
</$list>
<<list-links "[tag[Base Frames]list[Base Frames]]" class:index >>
!!! Exotic Base Frames
<<list-links "[tag[Base Frames]!list[Base Frames]]" class:index >>
<div class="statblock">
* ''Size'' Supercolossal
* ''Maneuverability'' clumsy (–2 [[Piloting]], turn 4)
* ''HP'' 450 (increment 75); DT 15; CT 90
* ''Mounts'' forward arc (4 heavy), port arc (4 heavy), starboard arc (4 heavy), turret (2 capital)
* ''Expansion Bays'' unlimited
* ''Minimum Crew'' 150; ''Maximum Crew'' 100,000
* ''Cost'' 250
</div>
<div class="statblock">
* ''Hit Point Advancement'' +0; ''EAC'' +1; ''KAC'' +1
* ''Upper Limb Slots'' 2; ''Melee Attack'' +0; ''Ranged Attack'' +0
* ''Cost'' 0
</div>
These arms can wield weapons but provide few other benefits.
<div class="statblock">
* ''Level'' 1; ''Price'' 700
* Large land vehicle (5 ft. wide, 10 ft. long, 3 ft. high)
* ''Speed'' 20 ft., full 200 ft., 22 mph
* ''EAC'' 10; ''KAC'' 12; ''Cover'' none
* ''HP'' 7 (3); ''Hardness'' 5
* ''Attack (Collision)'' 2d4 B (DC 8)
* ''Modifiers'' +2 [[Piloting]], –1 attack (–3 at full speed)
* ''Passengers'' 1
</div>
The simplest //gimmick// merely personalizes your magic, giving spells channeled through the //gimmick// a sensory theme you choose while attuning it (such as gambling to make //[[magic missiles]]// look like flaming cards or make your //[[augury]]// result manifest like reels on a holographic slot machine). These sensory extras don’t otherwise change the spell’s effects.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//basic gimmick// | 1 | 175 | L |
</div>
You know how to use basic melee weapons.
''Benefit:'' You gain proficiency in basic melee weapons.
''Normal:'' If you use a weapon with which you are not proficient, you take a –4 penalty to attack rolls with that weapon, and the DC for any saving throws against that weapon's special effects likewise takes a –4 penalty.
Any handheld weapon that must touch a target to deal damage is considered a melee weapon. Basic melee weapons can be easily used by almost anyone and generally require no special training. While basic melee weapons deal less damage than more sophisticated weapons of the same item level, they have the advantage of not usually requiring power sources and operating under almost any conditions. Basic melee weapons are divided into one-handed and two-handed weapons.
You can choose any of the mods on the basic mod list whenever your drone gains a new mod. Unless otherwise specified, you cannot install a single mod more than once.
<<list-links "[tag[Drone Mods]tag[Basic]sort[title]]">>
A baton is a thin, solid metal shaft, usually with a textured rubber grip. A tactical baton can be used to inflict precise bludgeoning blows. An advanced baton, used by elite mercenary and security companies, often has an additional shaft, as well as a weighted end that can be powered to connect with substantially more force than a tactical baton.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|baton, tactical | 1 | 90 | 1d4 B | — | L |[[analog]], [[operative]], [[thrown]] (20 ft.) |
|baton, advanced | 19 | 540,000 | 8d6 B | — | L |[[operative]], [[powered]] (capacity 20, usage 1), [[thrown]] (20 ft.) |
</div>
Batteries charge powered weapons, but they can also be used to power an array of items, including powered armor and technological items. Batteries have a standardized size and weight, and items that take batteries all have a slot into which they fit, regardless of the item's actual size. Weapons that use batteries list the highest-capacity battery they are capable of using as well as how many charges from the battery that each shot consumes.
<div class="table-wrapper">
|Ammunition | Level | Price | Charges/Cartridges | Bulk |h
|battery | 1 | 60 | 20 | — |
|battery, high-capacity | 4 | 330 | 40 | — |
|battery, super-capacity | 4 | 390 | 80 | — |
|battery, ultra-capacity | 5 | 445 | 100 | L |
</div>
This upgrade, usually installed on the chest or back of the armor, has a compartment capable of storing any one battery. Power cables run from the battery slot to the palms of your hands. As a full action, you can install a battery in the compartment or remove a battery from it. When you attack with a [[powered]] weapon or use a technological item you are holding in your hand, you can expend charges from the battery stored in the upgrade rather than the weapon or item's own battery, provided that the item is capable of using a battery of that capacity.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|battery unit | 9 | 12,000 | 1 | any | L |
</div>
<div class="statblock">
* ''Level'' 1; ''Price'' 400
* Large land vehicle (5 ft. wide, 10 ft. long, 4 ft. high)
* ''Speed'' [[drawn]]
* ''EAC'' 10; ''KAC'' 12; ''Cover'' partial cover
* ''HP'' 20 (10); ''Hardness'' 4
* ''Attack (Collision)'' 4d4 B (DC 10)
* ''Modifiers'' –1 [[Survival]], –1 attack (–2 at full speed)
* ''Systems'' autocontrol
* ''Passengers'' 1
</div>
Though they rarely see combat on modern battlefields, wheeled chariots still make ceremonial appearances in military parades.
<div class= "statblock">
* ''Prerequisite'' Can be applied only to a core with a rate greater than 1.
* ''Rate'' –1; ''Initial'' +0; ''Maximum'' +1
* ''Special'' Once per turn when the mech defeats or scores a critical hit against a significant enemy, the power core's rate increases by 2 until the beginning of its next turn. If the mech scores a critical hit that defeats a significant enemy, the rate instead increases by 3 until the beginning of the mech's next turn.
* ''Cost'' 1/2 × tier
</div>
This template, blessed by priests of Damoritosh, takes the Conqueror's divine favor and converts it into mechanical adrenaline.
<div class="statblock">
* ''Level'' 5; ''Price'' 3,450
* ''EAC Bonus'' +9; ''KAC Bonus'' +12
* ''Max Dex Bonus'' +2; ''Armor Check Penalty'' –4; ''Speed'' 30 ft.
* ''Strength'' 18 (+4); ''Damage'' 1d10 B
* ''Weapon Slots'' 1; ''Upgrade Slots'' 1
* ''Capacity'' 20; ''Usage'' 1/hour
* ''Size'' Medium; ''Bulk'' 20
</div>
The battle harness is the basic powered armor frame used by infantry units in professional militaries.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 round
* ''Range'' touch
* ''Targets'' at least 1 bulk of inert electronic equipment; see text
* ''Duration'' 1 round/level
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You turn a pile of technological junk into a vicious robot that can hunt down and attack your enemies.
You must target inert, nonworking electronic equipment of at least 1 bulk. Valid targets include a large broken computer system, nonworking or unconnected computer or robot parts, a destroyed robot or another such trashed mechanical system, or any related electronic components or combination of the above as long as the junk is found in a large enough quantity. Creating a //battle junkbot// also requires one ultra-capacity battery. Casting this spell drains all of the battery's charges.
While casting this spell, you use your magic and technological know-how to rearrange the junked parts and infuse them with aggression and martial skills. A battle junkbot is Small, its KAC and EAC are each equal to 15 + your technomancer level, it has hardness 15, and it has a number of Hit Points equal to half of your own (but no Stamina Points). It uses your saving throw bonuses when it is the target of spells and other targeted effects. It has a land speed of 30 feet and a fly speed of 15 feet with average maneuverability. For purposes of spells and effects that target the junkbot, it is treated as a construct with the magical and technological subtypes.
The //battle junkbot// has four hands. It is treated as if it had the [[Deadly Aim]] and [[Improved Combat Maneuver]] (bull rush, grapple, trip) feats. It has an attack bonus equal to 6 + your technomancer level; in one hand it wields a special buzzblade dagger that deals 6d8+6 damage instead of its normal damage, and a second hand carries a special light laser pistol that deals 6d6 damage instead of its normal damage. Damage from the junkbot's special weapons counts as magic for the purpose of overcoming [[damage reduction]].
You can give new basic commands to your //battle junkbot// telepathically on your turn as a move action, and the junkbot can take actions as if it were a normal creature. You are aware
when the robot has made an attack or combat maneuver and whether or not it was successful, as well as when the //battle junkbot// has been attacked, has taken damage, or is destroyed, but you can perceive nothing else through this basic telepathic link.
When the //battle junkbot// is destroyed or this spell ends, the electronic equipment you used to create the junkbot falls apart into refuse, its circuitry fried beyond anything recognizable. You cannot use this refuse as a target to create another junkbot.
Followers of a tradition that originated in the Veskarium among devout followers of Damoritosh, battle leaders are known for celebrating victories as they happen, yelling out to their allies when an enemy suffers a critical or lethal blow and inspiring further glorious actions. This tradition has since spread throughout other star systems, and many species, from calculating Eoxians in the Pact Worlds to bellicose hobgoblins from the Gideron Authority can be counted among their numbers.
The battle leader archetype has alternate class features at 2nd and 12th levels, and an optional alternate class feature that can be selected at any of 4th, 6th, 9th, and 18th levels.
!! Victory Cry (2nd)
You have learned how to capitalize on your allies' successes in battle, inspiring them to further incredible feats. You learn one victory cry, chosen from those listed below. As a reaction when you or an ally scores a critical hit against a significant enemy with an attack or drops a significant enemy to 0 Hit Points, you can issue a victory cry, choosing one victory cry you know and providing its benefits to all allies within 60 feet of you (but not yourself).
The following victory cries are available to battle leaders. Each victory cry can be learned up to two times: the first time at 2nd level or higher, and the second time at 9th level or higher. Limited victory cries affect only the ally that scored a critical hit or reduced an enemy to 0 Hit Points; these are labeled with an asterisk (*). An ally can be affected by each specific victory cry (regardless of its source) only once until they take a 10-minute rest to regain Stamina Points.
!!! Got 'Em!
Each ally affected by this victory cry gains a morale bonus to damage rolls until the end of their next turn equal to half your Charisma bonus (minimum 1). If you learn this victory cry a second time, the morale bonus is instead equal to your Charisma bonus.
!!! Keep Moving!
All creatures affected by this victory cry gain a +10-foot morale bonus to their speed for one round. If you learn this victory cry a second time, this becomes a +20-foot morale bonus to speed instead.
!!! Listen Up!
Each creature affected by this victory cry chooses either saving throws or skill checks, and each such creature can choose differently. Until the end of their next turn, each such creature gains a +1 morale bonus to the selected option. If you learn this victory cry a second time, each affected creature can choose both options.
!!! Regroup!*
The triggering ally regains Stamina Points equal to your class level plus your Charisma bonus. If you learn this victory cry a second time, this becomes Stamina Points equal to twice your class level plus your Charisma bonus.
!!! Stay Alert!*
The triggering ally gains a +1 morale bonus to AC for 1 round. If you learn this victory cry a second time, this instead becomes a +1 morale bonus to AC and a +1 morale bonus to saving throws for 1 round.
!!! Take a Breather!*
The triggering ally can immediately attempt a new saving throw against a single affliction that is affecting them. Failing this saving throw does not worsen the affliction. If you learn this victory cry a second time, the ally also gains a +4 morale bonus to this saving throw.
!!! Tread Carefully!
Each creature affected by this victory cry can move an additional 5 feet when taking a guarded step on their next turn; this additional 5 feet of movement provokes attacks of opportunity as normal. If you learn this victory cry a second time, the additional movement does not provoke attacks of opportunity.
!! Expanded Victory 4th, 6th, 9th, and 18th)
You learn an additional victory cry from the list above. This alternate class feature can be selected at any, all, or none of these levels.
Glorious Shout (12th)
At the right moments, your voice carries more meaning and inflection, imparting further encouragement to empower your allies. You learn an additional victory cry from the list above. Additionally, when you issue a victory cry, you can choose two different victory cries and provide both of their benefits to the creatures affected by each victory cry.
You have been trained to treat combat wounds on and off the battlefield. Having operated in high-intensity situations in remote rural locales, on city streets, and amid the din of combat, you have honed your ability to remain calm and collected under duress and heal those around you. Your peers see you as an incredibly valuable member of the team, and because of this, they defend you with their lives.
!! Theme Knowledge (1st)
Having studied and even occasionally treated infirmities and illnesses across the galaxy, you can detect and diagnose a wide array of maladies in both your own species as well as in beings from all walks of life. You have also done extensive research on unusual—even mystical—aspects of biology and chemistry, and now almost nothing in those fields surprises you. Reduce the DC of any [[Life Science]] or [[Mysticism]] check to [[recall knowledge]] about a disease or poison by 5. [[Medicine]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to Medicine checks. In addition, you gain an ability adjustment of +1 to Intelligence at character creation.
!! Exposure Immunity (6th)
Because of your time spent administering long-term care to infirm and quarantined patients, your immune system has been greatly boosted. While these repeated exposures have raised concerns about your health in the past, you have rebounded from them stronger and healthier than ever. You gain a +1 bonus to Fortitude saving throws against poisons and diseases.
!! Bedside Manner (12th)
You are known for the quality of healing that you can provide to a patient even under imperfect circumstances. When you successfully ensure a creature's [[long-term stability]] with the [[Medicine]] skill, you grant the unconscious creature a +4 bonus to their Constitution check (instead of +2). In addition, when you successfully provide [[long-term care]] with the Medicine skill, you need to exceed the DC by only 5 to have the patient recover Hit Points and ability score damage (as well as recovering from poison states) at three times the normal rate.
!! Preeminent Physician (18th)
Your reputation as a battle medic hinges on your ability to keep your patients alive even in the most dire of circumstances, so when the chips are down, you rise to the challenge. Up to twice per day, when you successfully [[treat deadly wounds]] with the [[Medicine]] skill, you regain 1 Resolve Point. If the patient had 1 Hit Point or fewer remaining, you instead regain 2 Resolve Points, but can't regain Resolve Points with this ability again until you have rested for 8 hours.
The battleflowers of Ning have been using battle ribbons in ritualized combat for millennia, their use dating back to long before the Gap. The weapon is a 10-foot-long ribbon and about 3 inches wide with sharpened edges, and is employed in rippling and flowing motions around the user. Battle ribbons are difficult to use without training, so most who take up the battle ribbon seek apprenticeship with the famous battleflowers of Ning to learn the elaborate performance art—though acquiring such a mentor is difficult, as they take students only rarely. Battle ribbon varieties start with modern materials used in a traditional blade, then proceed to the innovations of the micro-edge and zero-edge battle ribbons.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|battle ribbon, traditional | 3 | 270 | 1d8 S | — | 1 |[[analog]], [[operative]], [[professional]] (dancer) |
|battle ribbon, micro-edge | 8 | 9,400 | 3d8 S | [[wound]] | 1 |[[analog]], [[operative]], [[professional]] (dancer) |
|battle ribbon, zero-edge | 12 | 35,200 | 5d8 S | [[severe wound]] | 1 |[[analog]], [[operative]], [[professional]] (dancer) |
</div>
<div class="statblock">
* <<levels>>
* ''School'' evocation (sonic)
* ''Casting Time'' 1 standard action
* ''Range'' 15 ft.
* ''Area'' cone-shaped burst
* ''Duration'' instantaneous
* ''Saving Throw'' Will half, see text
* ''Spell Resistance'' yes
</div>
Employed to great effect by the pahtra defenders of independent Pulonis, this spell weaponizes music to devastate foes. You compose a deadly song that unleashes dissonant chords in a cone-shaped burst in front of you, dealing 8d6 sonic damage to all creatures and objects in the area. A creature who fails its Will save against your //battle sonata// is also [[staggered]] for 1 round.
<div class="statblock">
* ''Type'' melee; ''Special'' [[analog]], [[block]], [[reach]], [[trip|Trip (weapon property)]]
* ''Damage'' low; ''Damage Type'' B; ''Critical'' —
* ''Slots'' 2 (upper limb)
* ''Cost'' 2 × level
</div>
This rod of forged steel is an impenetrable defensive tool that can deliver devastating blows.
These compound bows are made of materials scavenged from the ruins of [[kishalee]] civilization, giving the bowstrings incredibly high tensile strength. Battlebows can be used to fire arrows and [[grenade arrows]].
<div class="table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|battlebow, tactical | 4 | 1,900 | 1d8 P | 120 ft. | — | drawn | 1 | 1 |[[analog]], [[archaic]], [[quick reload]] |
|battlebow, advanced | 8 | 8,750 | 2d8 P | 120 ft. | — | drawn | 1 | 1 |[[analog]], [[archaic]], [[quick reload]] |
|battlebow, elite | 12 | 31,000 | 3d8 P | 120 ft. | — | drawn | 1 | 1 |[[analog]], [[archaic]], [[quick reload]] |
|battlebow, paragon | 16 | 150,000 | 6d8 P | 120 ft. | — | drawn | 1 | 1 |[[analog]], [[archaic]], [[quick reload]] |
</div>
When you attempt a [[Medicine]] check to stop [[bleed]] damage or administer [[first aid]] to a dying creature, you can choose not to roll your [[expertise]] die in order to also automatically [[treat deadly wounds]] on that creature if your Medicine check is successful. The DC for the check is based on the medical equipment used, using the DC for treat deadly wounds + 5. This does not count as the treat deadly wounds treatment for the purposes of how many times per day a creature can receive this treatment, though a creature can only benefit from battlefield medic once per day. If you also have the [[surgeon]] expertise talent, you can increase the DC of a battlefield medic-related Medicine check by a total of 10 to use battlefield medic to treat deadly wounds on a creature one additional time per day (which does not count as a use of the [[surgeon]] expertise talent).
Battleflowers (or ukara in Triaxian) are elite martial artists from Ning on Triaxus. The battleflower tradition goes back millennia. Renouncing family, social status, and outward expressions of gender, battleflowers perform extravagant, ritualized combats. They are celebrities in Ning and the wider Pact Worlds.
This art requires martial skill and a flair for performance, so most battleflowers are envoys, operatives, solarians, or soldiers. Many battleflowers are [[ryphorians]], but anyone can train to become one of these gladiators.
''Prerequisites:'' You must have 2 ranks in [[Profession]] (dancer) to take the battleflower archetype.
This archetype grants optional alternate class features at 2nd, 6th, 9th, 12th, and 18th levels. At each of these levels, you can choose the alternate feature or the class feature for your class. If a class feature requires a saving throw, the DC equals 10 + half your class level + your key ability score modifier.
!! Battleflower Training (2nd)
Choose one of the following feats for which you meet the prerequisites as a bonus feat: [[Advanced Melee Weapon Proficiency]], [[Bodyguard]], [[Close Combat]], [[Improved Combat Maneuver]], [[Improved Unarmed Strike]], [[Jet Dash]], or [[Special Weapon Proficiency]]. If you choose a feat that grants weapon proficiency, you also gain [[Weapon Specialization]] as a bonus feat at 3rd level for the selected weapon or weapon type.
!! Acrobatic Grace (6th)
You can use [[Acrobatics]] checks in place of [[Diplomacy]] checks to [[change a creature's attitude|Change Attitude]] as a sense-dependent rather than language-dependent effect. In addition, your movements can enthrall observers. As a full action, you can move up to your speed while performing an acrobatic dance. Choose one enemy within 60 feet; that foe must succeed at a Will save or be [[fascinated]] while you continue to take this full action on your turns. You can affect one extra target for every 3 class levels you have above 6th. This is a mind-affecting, sense-dependent effect.
!! Stunning Strike (9th)
When you make an unarmed strike, before the attack roll you can declare an attempt to stun the target. If you hit, the target takes damage normally and must succeed at a Fortitude save or be [[stunned]] for 1 round (DC = 10 + your level + your key ability score modifier). You can attempt this strike a number of times per day equal to your class level.
Starting at 12th level, when declaring your stunning strike, you can choose a condition other than stunned. At 12th level, you can render a target [[staggered]] for 1d6+1 rounds. At 16th level, you can make a target permanently [[blinded]] or [[deafened]]. At 20th level, you can render the target [[paralyzed]] for 1d6+1 rounds. Effects from multiple hits don't stack, but they can extend the duration.
!! Balanced Scales (12th)
As part of a move action, you can expend 1 Resolve Point to take 20 on an [[Acrobatics]] check to [[balance]], or 2 Resolve Points to take 20 on an [[Acrobatics]] check to [[tumble]]. For balance, the effect lasts up to 1 minute, and for tumble, it lasts 1 round. In both cases, you can move at full speed.
!! Uncanny Initiative (18th)
You can choose any number from 1 to 20 as the d20 result of your initiative check, adding initiative modifiers as normal.
Battlegloves are popular, economical choices for mercenaries and guards. These durable nylon-web or para-aramid gloves hold a weighted plate over the wearer's knuckles. You can hold other objects or weapons in a hand wearing a glove, but you can't use the glove to make attacks while doing so.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|battleglove, cestus | 1 | 100 | 1d4 B | — | L |[[analog]] |
|battleglove, power | 10 | 16,100 | 2d8 B | — | L |[[powered]] (capacity 20, usage 1) |
|battleglove, nova | 13 | 52,500 | 3d10 B | — | L |[[powered]] (capacity 20, usage 1) |
|battleglove, gravity | 17 | 214,850 | 5d10 B | — | L |[[powered]] (capacity 20, usage 1) |
</div>
The battlemaster fighting style focuses on adapting your natural advantages to new dangers and situations as they arise. By anticipating particular threats or adjusting mid-combat to deal
with specific foes, you can assure your survival and gain the advantage. The following soldier fighting style is an adaptation of this technique that has made its way to the Pact Worlds. You must have the armor savant and natural weapons racial traits to take this fighting style.
!! Bolster Resilience (1st)
As a move action, you can grant yourself [[DR]] 1/— for a number of rounds equal to your Strength or Constitution modifier (whichever is higher; minimum 1 round). Once you have used this ability, you can use it again only after you take a 10-minute rest to regain Stamina Points. This DR increases to DR 2/— at 5th level, DR 3/— at 9th level, DR 4/— at 13th level, and DR 5/— at 17th level. If you have DR from any other sources, the DR you gain from this ability increases by 1. Each time you are attacked while this ability is active, you can use either this DR or the DR gained from another source.
!! Instinctive Strike (5th)
As a move action, you can study a target to spot vulnerabilities that make your melee attacks more effective. You gain a +1 insight bonus to the next melee attack roll you make against that target before the end of your next turn. You can study only one target at a time, and if you use this ability to gain a bonus against a new foe, any previous bonus is lost. Once you have made an attack against a creature with this bonus, you can't use instinctive strike against that foe again for 24 hours.
!! Reactive Resistance (9th)
When you take energy damage, you can expend 1 Resolve Point as a reaction to gain [[energy resistance]] 10 against that type of energy damage (including the triggering damage) for 1 minute. If you took damage from multiple types of energy damage as part of the same attack or effect, you choose one to gain energy resistance against. You can have resistance against only one energy type from reactive resistance at a time. If you use this ability to gain resistance against a new damage type, any previous resistance gained from this ability is lost.
!! Anticipate Ambush (13th)
You can act during a surprise round.
!! Empower Defenses (17th)
As a move action, you can double the [[DR]] you gain from your bolster resilience style technique and the energy resistance you gain from your reactive resistance style technique until the start of your next turn.
<div class="statblock">
* <<levels>>
* ''School'' [[divination]] (mind‑affecting)
* ''Casting Time'' 1 standard action
* ''Range'' 60 ft.
* ''Targets'' two creatures
* ''Duration'' 10 minutes/level (D)
* ''Saving Throw'' Will negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
You create a strong temporary psychic link between two creatures that allows them to act almost as one. This spell works like //[[lesser battlemind link]]//, but the enhancement bonus to initiative rolls is +4, and the spell ends if the targets are more than 500 feet apart, rather than 200 feet apart. In addition, if the targets threaten the same enemy, they are considered to be flanking that foe regardless of their actual positions. When one of the targets hits a foe with a ranged attack, they can, as a reaction, apply the effects of covering fire or harrying fire against that foe for the other target of this spell. Finally, each target gains a +4 enhancement bonus to attacks of opportunity if they both attack the same creature due to the same triggering action on that creature's part.
<div class="statblock">
* <<levels>>
* ''School'' [[divination]] (mind‑affecting)
* ''Casting Time'' 1 standard action
* ''Range'' 30 ft.
* ''Targets'' two creatures
* ''Duration'' 1 minute/level (D)
* ''Saving Throw'' Will negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
You form a temporary psychic link between two creatures that allows them to act almost as one. While this spell is active, the two targets each roll initiative in combat and use the higher die result between them before adding modifiers. This spells also grants each target a +2 enhancement bonus to initiative rolls. This spell ends if the targets are ever more than 200 feet apart or if either target is [[unconscious]] or [[helpless]].
<div class="statblock">
* ''Size'' Gargantuan
* ''Maneuverability'' average (+0 [[Piloting]], turn 2)
* ''HP'' 280 (increment 40); ''DT'' 10; ''CT'' 56
* ''Mounts'' forward arc (1 capital, 2 heavy), port arc (2 heavy, 1 light), starboard arc (2 heavy, 1 light), aft arc (1 light), turret (2 heavy)
* ''Expansion Bays'' 8
* ''Minimum Crew'' 100; ''Maximum Crew'' 300
* ''Cost'' 150
A battletune comes in a variety of sizes and shapes, as it mimics the variety of musical instruments found across countless cultures throughout the galaxy. This instrument, however, is sturdy enough to be used as a bludgeoning weapon in combat without activating the battery. When powered, its sonic vibrations instead harm the eardrums of enemies (though this weapon always targets KAC).
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|battletune, sopranino | 1 | 250 | 1d4 B/So | — | 1 |[[instrumental]], [[modal]] (sonic), [[powered]] (capacity 20, usage 1) |
|battletune, soprano | 4 | 2,000 | 1d6 B/So | [[deafen]] | 1 |[[instrumental]], [[modal]] (sonic), [[powered]] (capacity 20, usage 1) |
|battletune, alto | 8 | 9,200 | 2d4 B/So | [[deafen]] | 1 |[[instrumental]], [[modal]] (sonic), [[powered]] (capacity 40, usage 2) |
|battletune, tenor | 12 | 34,600 | 2d8 B/So | [[deafen]] | 1 |[[instrumental]], [[modal]] (sonic), [[powered]] (capacity 80, usage 4) |
<div class="statblock">
* ''CR'' 9; ''XP'' 6,400
* NE Medium undead
* ''Init'' +6; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +17
!!! DEFENSE
* ''HP'' 144
* ''EAC'' 23; ''KAC'' 23
* ''Fort'' +11; ''Ref'' +11; ''Will'' +10
* ''Immunities'' [[undead immunities]]
!!! OFFENSE
* ''Speed'' 30 ft., fly 60 ft. ([[Su]], perfect)
* ''Melee'' claw +18 (2d8+13 S)
* ''Ranged'' [[combat rifle]] +21 (3d8+9 P)
* ''Offensive Abilities'' devour soul, dread howl, infused ammunition
!!! STATISTICS
* ''Str'' +4; ''Dex'' +6; ''Con'' —; ''Int'' +0; ''Wis'' +0; ''Cha'' +3
* ''Skills'' [[Acrobatics]] +17, [[Stealth]] +22, [[Survival]] +17
* ''Other Abilities'' [[unliving]]
* ''Gear'' [[d-suit]] III, [[combat rifle]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, gang (2–5), or flight (6–12)
!!! SPECIAL ABILITIES
''Devour Soul ([[Su]])'' A baykok can take a standard action to devour the soul of an adjacent dead or dying creature. A dying creature can resist this attack with a successful DC 18 Fortitude save. If it fails, the target is instantly slain. If the creature is already dead, it can't attempt the saving throw, although the target can't have been dead for more than 1 hour. A creature subjected to this attack can't be brought back to life via //[[mystic cure]]// cast as a 4th-level or higher spell (though //[[raise dead]]// and more powerful effects work normally). When a baykok devours a soul in this way, it recovers a number of Hit Points equal to 2d10 + its CR and becomes hasted for 4 rounds (as if affected by //[[haste]]//). This is a death effect.
''Dread Howl ([[Su]])'' Once per day as a standard action, a baykok can let out a howl. Each living creature within a 30-foot-radius burst must succeed at a DC 16 Fortitude save or become [[paralyzed]] with fear for 1 round. A creature that succeeds at this saving throw is instead [[shaken]] for 1 round. This is a sense-dependent fear effect.
''Infused Ammunition'' ([[Su]]) As part of making an attack or full attack with a projectile weapon, a baykok can create a round or rounds of ammunition made from bone and infused with negative energy. This ammunition appears loaded into the projectile weapon the baykok is wielding. The baykok can't create ammunition quickly enough to use when making an attack in automatic mode. Half the damage from attacks made with this ammunition is negative energy damage, and a creature struck by such an attack must succeed at a DC 16 Fortitude save or be [[paralyzed]] for 1d3 rounds. A baykok can fire normal ammunition from its projectile weapon if it wishes, though such ammunition doesn't gain the extra benefits.
</div>
Those who revel too much in the thrill of chasing and killing living creatures might arise as baykoks after death.
!! Baykok Template Graft
Baykoks are flying undead devoted to the hunt.
* ''CR'' 4+
* ''Required Creature Type:'' undead
* ''Suggested Array:'' combatant or expert
* ''Traits:'' +1 EAC, –1 KAC
* ''Abilities:''
** devour soul (see above)
** dread howl (see above)
** infused ammunition (see above)
* ''Suggested Ability Score Modifiers:'' Dexterity, Strength
A bayonet bracket allows you to attach a one-handed melee weapon to the bottom rail of a railed weapon or a small arm. The melee weapon cannot have the [[reach]] weapon special property. Attaching a melee weapon to a bayonet bracket or removing it is a full action. If the attached melee weapon deals bludgeoning or slashing damage, you take a –2 penalty to attack rolls with it while it's attached. The type of bayonet bracket determines which weapons you can use together.
* ''Light Bayonet Bracket (Level 1):'' A light bracket allows you to fasten a melee weapon of light bulk to a longarm or sniper weapon, or fasten an [[operative]] weapon to a small arm.
* ''Heavy Bayonet Bracket (Level 1):'' A heavy bracket allows you to fasten a melee weapon of 1 bulk or less to a longarm, heavy weapon, or sniper weapon.
<div class="table-wrapper">
|Accessory | Level | Price | Bulk | Capacity | Usage |Weapon Type |h
|bayonet bracket, light | 1 | 150 | — | — | — |railed weapon, small arm |
|bayonet bracket, heavy | 1 | 300 | — | — | — |railed weapon |
</div>
<div class="statblock">
* ''Tier'' 1
* Evgeniya-Jaimisson Company Transport
* Small Light Freighter
* ''Speed'' 8; ''Maneuverability'' good (turn 1); ''Drift'' 1
* ''AC'' 16; ''TL'' 15
* ''HP'' 40; ''DT'' —; ''CT'' 8
* ''Shields'' Basic 40 (forward 10, port 10, starboard 10, aft 10)
* ''Power Core'' Micron Ultra (80 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic medium-range sensors, crew quarters (common), mk 1 trinode, mk 3 defenses, mk 4 armor; ''Expansion Bays'' [[cargo hold]] (2), [[smuggler's compartment]]
* ''Modifiers'' +1 to any 3 checks per round, +2 [[Computers]] (sensors only), +1 [[Piloting]]
* ''Complement'' 4 (minimum 1, maximum 6)
!!! CREW
* ''Captain'' [[Bluff]] +5 (1 rank), [[Computers]] +5 (1 rank), [[Diplomacy]] +5 (1 rank), [[Engineering]] +5 (1 rank), [[Piloting]] +5 (1 rank), [[Sense Motive]] +10 (1 rank)
* ''Engineer'' [[Engineering]] +5 (1 rank)
* ''Pilot'' [[Piloting]] +5 (1 rank)
* ''Science Officer'' [[Computers]] +5 (1 rank)
</div>
Starships from the BD series are EJ Corp's smallest cargo haulers, and //BD514// is a typical example; the Company has manufactured thousands of these identical ships, each marked with the ubiquitous Evgeniya-Jaimisson logo. These vessels are crewed by salaried employees who don't own their own ships, but rather lease them from the Company to fulfill shipping contracts throughout the Pact Worlds, Near Space, and the Vast. BD-series ships are built for ease of use, utility, and endurance, rather than comfort; all crew accommodations are shared, and it's virtually impossible to be alone while aboard. The single large common area is used for cooking, dining, and relaxation. A tour of the engineering room for a BD-series ship usually reveals patches and replacement parts several years old, and the interiors of these ships are notoriously noisy. On the other hand, the ship's computer is surprisingly advanced, and the controls are so straightforward that a few minutes of instruction is enough for a rookie pilot to get one off the ground. The ship is managed by TARN (Technical Automated Resource Network), an AI modeled on an idealized, paternal version of Tarn Jaimisson, the mysterious Company founder.
Each BD is issued a six-wheeled A4-series Company rig and two hovercarts for cargo-handling purposes (page 6). A "secure storage compartment" below the main deck is officially intended for overflow cargo, but the shape of the hull—combined with electronic countermeasures and shield diffraction patterns—creates a blind spot in this compartment where sensors can't easily reach; Company employees use this space to hide cargo that law enforcement might confiscate, such as hyperleaf and other drugs.
//BD514// is unarmed. EJ Corp employees know weapons cost more than the Company is willing to pay, and both starship and crew are cheap, expendable, and easily replaced. Some crews who work together on the same BD-series transport for an extended period might make clandestine modifications, however, installing a turret-mounted particle beam in the secure storage area beneath the main deck. This substantially weakens the ship's armor and shield integrity, however, and increases its heat signature. For ships that have been customized in this way, reduce the AC by 2 and TL by 1, reduce shields to Basic 30 (forward 8, port 7, starboard 7, aft 8), remove the smuggler compartment, and add a light particle beam in a turret. Give the pilot and captain a gunnery bonus of +5 (1st level).
Beacon buoys are tiny, specialized flotation devices, each of which can self-adjust to float in place in water of any density. You can deploy a single beacon buoy as a move action, and each is automatically paired with a simple application that can be installed on most comm units and datapads. To deploy a buoy so that its data proves useful, it must have sufficient space by being at least 1 mile from any other buoy you've deployed. When you have at least 2 buoys deployed with sufficient space, you can use their relational-data feed to give you a circumstance bonus to [[Piloting]] checks to navigate in a vehicle and to [[Survival]] checks to orienteer underwater. This bonus is equal to half the number of buoys you've deployed with sufficient space (to a maximum of +10).
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|beacon buoy | 3 | 1,250 | 1 | 10 | 1/day |
</div>
You can crush grappled opponents in your arms or other limbs, squeezing them hard enough to cause injury.
''Prerequisites:'' [[Improved Combat Maneuver]] (grapple)
''Benefit:'' When you successfully renew a [[grapple|Grapple (combat maneuver)]], you can also deal your unarmed strike’s base damage (not including your Strength modifier or [[Weapon Specialization]]) to the grappled creature.
Uplifted animals are nonsapient creatures modified to increase their cognitive ability to full self-awareness, and sometimes also to make their physical forms better able to manipulate tools. Uplifted bears are among the most common uplifted animals, although who uplifted them and how are details lost to the Gap.
Uplifted bears have modified bodies that give them nimble hands with opposable thumbs. They retain a normal bear's bulk and power, with claws that can rip through modern armor. Alongside their brute strength, uplifted bears have a keen intellect and the ability to communicate via telepathy, which most choose to do rather than vocalize gruffly from what is still a bear's muzzle. An uplifted bear can be 5 feet tall at the shoulder when on all fours but tower up to 10 feet when moving bipedally. An adult bear weighs 1,200 pounds. These modifications and traits are genetic and can be passed down by mating pairs of uplifted bears.
Many uplifted bears find success in scientific endeavors, but they are most comfortable when they can be outside regularly in a natural, vegetated environment. Though this characteristic is not universal, it has led to uplifted bears gaining a reputation as poor crew members in orbital stations and long-haul expeditions. Others also assume the bears are best suited for exploring habitable worlds and cataloging flora and fauna.
Uplifted bears are sometimes rumored to have violent temperaments, but their personalities are as varied as those of any sapient species. Some uplifted bears take great pleasure in playing to this stereotype when they meet other people, drawing out the biased assumptions of the ill-informed, and then mocking them. Conversely, giving truth to the generality, a number of organized crime kingpins are uplifted bears who find they can threaten with their bulk when they can't convince with their wits.
Small communities of uplifted bears can be found in the Pact Worlds, especially on higher-gravity planetoids in the Diaspora. Members of such settlements attempt to uncover their traditions by studying any pre-Gap relics they can find and to establish new traditions by building stable societies. Many young uplifted bears become frustrated with this focus on the past, however, and some leave their homes to escape it.
Uplifted bears feel a kinship for animals and animal-like humanoids, often preferring their company. They relate well to [[shirrens]], though uplifted bears are more reserved than the enthusiastic insectile species. Much as many shirrens fear the Swarm and its potential to reassimilate them, some uplifted bears fear that whoever created them might return and put a dark spin on the gift of sapience the bears were given.
An uplifted bear exploration team exploring the Vast recently discovered a planet in the Ferra system full of skyscraper-sized trees and unpopulated by sentient creatures. Since this report, a small but vocal contingent of uplifted bears has begun calling for their kind to claim the planet as their home world.
!! Racial Traits
* ''Ability Adjustments:'' +2 Str, +2 Int, –2 Wis
* ''Hit Points:'' 6
* ''Size and Type:'' Uplifted bears are Large magical beasts with a space of 10 feet and a reach of 5 feet.
* ''Climber:'' Uplifted bears have a climb speed of 20 feet.
* ''Ferocious Charge:'' Uplifted bears have the [[ferocious charge]] special ability.
* ''Limited Augmentation:'' The only augmentations that can be installed in an uplifted bear's brain are [[datajacks]] and the mechanic's [[custom rig]].
* ''Limited Telepathy:'' Uplifted bears have [[limited telepathy]] with a range of 30 feet.
* ''Low-light Vision:'' Uplifted bears have [[low-light vision]].
* ''Natural Survivor:'' Uplifted bears have a +2 racial bonus to [[Life Science]] and [[Survival]] checks.
* ''Natural Weapons:'' Uplifted bears have [[natural weapons]] that deal 1d3 slashing damage.
* ''Swift:'' Uplifted bears have a land speed of 40 feet.
!! Ferocious Charge Graft
{{Ferocious Charge (species graft)}}
You have a powerful affinity with the beasts of the wild. Perhaps you descend from—or were infected by—a lycanthrope or similar creature, were subjected to the rituals of a beastly fiend, or performed ancestral trials to pledge yourself to a beast spirit. Whatever the source, you fight and hunt like a wild thing, and you know the natural side of worlds like you were born to them.
!! Theme Knowledge (1st)
You have sterling instincts when it comes to understanding wild places. When you attempt a [[Life Science]], [[Physical Science]], or [[Survival]] check to [[recall knowledge]] about animals or terrestrial wilderness environments, reduce the DC by 5. [[Survival]] is a class skill for you, though if it's also a class skill from the class you take at 1st level, you instead gain a +1 bonus to Survival checks. In addition, you gain an ability adjustment of +1 to Wisdom at character creation.
!! Bestial Lineage (6th)
Your animalistic affinity increases. Select one of the following that best fits your ancestral animal or bestial influence.
* ''Feline Leap:'' You are as lithe as a cat. When you jump, you are always considered to have a running start, and the DC for jumping vertically is equal to twice the number of feet you are attempting to jump (instead of four times).
* ''Lupine Tactics:'' Your instincts lead you to flank foes and bring them down for the kill. When you flank an opponent, you gain a +2 bonus to your attack roll to perform the [[trip|Trip (combat maneuver)]] combat maneuver against that opponent, in addition to the benefits of flanking. This bonus does not stack with other effects that grant you a bonus to perform the trip combat maneuver.
* ''Rodent Scurry:'' You are adept at skittering past foes or even underfoot. When using the [[tumble]] task of the [[Acrobatics]] skill, you move at full speed.
* ''Saurian Carnage:'' Like the powerful saurian predators of worlds such as Castrovel, you are a terror to behold, especially when you spill enemies' blood. When you successfully [[demoralize]] a creature, that creature is [[shaken]] for an additional round, or 2 additional rounds if that creature has witnessed you killing or disabling an enemy during the current encounter.
* ''Ursine Fury:'' Injuries don't make you weak, they make you angry. While you have no Stamina Points remaining, you gain a +5 foot bonus to your speed and you do not suffer the penalty to attack rolls or AC incurred by a [[charge]].
!! Wild Hunt (12th)
Your sense of smell has become as sharp as your ancestors'. You gain [[blindsense]] (scent) with a range of 30 feet.
!! Animal Instincts (18th)
Up to twice per day, you can spend 10 minutes giving in to your animalistic impulses in some harmless fashion to recover 1 Resolve Point; this doesn't count as resting to regain Stamina Points. For example, a feline beastblood might spend her time playfully stalking friends, chasing butterflies (or someone's laser sight), or otherwise playing in feline fashion, while a saurian beastblood might spend time sunning themself on a warm stone.
''Required Feat:'' [[Improved Combat Maneuver]] (trip)
Whenever a [[prone]] opponent that you threaten attempts to stand up from prone, as a reaction you can make a melee attack against that opponent. This functions similarly to an attack of opportunity, except your attack resolves before the opponent's action (meaning they're still prone when your attack roll and damage are resolved). You cannot use this attack to make a combat maneuver, even if you have another ability or item that would normally allow you to do so.
As a move action, you can use a [[nanite surge]] to transform into a nanite fog, during which you can take no actions except those granted to you by this
ability.
This is a [[polymorph|Polymorphing]] effect, and it counts against the number of arrays you can have active. While transformed, you're a Gargantuan construct with the swarm subtype, a space of 20 feet, and a reach of 0 feet. You can occupy the same space as other creatures. As a standard action, you can make a swarm attack (1d4 piercing damage per 2 nanocyte levels) and gain [[swarm defenses]] (except immunity to single-target mind-affecting effects) and [[swarm immunities]] as per the universal creature rules. These immunities don't end ongoing conditions. When dealing swarm damage to creatures in your space, you can avoid damaging a number of creatures up to your Constitution modifier.
This transformation lasts until the beginning of your next turn, at which point you can attempt a DC 30 Fortitude saving throw. If you succeed, the transformation's duration extends to the beginning of your next turn. If you fail, the transformation ends, and you re-form in any space your swarm body occupied. The DC of this saving throw increases by 2 each time you succeed at the saving throw. If you're reduced to 0 Hit Points, the transformation ends automatically. You can't use this knack again until after you spend 1 Resolve Point to regain Stamina Points after a 10-minute rest.
A bedroll is pad of memory foam 2 to 3 inches thick that provides padding while you sleep, conforming to the shape of your body. It can be compressed and rolled up with attached straps for storage or transport. Most people use a [[blanket]] or [[sleeping bag]] in conjunction with a bedroll.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|bedroll | 1 | 15 | 1 |
</div>
When you make a [[Medicine]] check to treat deadly wounds or successfully aid another for another creature's Medicine check to treat deadly wounds, if the Medicine check is successful you can add your Charisma bonus to the number of Hit Points recovered as a result of the skill check. Additionally, when you make a Medicine check to treat disease or treat drugs or poison, or successfully aid another for another creature's Medicine check to do so, if the Medicine check is successful, the saving throw bonus granted by the skill checks increases to +6. If the associated saving throw succeeds, it counts as two consecutive successes for the purposes of curing the intended affliction.
This is a language-dependent, mind-affecting, sense-dependent effect.
<div class="statblock">
* <<levels>>
* ''School'' enchantment (mind-affecting, sense-dependent)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Area'' 20-ft.-radius spread
* ''Duration'' 1 round/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
You hurl your voice to distract creatures with nonstop chatter, which doesn’t require a shared language to be annoying; targets must be able to hear to be affected by this spell, though. Creatures in the area who fail the saving throw are [[off-target]] and take a –4 penalty to [[Perception]] checks for the duration.
Your nanites can mimic and amplify your natural glow. When you use [[beguiling glow]] while your [[cloud array]] is active, your beguiling glow emanates from all the spaces your cloud array fills, as well as from you. You can use one nanite surge when you activate beguiling glow to increase the radius of your beguiling glow to 30 feet and change its DC to that of your nanocyte knacks. You must have the beguiling glow species trait and the [[glimmering nanites]] knack to select this nanocyte knack.
[[Cephalumes]] communicate in part by controlling their bioluminescent skin and can use this natural ability to beguiling effect. Glowing filaments embedded within your skin allow you to create mesmerizing patterns as a standard action. Each sighted creature within 20 feet of you must succeed at a Will saving throw (DC = 10 + half your character level + your Wisdom modifier) or be [[fascinated]] for as long as you continue this presentation (requiring a standard action each round). Creatures that understand Lumos (the racial language of cephalumes) are unaffected. This a sense-dependent effect.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|beguiling glow graft | 4 | 1,900 | skin |
</div>
You rely on aspects of your culture or society that others might find unfamiliar to pique their interest and make a good impression. Double your [[operative's edge]] bonus to [[Bluff]] and [[Diplomacy]] checks when interacting with a creature or creatures who are unfamiliar with your species or home world (at the GM's discretion). When you encounter such creatures, you can spend 1 Resolve Point to attempt a special Bluff or Diplomacy check whose DC equals 10 + 1-1/2 × the highest CR of these creatures, plus 1 for each additional creature in the group (maximum +10 for a group of 11 or more creatures). If you succeed, the creatures' starting attitude improves by one step for 1 hour. This improvement doesn't stack with any caused by other effects; however, this exploit's short duration might allow you to attempt longer-lasting adjustments, such as with Diplomacy checks to [[change attitude]].
When attached to an [[analog]] ranged weapon, a //bending// fusion enables you to adjust the weapon’s projectiles mid-flight. Your attacks with the weapon ignore the AC bonus from soft cover provided by one Medium or smaller creature between you and your target. Soft cover provided by additional or larger creatures is unaffected.
When you score a critical hit against a significant enemy with a weapon that has the //beneficent// fusion, you gain one charge of beneficence. As long as you are wielding the same weapon, you can expend a charge of beneficence to cast either //[[remove affliction]]// or //[[lesser remove condition]]// as a spell-like ability, using the weapon's item level as your caster level. You cannot have more than one charge of beneficence at a time, and you lose all charges of beneficence if you take a 10 minute rest and spend a Resolve Point to regain your Stamina Points or if you take an 8-hour rest and regain your daily-use abilities and spells. If the weapon with the //beneficent// fusion has an item level of 14 or higher, you can instead use a charge of beneficence to cast //[[remove condition]]//. If the weapon has an item level of 19 or higher, you can instead use a charge of beneficence to cast //[[greater remove condition]]//. A weapon cannot have the //beneficent// weapon fusion if it also has the //[[unholy]]// or //[[wounding]]// weapon fusions.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Target'' 1 creature
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Fortitude negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
You transform the target's brain, allowing them to see sounds, hear scents, and otherwise perceive sensory input using multiple sensory organs. Even unusual senses, such as a shirren's vibration sense, are affected. For the duration of the spell, the target is immune to the [[blinded]], [[dazzled]], and [[deafened]] conditions and gains a +2 enhancement bonus to [[Perception]] checks.
A //Besmaran Rose// is an archaic, ornate compass with stylized flower petals around its circumference and a skeletal finger in place of a needle. Found in the possession of presumed Pirate Council members emerging from the Gap, these compasses have become informal badges for some councilors, with a pirate lord’s //Besmaran Rose// being passed to the next most senior councillor upon the former’s death. Among the Free Captains, losing a //Besmaran Rose// is considered a terrible omen, signaling the owner’s imminent demise. Besmara’s faith periodically creates more of these items, yet the devices remain rare.
Once per week while holding a //Besmaran Rose//, you can spend a full action to name an object, person, or place anywhere in the galaxy, prick your skin, and drip a drop of blood (or similar substance) onto the compass’s needle. The device quickly absorbs the blood, turns a reddish hue, and causes the skeletal finger to whirl indecisively for a moment. The compass attempts a special check, rolling 1d20+15 with a DC based on the named subject’s obscurity. The compass automatically succeeds in detecting a common subject, such as “potable water” or “a station that can repair our starship.” Rarer or more specific subjects are DC 20, such as “undersea treasure” or “the closest starport operated by the Veskarium.” Unique or carefully hidden subjects are typically DC 25 or higher, depending on their rarity, such as “Rasheen’s sunken treasure” or a specific and covert smuggler. Some subjects, like requesting secrets about the Gap, automatically fail.
If the compass fails, it provides no benefit. If the compass succeeds, it imparts a helpful vision about the subject’s location, such as a nearby landmark. Until the compass is activated again, it can rest atop a starship’s or vehicle’s controls, granting the pilot a +10 bonus to astrogate and navigate to the location. However, the //Besmaran Rose// only brings the user close to the objective, and additional local exploration and investigation are often necessary to uncover hidden destinations.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//Besmaran Rose// | 15 | 103,300 | L |
</div>
<div class="statblock">
* <<levels>>
* ''School'' necromancy (curse)
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one creature
* ''Duration'' permanent
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
You place a terrible curse on the target, stealing either its overall competency or its ability to think and act on its feet. Choose one of the following.
* The target takes a –4 penalty to ability checks, attack rolls, saving throws, and skill checks.
* Each turn, the target has a 50% chance to act normally; otherwise, it takes no action.
You can also invent your own curse, but it should be no more powerful than those described above. The curse bestowed by this spell cannot be dispelled, but it can be removed with a //[[break enchantment]]//, //[[miracle]]//, //[[remove affliction]]//, or //[[wish]]// spell.
Casting this spell doesn't provoke attacks of opportunity. //Bestow curse// counters //[[remove affliction]]//.
<div class="statblock">
* ''Levels'' 4–11
* Small magical beast
* ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]
* ''Good Save'' Ref; ''Poor Saves'' Fort, Will
* ''Speed'' 30 ft., climb 20 ft.
* ''Melee Attack'' bite (P)
* ''Space'' 5 ft.; ''Reach'' 5 ft.
* ''Ability Modifiers'' Dex, Cha
!!! SPECIAL ABILITIES
''Horrific Shriek ([[Su]])'' Every 1d4 rounds, a bhanda can shriek as a standard action. All creatures within 30 feet except for you must succeed at a Will saving throw (DC = 10 + half the bhanda's level + the bhanda's Charisma modifier) or gain the [[shaken]] condition for 1 round. Creatures that fail their saving throw against a bhanda's horrific shriek can't be affected by that bhanda's horrific shriek for 24 hours.
''Unnerving Gaze ([[Su]])'' As long as your bhanda is adjacent to you, you gain a +2 circumstance bonus to [[Intimidate]] checks against creatures within 30 ft. that can see your bhanda, and the DC of any spell you cast with the fear descriptor increases by 1.
</div>
Bhandas are slender, pale, lemur-like creatures that mimic the hunting cry of a winged apex predator to flush out prey.
<div class="statblock">
* <<levels>>
* ''School'' conjuration (creation)
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Duration'' 1 round/level (D)
</div>
The spell creates an identical copy of you in an adjacent space, along with everything you wear and carry other than artifacts. (If you carry an artifact, you decide which body retains it.) You exist in two places at once until the spell ends. Once the copy is created, it can travel an unlimited distance away from you. Your duplicate acts just after you do each round—it doesn't have a separate initiative count. One of you can use a full round's worth of actions, and the other can take only a standard or a move action. Between the two of you, you can cast only one spell per round—unless you have a special ability that allows you to cast more than one spell when you have no duplicate, such as the [[quickened spell]] magic hack. You and your duplicate share sensory information, so if one of you is aware of or knows something, both of you do. The duplicate is another creature for most purposes, with the following exceptions.
You and the duplicate use the same statistics and share resources, including one pool of consumable items (including ammo), daily-use abilities (including from items) and spell slots, Hit Points, Resolve Points, and Stamina Points. If your duplicate casts a spell, your spell is expended, and if your duplicate uses a consumable item, that item is no longer available to you. Similarly, if an item one of you carries is permanently lost or destroyed, that item is lost or destroyed for both. Attacks, spells, and effects affect the two bodies as though they were one person, taking the worst effect applicable. For example, if both bodies are in the same explosive blast, you attempt the saving throw only once and take the damage only once. If you fail the saving throw against //[[hold person]]//, both bodies are paralyzed, and if one body catches a disease, both do. Both bodies count as one creature for spell effects, and they can't be chosen more than once for such effects. Any magical effect on you has its duration halved while you're bilocating. For example, the aforementioned //hold person// loses 2 rounds of duration each round it paralyzes you and your duplicate. Similarly, if you cast //[[resistant armor]]// on yourself, your duplicate is also affected, and the spell has a duration of 5 minutes per level. An effect that has its duration shortened in this way lasts a minimum of 1 round.
In addition, if you attempt a skill check to [[recall knowledge]], you roll only one check. Similarly, if you and your duplicate are in the same area, you roll only one [[Perception]] check to determine what you're both aware of, although you receive a +2 bonus to this check as if your duplicate aided you on it.
When this spell ends, you decide which body remains and which disappears. Any enduring effects continue to affect you.
Your bond with your [[solar shield]] is strong enough that you can split your focus against multiple foes. When you are fully attuned and use a move action to align your solar shield against a specific target, you can choose a second creature to align your shield against, gaining the full benefits of aligning your shield against both of them. Both creatures must be within 30 feet of each other when you align your solar shield against them. You must have a solar shield to select this revelation.
The target is [[entangled]], as if the weapon had the [[entangle]] weapon special property.
Weapons with the //binding// fusion often feature decorative images of bars, gates, and manacles. A //binding// weapon gains the [[bind]] critical hit effect. You can add this fusion only to melee weapons.
Gray guards positioned around secret labs often wield these devices to contain rogue specimens. They fire a sphere‑shaped matrix of energy that electrically adheres to other matter, interfering with mobility. Creatures report a sticky, tingling sensation when struck with these weapons and often find strange markings on their flesh from where the energy matrix attached.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|binding blaster, orb | 5 | 3,100 | 1d6 B | 30 ft. | [[bind]] | 20 | 2 | L |[[force]], [[stun]] |
|binding blaster, globe | 9 | 13,900 | 2d6 B | 30 ft. | [[bind]] | 40 | 4 | L |[[force]], [[stun]] |
</div>
Often used by Starfinders and other explorers or scouts, this advanced optical device allows you to view distant objects. While using binoculars, you gain a +1 circumstance bonus to vision-based [[Perception]] checks against objects 30 feet or farther from you. In order to gain this benefit, you must continually adjust the binoculars' magnification settings, which requires using two hands and a move action each round.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|binoculars | 1 | 50 | L |
</div>
A [[biomechanical]] ship with a biocamouflage system can appear to be an astronomical body rather than a starship. A vessel that can land can instead appear to be a geological formation rather than a starship. To appear to be either, the starship must move in a straight trajectory, engaging in no turns or other maneuvers an astronomical body could not duplicate; the DC to scan the starship then increases by 5. If the check to scan the camouflaged ship fails, the scanner believes the ship is an astronomical body or geological object, taking a –4 penalty to further scans while the belief endures. This belief ends as soon as the camouflaged starship makes any maneuver or change in speed impossible for the object the starship is believed to be.
<div class= "table-wrapper">
|System | PCU | Cost (in BP) |h
|biocamouflage | 0 | 5 + 2 × size category |
</div>
<div class="statblock">
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 11
* ''Track'' [[Constitution|Constitution Poison Track]]
* ''Frequency'' 1/round for 4 rounds
* ''Effect'' Select one living creature subtype when crafting biocide. Creatures of that subtype take a –4 penalty to saving throws against the poison, and the frequency is extended for 2 rounds.
* ''Cure'' 2 saves
</div>
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|biocide | 4 | 340 | 1 |
</div>
You're fascinated by science in all its many facets. You understand that the fundamentals of biology, chemistry, physics, and other disciplines can help you exploit your enemies' weaknesses and bolster your allies. You might be studious and methodical about your research, pushing your mind to the limit in search of discovery, or you might be a daring experimenter, improvising concoctions and stumbling upon grand revelations. Either way, you use your knowledge of several fields of scientific study to aid your allies, whether in the thick of battle or in crafting a perfect plan.
* ''Hit Points:'' 6
* ''Stamina Points:'' 6 + Constitution modifier
* ''Key Ability Score:'' Your Intelligence helps you learn about the sciences, while your Wisdom helps you interpret facts and apply them to real-world situations. You should choose either Intelligence or Wisdom as your key ability score. Once made, this choice cannot be changed. A high Dexterity can help you better aid your allies and hinder your foes with your ranged biohacks.
* ''Class Skills:'' [[Bluff]] (Cha), [[Computers]] (Int), [[Culture]] (Int), [[Diplomacy]] (Cha), [[Engineering]] (Int), [[Life Science]] (Int), [[Medicine]] (Int), [[Perception]] (Wis). [[Physical Science]] (Int), [[Profession]] (Cha, Int, or Wis), [[Sense Motive]] (Wis), [[Sleight of Hand]] (Dex)
* ''Skill Ranks per Level:'' 4 + Intelligence modifier
* ''Proficiencies:'' light armor; basic melee weapons, small arms, and grenades
{{Table: Biohacker}}
!! Alternate Class Features
<<list-links "[tag<currentTiddler>tag[Alternate]sort[level]]" class:index>>
!! Archetype Changes
* ''2nd, 4th, 6th, 12th, and 18th Levels:'' You don't gain a [[theorem]].
* ''9th Level:'' You don't gain the use of a second [[spark of ingenuity]] per day. When you reach 15th level, you can use only two sparks of ingenuity per day.
Biohackers use complex catalysts and fringe medical knowledge to augment their allies and inhibit their foes, often using injection weapons.
* ''Special Rules:'' Choose a primary [[field of study]] (biohacker NPCs of CR 7+ receive a secondary field of study, while biohacker NPCs of CR 13+ also receive a tertiary field of study); the NPC gains access to the boosters and inhibitors of chosen fields of study. At appropriate CRs, the NPC also receives the breakthrough of the listed chosen field of study. Any boosters, inhibitors, or breakthroughs that aren't relevant to the biohacker NPC don't need to appear in its stat block.
* ''Required Array:'' Expert.
* ''Adjustments:'' +2 to Fortitude saving throws.
* ''Ability Score Modifiers:'' A biohacker NPC should arrange its ability score modifiers depending on its scientific focus (though this has no mechanical effect for the NPC's abilities).
** //Instinctive:// Wisdom, Dexterity, and Intelligence.
** //Studious:// Intelligence, Dexterity, and Wisdom.
* ''Gear:'' Light armor (item level = CR), small arm with [[injection]] weapon special property (item level = CR), basic melee weapon (item level = CR – 1), two grenades (item level = CR – 1), and medicinal and/or poison (item level = CR)
!! Abilities by CR
* ''ALL CRs:'' [[Biohacks]], [[custom microlab]].
* ''CR 2:'' One 2nd-level [[theorem]].
* ''CR 4:'' Two 2nd-level [[theorems]].
* ''CR 5:'' Primary [[field|Fields of Study]] breakthrough, two 2nd-level [[theorems]].
* ''CR 8:'' Primary [[field|Fields of Study]] breakthrough, one 2nd-level [[theorem]], one 8th-level [[theorem]].
* ''CR 10:'' Primary [[field|Fields of Study]] breakthrough, two 8th-level [[theorems]].
* ''CR 11:'' Primary [[field|Fields of Study]] breakthrough, secondary [[field|Fields of Study]] breakthrough, two 8th-level [[theorems]].
* ''CR 14:'' Primary [[field|Fields of Study]] breakthrough, secondary [[field|Fields of Study]] breakthrough, one 8th-level [[theorem]], one 14th-level [[theorem]].
* ''CR 16:'' Primary [[field|Fields of Study]] breakthrough, secondary [[field|Fields of Study]] breakthrough, two 14th-level [[theorems]].
* ''CR 17:'' Primary [[field|Fields of Study]] breakthrough, secondary [[field|Fields of Study]] breakthrough, tertiary [[field|Fields of Study]] breakthrough, two 14th-level [[theorems]].
* ''CR 20:'' Primary [[field|Fields of Study]] breakthrough, secondary [[field|Fields of Study]] breakthrough, tertiary [[field|Fields of Study]] breakthrough, [[superserum]], and two 14th-level [[theorems]].
As you gain experience, you devise theories about the way the universe works. Some theorems you can apply to yourself, altering your physiological structure to gain specific benefits, while others require the use of your [[custom microlab]] or other equipment or add additional options for your biohacks.
You learn your first theorem at 2nd level, and you gain an additional theorem every 2 levels thereafter. If a theorem allows an opponent a saving throw to resist its effects, the DC is equal to 10 + half your biohacker level + your key ability score modifier. If a theorem requires an opponent to attempt a skill check, the DC is equal to 10 + 1-1/2 × your biohacker level + your key ability score modifier. Unless otherwise specified, you can't learn a theorem more than once. Once you learn a theorem, that choice cannot be changed.
<<by-level 'Biohacker Theorems'>>
As part of your [[custom microlab]], you keep a specialized micropharmacy of catalysts, nanites, and specialized chemicals, plus a small mixing apparatus and syringes. You can use these components to quickly fashion ''biohacks'': specialized solutions that produce different effects. In living targets, your biohacks alter normal biological processes; in nonliving creatures, they emulate biochemistry via complex chemical compounds. You can use biohacks to boost your allies or inhibit your foes. Your biohacks produce their effects only when you inject a creature with them (see below), and only you know how to make and administer them properly—a biohack that leaves your possession becomes inert until you pick it up again.
You can deliver any biohack you create with any attack from an [[injection]] weapon. You must declare prior to the attack roll that you are using a biohack and specify which effect you are using, but you select and apply the biohack as part of the action used to make the attack. You do not need to preload your weapon with biohacks. If you are making a ranged attack and miss your target, the biohack is expended along with the attack's ammunition. A biohack delivered via a melee injection weapon is not normally expended on a missed attack. If you must attempt an attack roll with a biohack and your attack hits but deals no damage (normally as a result of [[damage reduction]] or an ability such as the vanguard's [[mitigate]]), the biohack is expended but the target is not affected by it. After a missed attack that does not expend the biohack, you can remove it or change which biohack you are using as part of your next attack without taking any additional action.
You can also deliver a biohack using a physical syringe (from your custom microlab) that you can wield in one hand. This is considered a consumable basic melee weapon with negligible bulk, 1 Hit Point, and an item level and hardness equal to your biohacker level. To inject an unwilling creature with a biohack in this manner, you must hit them with a melee attack. This attack deals no damage, but if the creature would be damaged by 1 point of piercing damage, that creature is instead affected by the biohack within the syringe.
A biohack can be injected into a willing or unconscious creature (or yourself) as a standard action without requiring an attack roll, as long as the target is within your reach. You can also use a ranged injection weapon to deliver a biohack to a willing ally you have attuned your custom microlab to as a standard action without making an attack roll, as long as they're within your custom microlab's range. Under any other circumstance, injecting a biohack into an ally at range requires a successful ranged attack roll.
The materials you use to create biohacks are inert until you activate them. Once activated, they can be used to create any biohacks you know. Each day after you have rested for 8 hours, you can spend 10 minutes to activate the ingredients to create a number of biohacks equal to 1 + your key ability score modifier. This is the maximum number of biohacks you can have ready at one time. This preparation activates only the ingredients; you don't need to decide which specific biohacks you're creating until the actual actions or attacks used to deliver them. Activated biohack materials that aren't used that day become inert, even if they're still in your possession. You can readily replenish these inert reagents on a regular basis at no cost, unless the GM states otherwise. Whenever you take a 10-minute rest to recover Stamina Points, you can also prepare additional activated biohack ingredients to replace those you have used, up to your maximum.
Biohacks come in two varieties: boosters and inhibitors. At 1st level, you know the basic boosters and inhibitors listed below, the minor boosters and inhibitors that follow, and the unique booster and inhibitor granted by your primary [[field of study]]. As you increase in level, you can also devise [[theorems]] to learn special biohacks, in addition to gaining biohacks from a secondary and a tertiary field of study. Additionally, most fields of study eventually provide you with ''breakthroughs'': special biohacks described in their entries.
!! Basic Booster
A basic booster biohack aids a creature in one manner or another. The effect lasts for a number of rounds equal to your key ability score modifier (minimum 1 round) unless it states otherwise. You begin play knowing this basic booster biohack; when you use it, select an effect:
* The target gains a +1 enhancement bonus to AC.
* The target gains a +2 enhancement bonus to skill checks.
* The target gains a +10-foot enhancement bonus to their speed. If the creature has more than one movement type, choose one to receive this bonus.
!! Basic Inhibitor
A basic inhibitor biohack hinders a creature's physiology or material function. The effect of an inhibitor lasts for a number of rounds equal to 3 + your key ability score modifier (minimum 1 round) unless it states otherwise. You begin play knowing this basic inhibitor biohack; when you use it, select an effect:
* The target takes a –2 penalty to AC.
* You reduce the target's [[DR]] by 5. At 9th level, you instead reduce it by 10. At 17th level, you instead reduce it by 15.
* You reduce the target's [[resistance]] to one type of energy (your choice) by 5. At 9th level, you instead reduce it by 10. At 17th level, you instead reduce it by 15.
A creature can be affected by only one of your basic inhibitors at a time, though it could be under the effects of multiple basic inhibitors originating from multiple biohackers. If you affect a creature with a different basic inhibitor while a previous inhibitor is still in effect, the effects of the previous inhibitor end.
!! Minor Biohacks
You can create minor biohacks from less powerful (and more stable) pharmaceuticals, nanites, and catalysts, and you can add them to any attack you make with an [[injection]] weapon that does not already have another biohack added to it. You don't need to activate the materials for minor biohacks in advance, and using them does not count against the maximum number of biohacks you can have ready at one time. Minor biohacks are otherwise used as and function as basic booster and basic inhibitor biohacks, and they count as such biohacks for the purposes of interactions with other abilities (such as spark of ingenuity).
!!! Minor Booster
Using a minor booster biohack allows you to attempt some [[Medicine]] checks on targets you affect so long as the target is within range of your custom microlab. This doesn't require any additional time or action beyond making the attack. The tasks you can attempt with such a Medicine check depend on your level, and they don't have the duration of normal booster biohacks.
At 1st level, you can attempt a Medicine check to administer [[first aid]]. At 3rd level, you can attempt a Medicine check to [[treat drugs or poison]], though on a successful check, the target gains a +4 bonus only on the next saving throw it attempts against the drug or poison, and that saving throw must occur within the next hour. At 6th level you can attempt a Medicine check to [[treat disease]], though on a successful check, the target gains a +4 bonus only to the next saving throw it attempts against the disease, and that saving throw must occur within the next hour.
!!! Minor Inhibitor
A minor inhibitor biohack imposes a slight hindrance on a target: the target takes a –1 penalty to attack rolls for a number of rounds equal to 3 + your key ability score.
You can use the [[demand]] captain action as a science officer action during any phase. Instead of an [[Intimidate]] check, you attempt a [[Life Science]] check if the crew member you're affecting is living, or a [[Physical Science]] check if the crew member is [[unliving]]. The DC of this check is 15 + 1-1/2 × your starship's tier. A creature can be affected by either this TIM or the demand action only once per combat.
Gray starships are often equipped with a room designed for the study of—and experimentation on—biological creatures. A biological experimentation chamber can be used as either a [[medical bay]] or a [[life science lab]] but can only be used on organisms that have first been subjected to examination in the chamber, a painful and invasive process that takes 1 hour.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|biological experimentation chamber | 5 | 9 |
</div>
The creature ignores the first critical damage effect it would take each combat.
<div class="statblock">
* <<levels>>
* ''School'' conjuration
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' 30-ft.-diameter sphere
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Will save negates
* ''Spell Resistance'' no
</div>
You cause a 30-foot-diameter sphere of water or other liquid to fill with bioluminescent plankton, increasing the
light level from dark to dim or from dim to normal. For the spell's duration, you can take a standard action to move this area up to 30 feet in any direction. You can also take a standard action to condense the plankton into a tight, brightly glowing ball at the center of the sphere. If you do so, each creature that starts its turn in or enters the spell's area must attempt a Will save or become [[fascinated]] until the beginning of its next turn. A creature that saves against this effect is immune to it for 24 hours. This spell has no effect above water.
Your skin is covered with elaborate bioluminescent patterns. You have precise control over your bioluminescence, including its color and brightness. You increase the light level by one step out to a radius of 20 feet (to a maximum of normal light). You can suppress or reactivate your bioluminescence by taking a move action. If you know Lumos, the cephalume language, you can use your bioluminescence to communicate in it.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|bioluminescent skin | 1 | 250 | skin |
</div>
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one creature
* ''Duration'' 1 hour/level (D)
* ''Saving Throw'' Fortitude negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
As the elves of yore, you attune the target to the surrounding environment or foresee their needs there, altering their coloration and movement to better match the biome within which you cast this spell. The target ignores nonmagical difficult terrain typical to that biome and gains a +2 insight bonus to [[Stealth]] checks there as well as [[Survival]] checks for the tasks [[endure severe weather]], [[live off the land]], and [[orienteering]] in that biome.
The ships of the Xenowardens are not so much constructed as they are grown in orbital nurseries. Unique blends of technology and nature, they're capable of healing themselves over time and responding to threats in ways unlike any other vessel. These abilities cannot be added to other vessels and, as of yet, no one else in the Pact Worlds has managed to unlock the secrets of their creation.
''Empathetic Response:'' A biomechanical ship can respond like a sentient creature when wounded or in danger. Once a biomechanical ship has taken critical damage, its speed increases by 2 hexes (which may affect its [[Piloting]] modifier. In addition, if the pilot of a biomechanical ship successfully performs the evade stunt, the ship receives a +3 circumstance bonus to its AC and TL (instead of +2).
''Radiation Sensitive:'' Weapons with the [[irradiate|Irradiate (starship weapon property)]] property deal tremendous damage to a biomechanical ship. In addition to the radiation damage dealt to the crew, the ship takes critical damage effects, depending on the level of the radiation. If the radiation level is low, the ship takes one critical damage effect. The ship takes two critical damage effects from medium radiation, and the ship takes four critical damage effects from high radiation.
''Self-Repair:'' While not traveling or in combat, a biomechanical vessel automatically regains 1 Hull Point per hour. This can be increased to 2 Hull Points per hour if the ship's regrowth is being tended by someone with a number of ranks in the [[Engineering]] skill equal to the ship's tier; that engineer can do nothing else during this time. The vessel requires the light from a nearby star, and therefore the ship must be in the same solar system as a star. Less light will delay or even halt this process (subject to the GM's discretion). If this healing raises the ship's HP over a multiple of its Critical Threshold, the critical damage condition of one randomly determined system is reduced by one step.
<div class="statblock">
* <<levels>>
* ''School'' conjuration (healing)
* ''Casting Time ''1 standard action
* ''Range'' touch
* ''Targets'' one creature with a biotech, cybernetic, or magitech augmentation
* ''Duration'' instantaneous and up to 1 minute (see below)
* ''Saving Throw'' Fortitude negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
You energize the target’s natural healing. For 5 rounds, the target gains [[fast healing]] and electricity [[resistance]] based on the spell slot used to cast the spell. If the target is a plant, the spell instead lasts for 1d6+4 rounds, and the spell removes one condition affecting the target that could be ended with //[[lesser remove condition]]//.
Casting this spell drains all charges from a fully charged battery, otherwise it fails.
* ''2nd:'' The spell grants [[fast healing]] 2 and electricity [[resistance]] 5, and drains a standard battery.
* ''4th:'' The spell grants [[fast healing]] 4 and electricity [[resistance]] 10, and drains a high-capacity battery. The spell can end one condition affecting a plant target as though it were //[[remove condition]]//.
* ''6th:'' The spell grants [[fast healing]] 6 and electricity [[resistance]] 15, and drains an ultra-capacity battery. The spell can end one condition affecting a plant target as though it were //[[greater remove condition]]//.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
You have small implants that make microscopic alterations to your DNA, allowing you to attempt a [[Disguise]] check in place of [[Computers]] or [[Engineering]] to defeat biometric locks. If you have access to another creature's biometric data, you can duplicate it automatically and open biometric locks keyed to them.
The systems of a starship with biometric locks can only be used by certain creatures, designated when the locks are installed; this list can be updated by any creature who can gain access to the ship's computer systems. A successful [[Computers]] check (DC = 20 + 1-1/2 × the tier of the starship) can bypass these locks.
<div class= "table-wrapper">
|System | PCU | Cost (in BP) |h
|biometric locks | 0 | 5 |
</div>
Your nanites can modify your features in subtle ways, allowing you to attempt a [[Disguise]] check in place of a [[Computers]] or [[Engineering]] check to defeat biometric locks and similar safeguards. As a reaction when you hit a creature with a melee attack or touch them, you can use a [[nanite surge]] to absorb a sample of the target's DNA or other code. You can store a number of samples equal to your Constitution modifier at any time, and each sample remains viable for a number of days equal to your Constitution modifier. If you absorb another sample and exceed this maximum, you erase one sample of your choice.
You gain a +5 circumstance bonus on Disguise checks to bypass biometric safeguards keyed to any creature whose sample you have. In addition, if you have the [[facial reconfiguration]] knack you can use it to take the appearance of any creatures whose samples you have. This instead grants a +10 circumstance bonus to the Disguise check. In addition, facial reconfiguration reduces the check's DC modifier for this disguise by an amount equal to your nanocyte level (to a minimum of +0), applied to any of the check's modifiers
Your drone must have a [[cybernetic bridge]] mod for you to choose this mod. The augmentation you install in your drone can be a biotech or necrotech augmentation. If this augmentation has an item level that's 4 or more levels lower than your ranks in [[Life Science]] (for biotech augmentations) or [[Mysticism]] (for necrotech augmentations), you can create and install the augmentation yourself at no cost; you can change this self-built augmentation once per day with 1 hour of work. If the augmentation isn't 4 or more levels lower than your appropriate skill ranks, you must acquire and pay for the augmentation (including changing or replacing it) normally. Aspis Consortium mechanics use a bionecrotic bridge to equip their drones with a [[venom spur]] or [[dragon gland]].
Complex actuators and servos are installed in your knees, giving you the power to make impressive leaps. You always count as having a running start when attempting [[Athletics]] checks to jump. In addition, you don't fall [[prone]] if you fail an Athletics check to jump by 5 or more. Finally, the damage you take from the first 10 feet of a fall is converted into nonlethal damage, even if you aren't falling onto a yielding surface.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|bionic knees | 5 | 2,750 | all legs |
</div>
Once injected into the body, these nanites congregate just under the epidermis and can quickly replicate to heal bodily injuries. This augmentation allows you to spend 1 Resolve Point as a swift action to activate the nanites' treat wounds capability, instantly regaining a number of Hit Points depending on the model of biosynthetic nanites you have installed. In addition, once per day as a full action as long as you have Resolve Points remaining, you can overcharge the nanites to gain an amount of [[fast healing]] depending on the model of biosynthetic nanites you have installed for 1 minute. If you do so, you can't activate the treat wounds capability of the augmentation until the next time you rest for 10 minutes to regain Stamina Points.
<div class="table-wrapper">
|Augmentation | Level | Price | System | Treat Wounds | Fast Healing |h
|biosynthetic nanites, mk 1 | 6 | 4,450 | skin | 2d8 Hit Points | 2 |
|biosynthetic nanites, mk 2 | 9 | 13,700 | skin | 3d8 Hit Points | 3 |
|biosynthetic nanites, mk 3 | 13 | 50,900 | skin | 6d8 Hit Points | 6 |
</div>
<<list-links '[tag[Biotech]]' class:index >>
You are a biotech researcher or avid user of such tech, constantly seeking out or developing new biotechnologies and combining existing augmentations with advancements in other fields. You might be a member of the Augmented, a researcher in one of Bretheda's cutting-edge biotech corporations, a spellcasting genetomancer blending biotechnology with magic, or even a voluntary test subject for new augmentations. Either way, you have taken a strong hand in your own evolution.
!! Theme Knowledge (1st)
You have a sharp mind for the intricacies of biotech augmentations and keep up-to-date on current research in the field, whether because you work to develop such technology or because you are the beneficiary of biotech augmentations—or, most likely, both. Reduce the DC of [[Life Science]] checks to [[identify|Identify Technology]] biotech augmentations and to [[recall knowledge]] about famous biotech corporations and researchers by 5. [[Medicine]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to your Medicine checks. In addition, you gain an ability adjustment of +1 to Intelligence at character creation.
!! Industry Connections (6th)
You've forged and maintained a number of connections with significant players in the biotech industry, scoring yourself favors and preferred treatment. As long as you are able to contact your connections in the industry, you gain a 10% discount off the typical list price for biotech augmentations installed in you.
!! Test Subject (12th)
Thanks to your enthusiasm for biotech gear and constant tinkering with your DNA, you can adopt experimental, cutting-edge augmentations in your body beyond what most people can support. You can install one additional piece of biotech augmentation than a typical member of your race. For example, a human could have both a [[dragon gland]] and a [[wildwise]] implant even though they both occupy the throat system.
!! Adaptive Biotech (18th)
You have learned to leverage your biotech augmentations in ways their creators hardly envisioned. Up to twice per day as a standard action, you can deactivate a piece of biotech implanted in your body (except for a [[prosthetic limb]]), rendering it inert until your next 8-hour rest, to regain 1 Resolve Point. An inert piece of biotech doesn't grant its usual benefits (for instance, an inert [[venom spur]] can't be used to attack), and you can shut down a single biotech implant only once per day.
<div class="statblock">
* <<levels>>
* ''School'' conjuration (creation)
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Duration'' 1 round/level (D)
</div>
You conjure forth a mantle of organic, insectile nanites that encircle you. The density of the swarm provides you with partial concealment (20% miss chance) against ranged attacks. Any creature that makes a successful melee attack against you takes 2d6 piercing damage, although you can allow anyone to touch you without them taking damage, for instance to deliver a beneficial touch spell. As a move action, you cause the nanites to cling tightly to you, granting you a fly speed of 20 feet with clumsy maneuverability as an extraordinary ability. When using the shroud to fly, you have no concealment due to it, and it cannot harm creatures that successfully attack you in melee. You can return the nanites to their protective configuration as a move action.
<div class="statblock">
* <<levels>>
* ''School'' conjuration (creation)
* ''Casting Time'' 1 standard action
* ''Range'' 0 ft.
* ''Effect'' living taclash
* ''Duration'' 1 round/level (D); see text
</div>
This spell functions as //[[lesser biotic taclash|Biotic Taclash, Lesser]]//, except that the created weapon is considered to be a magic weapon, deals 4d4 slashing damage, and functions as a level 10 item. In addition, when you dismiss the spell as a reaction when striking a target, that target must succeed at a Fortitude save or take the weapon's damage again and become [[nauseated]] for 1d3+1 rounds.
<div class="statblock">
* <<levels>>
* ''School'' conjuration (creation)
* ''Casting Time'' 1 standard action
* ''Range'' 0 ft.
* ''Effect'' living taclash
* ''Duration'' 1 round/level (D); see text
</div>
You conjure a taclash made of organic, insectile nanites into your grasp. The created weapon functions as a standard [[taclash]] with the [[living]] weapon special property. You are considered to be proficient with this taclash, and you add 1‑1/2 times your caster level to damage rolls with it in place of your [[Weapon Specialization]] bonus. In addition, the weapon has the [[nauseate]] critical hit effect.
The biotic taclash functions only for you, and once you create it, you can neither drop it nor be disarmed of it. As a move action, you can stow the biotic taclash, causing its component nanites to discorporate into individual nanobots that disperse over your body but remain while the spell lasts. During that time, you can cause the nanites to reincorporate to form the weapon again by taking another move action.
As a reaction when you strike a target with the biotic taclash, you can dismiss the spell to cause the weapon to discorporate into its component nanites, which then swarm over the target. The target must succeed at a Fortitude save or be [[nauseated]] for 1 round.
<div class="statblock">
* ''Level'' 3; ''Price'' 3,860
* Large land vehicle (4 ft. wide, 4 ft. long, 7 ft. high)
* ''Speed'' 35 ft., full 350 ft., 40 mph
* ''EAC'' 13; ''KAC'' 15; ''Cover'' partial cover
* ''HP'' 40 (20); ''Hardness'' 6
* ''Attack (Collision)'' 5d4 B (DC 12)
* ''Attack'' voltaic [[anchor pistol]] (1d6 E [[nonlethal]]; critical [[bind]])
* ''Attack'' merc [[NIL grenade launcher]] ([[smoke grenade]]; [[explode]] [20 ft., smoke cloud 1 min.])
* ''Modifiers'' –3 [[Piloting]], –3 attack (–6 at full speed)
* ''Systems'' autocontrol, planetary comm unit
</div>
Little more than an open platform atop a pair of legs, this compact walker provides height from which soldiers and police can monitor crowds.
<div class="statblock">
* ''Base HP'' +0; ''Hit Point Advancement'' +0
* ''EAC'' +2; ''KAC'' +2; ''Fort'' +0; ''Ref'' +1
* ''Lower Limb Slots'' 0; ''Speed'' +10 ft.; ''Other Movement'' None
* ''Cost'' 1.5 × tier
</div>
These legs provide a boost in mobility and protection.
<div class="statblock">
* ''Base HP'' +0; ''Hit Point Advancement'' +0
* ''EAC'' +0; ''KAC'' +1; ''Fort'' +0; ''Ref'' +0
* ''Lower Limb Slots'' 0; ''Speed'' +0; ''Other Movement'' None
* ''Cost'' 0
</div>
These legs provide basic mobility and little else.
<div class="statblock">
* ''Base HP'' +2; ''Hit Point Advancement'' +0
* ''EAC'' +1; ''KAC'' +1; ''Fort'' +0; ''Ref'' +1
* ''Lower Limb Slots'' 0; ''Speed'' +20 ft.;'' Other Movement'' None
* ''Sprint (1 PP)'' The mech gains a +10-foot enhancement bonus to its speed for 1 round.
* ''Cost'' 1 × tier
</div>
These lean and powerful legs enable sudden bursts of speed.
<div class="statblock">
* ''Base HP'' +4; ''Hit Point Advancement'' +1
* ''EAC'' +1; ''KAC'' +1; ''Fort'' +1; ''Ref'' +0
* ''Lower Limb Slots'' 1; ''Speed'' +10 ft.; ''Other Movement'' None
* ''Trample (2 PP)'' As a full action, the mech uses the [[trample]] universal creature ability. This deals low bludgeoning damage, as a [[mech weapon]] with a level equal to the mech's tier. The Reflex save DC equals 12 + 1/2 × the mech's tier.
* ''Cost'' 2 × tier
</div>
These armored legs limit speed but grant extreme durability.
A bipod is a set of sturdy legs attached to a railed weapon's bottom rail. You can extend or collapse a bipod as a move action. Also as a move action, you can stabilize your weapon by resting an extended bipod on a solid surface or using the bipod as a forward grip. When you fire the stabilized weapon, reduce the total penalty you take for making a full attack and due to range according to the bipod's type. You can't benefit from a bipod if your weapon is mounted to a [[gunner harness]] or powered armor.
* ''Light Bipod (Level 1):'' A light bipod can be added only to a longarm or sniper weapon. Reduce your total penalty by 1.
* ''Heavy Bipod (Level 2):'' Reduce your total penalty by 2, or by 1 with a heavy weapon. In addition, a stabilized heavy bipod reduces the minimum Strength score required to fire a heavy weapon without penalty by 2.
<div class="table-wrapper">
|Accessory | Level | Price | Bulk | Capacity | Usage |Weapon Type |h
|bipod, light | 1 | 350 | — | — | — |railed weapon |
|bipod, heavy | 2 | 700 | L | — | — |railed weapon |
</div>
While you're in the air, you use your advantageous altitude to your favor.
''Prerequisites:'' Base attack bonus +8.
''Benefit:'' While you're flying, you ignore [[cover]] and [[partial cover]] (but not total cover) of targets at least 10 feet below you.
Dromada artisans developed this serum to make themselves less palatable. When consumed, this serum suppresses any delicious racial ability you have for 1d4+1 hours. In addition, for the first 10 minutes, your body becomes universally foul-tasting, causing any creature that damages you with a bite or tongue attack to become [[sickened]] for 1d4 rounds unless they succeed at a Fortitude save (DC = 10 + your Constitution modifier).
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//bitterflesh serum// | 1 | 45 | L |
</div>
This small, rectangular box is approximately the size of a handheld computer, with a nondescript carbon-fiber housing attached to an external chip interface that can be plugged into the computers of most starships. A blabbersponder's case is filled with a compact array of microsensors (often composed of [[inubrix]]) connected to a miniaturized computer (treat as a tier 0 computer equipped with a control module) that, bolstered by a signal booster, analyzes and actively transmits a starship's vital data to another source. While no astute starship captain would ever install a blabbersponder on their own ship, such devices are often sold in gray markets to saboteurs serving the whims of corporations, or bounty hunters who wish to gain vital information about a specific starship's defenses. Some clever pirates of the Diaspora are also rumored to sell blabbersponders to gullible spacefarers by offering them as upgrades to starship communication systems. They then use the data they collect from the device to determine if the cargo, defenses, weapons, and crew aboard the ship warrant the effort of intercepting and ambushing it later.
To install a blabbersponder on a starship computer, you must succeed at an [[Engineering]] check (DC = 15 + 1-1/2 × the starship's tier). Once installed and activated, the blabbersponder's internal computer uses its control module to automatically hack into the computer it's attached to. The control module reads and broadcasts all data related to the starship's systems, allowing any science officer aboard another starship within passive sensor range of the blabbersponder's ship to use the scan action on that vessel, even if the two ships aren't engaged in starship combat. Because of the detailed information provided by the blabbersponder, the science officer performing this scan action gains a +5 circumstance bonus to the associated [[Computers]] check, and the broadcasting ship doesn't add the bonus from its defensive countermeasures to the DC.
Detecting that a blabbersponder is in fact an instrument of sabotage and not a benign technological device before it is installed requires a successful DC 25 [[Engineering]] or DC 30 [[Perception]] check. Discovering an installed blabbersponder aboard a starship requires a successful DC 28 [[Computers]] check. When an installed blabbersponder's battery is depleted, it recharges itself using the starship's power core in a process that takes about 5 minutes; on the day this occurs, you receive a +2 circumstance bonus to the Computers check to notice the sudden, short surge in power use and discover the blabbersponder on your vessel. Once discovered, a blabbersponder can be easily unplugged.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|blabbersponder | 6 | 4,550 | L | 40 | 1/day |
</div>
Black dragons are callous and enjoy using fear to exert their influence over others.
* ''Required Creature Type and Subtype:'' dragon (water)
* ''Suggested Alignment:'' chaotic evil
* ''Traits:''
** [[blindsense]] 60 feet and [[darkvision]] 120 feet
** [[immunity]] to acid, paralysis, and sleep
** [[DR]] 5/magic (CR 10+; increase to DR 10/magic at CR 12, DR 15/magic at CR 15, DR 20/magic at CR 17)
** [[SR]] 11 + CR (CR 10+)
** swim speed of 60 feet
* ''Abilities:''
** [[breath weapon]] (line 30 ft. + 10 feet per 2 CR, 1d6 A + 1d6 per CR)
** [[frightful presence]] (CR 11+, 60 feet + 10 feet per CR)
** spell-like abilities (CR 10+)
** swamp stride (see below)
* //Swamp Stride ([[Ex]]):// A black dragon can move through bogs and quicksand without penalty at its normal speed.
''System:'' Heart or Lungs
Despite its name, a black heart can augment any major circulatory organ that helps sustain life in a living creature, though it most commonly augments a heart. A black heart is a strip of necromancy-infused undead flesh that turns whatever organ it is attached to a deep shade of ebony.
You gain the benefits of the environmental protections of armor, which last for a number of days equal to double the necrograft's item level. A black heart automatically recharges 1 hour of this duration for each hour this ability is not in use (up to its normal maximum). Additionally, you gain an enhancement bonus to saving throws against death effects, disease, mind-affecting effects, paralysis, poison, sleep effects, and stunning effects equal to the necrograft's mark, unless the effect specifies it functions against undead.
When you're fully graviton-attuned, as a standard action, you can pull any number of creatures within 20 feet of you closer. You choose which creatures are affected and which ones aren't. Each target must succeed at a Fortitude save or be pulled 10 feet toward you. The range of this revelation and the distance pulled increase by 5 feet at 5th level and every 4 levels thereafter. Solid objects do not block this ability, but any creature that runs into a solid object ceases moving closer to you. Creatures moved by this ability do not provoke attacks of opportunity from this movement. After you use this revelation, you immediately become unattuned. Black hole functions as a [[zenith revelation]] for the purposes of abilities that reference them.
name:black hole generator
range:medium
speed:—
damage:special
pcu:20
cost:25
special:[[gravity well|Gravity Well (starship weapon property)]]
<div class="statblock">
* ''Type'' poison (contact)
* ''Save'' Fortitude DC 26
* ''Track'' [[Constitution|Constitution Poison Track]] (special)
* ''Onset'' 1 minute
* ''Frequency'' 1/round for 6 rounds
* ''Effect'' progression track is //Healthy—Weakened—Debilitated—Dead//
* ''Cure'' 2 consecutive saves
</div>
<div class="table-wrapper">
|Substance | Level | Price |h
|black lotus extract | 20 | 121,000 |
</div>
//Blackraven axes// were magic weapons wielded by elite warriors of lost Golarion's far north who patrolled the border between the Lands of the Linnorm Kings and the witch-haunted nation of Irrisen. Many different //Blackraven axes// from pre-Gap Golarion have been found, and all are basic melee weapons with the [[archaic]] special property. A Blackraven axe typically has a head shaped like a raven's beak or a stylized raven inscribed on its blade, and it has the ability to cause its targets to burst into flames—a quality that proved especially useful against the trolls the original Blackravens faced. Modern spellcasters have recreated this magic as the //[[burning|Burning (weapon fusion)]]// weapon fusion. Modern //Blackraven axes// are often created by applying the //burning// weapon fusion to a tactical battleaxe. A tactical battleaxe is a 5th-level, one-handed advanced melee weapon that deals 1d8 slashing damage and has the [[wound]] critical hit effect. It has the [[analog]] special property, has 1 bulk, and costs 2,650 credits.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//Blackraven axe//, tactical | 5 | 3,370 | 1 |
</div>
<div class="statblock">
* ''Tier'' 20
* Supercolossal ultranought
* ''Speed'' 4; ''Maneuverability'' clumsy (turn 4); ''Drift'' 1
* ''AC'' 28; ''TL'' 28
* ''HP'' 1,050; ''DT'' 20; ''CT'' 210
* ''Shields'' heavy 280 (forward 70, port 70, starboard 70, aft 70)
* ''Attack (Forward)'' mass driver (2d6×10), ultra plasma cannon (9d6×10)
* ''Attack (Port)'' mass driver (2d6×10), negative-energy cannon (5d8), quantum missile launcher (2d8×10)
* ''Attack (Starboard)'' mass driver (2d6×10), negative-energy cannon (5d8), quantum missile launcher (2d8×10)
* ''Attack (Turret)'' gravity cannon (2d6×10), negative-energy cannon (5d8), negative-energy cannon (5d8)
* ''Power Core'' Heavy Titan (950 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic long-range sensors, [[crew quarters]] (common), mk 6 armor, mk 7 defenses, mk 10 mononode computer, mk 10 network nodes (3), [[slime-patch system]]; ''Expansion Bays'' [[cargo holds]] (35), [[hangar bays]] (24 Medium ships), [[arcane laboratory]], [[arcane mortuary]], [[escape pods]], general [[science lab]], [[sealed environment chamber]], [[tech workshop]]
* ''Modifiers'' +10 to any 4 checks per round, +2 [[Computers]], –1 [[Piloting]]
* ''Complement'' 3,000 (minimum 250, maximum 5,000)
!!! CREW
* ''Captain'' [[Diplomacy]] +34 (20 ranks), [[Engineering]] +30 (20 ranks), gunnery +26, [[Intimidate]] +34 (20 ranks), [[Piloting]] +30 (20 ranks)
* ''Engineer (5 officers, 150 crew each)'' [[Engineering]] +34 (20 ranks)
* ''Gunners (10 officers, 150 crew each)'' gunnery +31
* ''Pilot (1 officer, 150 crew)'' [[Piloting]] +34 (20 ranks)
* ''Science Officer (4 officers, 150 crew each)'' [[Computers]] +34 (20 ranks)
</div>
Only a few Blackwind Annihilators exist, and their origins are lost in the Gap. These mighty ultranoughts were already in orbit around Eox, fully armed and operational, when the first bone sages realized they had no memories of their previous centuries. The //Cruel Perdition// participated in the Magefire Assault; the damage it sustained from Absalom Station's defenders took several decades to repair, but it is now back online. //Heart's Decay// was lost during one of the major early battles in the war between the Pact Worlds and the Veskarium. Shortly after Eox signed the Absalom Pact, the then-captain of the //Empire of Bones// mutinied against his admiral, taking the vessel and most of its support ships to form the rebellious Corpse Fleet. In the years since then, Blackwind Engineering began construction on a new Annihilator, but has since left the vessel unfinished in its shipyards due to a lack of potential buyers.
A Blackwind Annihilator is often used as a flagship for its navy and is always assigned at least a small flotilla of other capital ships and smaller support craft. The ultranought is rarely risked in battles with large enemy armadas, instead being used as a blunt instrument to crush smaller fleets. When not employed as a weapon, it is often kept in reserve to protect major outposts and shipyards or to act as a mobile headquarters for task forces undertaking special missions.
!!! Macabre Military Might
<div class="statblock">
* ''Manufacturing Centers'' Eox (Orphys, Zinhew)
* ''Specialties'' Archetypal Eoxian military vessels
* ''Famous Models'' [[Annihilator|Blackwind Annihilator]], [[Catacomb|Barrow Catacomb]], Megalith, [[Sepulcher|Blackwind Sepulcher]]
</div>
When Pact Worlds citizens think about Eoxian starships, Blackwind Engineering dominates the imagination both visually and historically. The company made its mark on post-Gap records by supplying Eox's most notorious and feared starships during the Magefire Assault, and its reputation has only grown over time.
Blackwind was founded sometime during the Gap. Like its fellow Eoxian manufacturers, [[Death's Head]] and [[Thaumtech|Thaumtech Unlimited]], Blackwind lost an enormous amount of corporate data during that period. This erasure devastated the company for years, and it wasn't until the Magefire Assault in 7 AG that Blackwind made a comeback, debuting its now-infamous troop carriers and dreadnoughts.
The Veskarium truly learned to fear Blackwind ships at the Battle of Aledra. Catacomb dropships played a pivotal role, and Megalith dreadnoughts proved a worthy match for the mightiest Veskarium vessels. As a result of this victory, Blackwind rehabilitated its image in the eyes of Pact Worlds citizens, and the company saw a jump in profits as everyone in the system worked together against a common foe. Today, Blackwind ships are an accepted—and even admired—part of Pact Worlds history, with their red dome "eyes" and skeletal hulls featuring in the artistic depictions of many historic battles, and older models commonly appearing in museums. The Graven Repose, for example, rests at the Museum of Aerospace Heritage in Zo and is a popular tourist attraction.
Ships with bone-spur silhouettes have since become synonymous with Eoxian naval might. Blackwind ships are built for war and rarely accommodate living crews. Decommissioned military vessels have increased in popularity on the civilian market since the truce that ended the Silent War. The lack of traditional life support on these starship makes for spacious interiors, and they're popular with enthusiasts due to their fearsome appearance. Buyers seek out the novelty of owning a "real" Eoxian warship, and many pay extra if the ship had a prestigious tour of duty.
Tesheda Nyral (LE female damaya lashunta vampire) is one of the few Eoxian CEOs who is not an elebrian. For all her deadly cunning, Nyral has no memory of her early life, how she emerged from the Gap as CEO, or what her prior goals had been. Yet few can deny Nyral's subsequent success, though the recent peace has brought a slump to Blackwind's sales. Reports say Nyral has been displeased by this, and there's been a recent sharp increase in Blackwind ships acquired by the Corpse Fleet; rumor has it she's selling to the exiles.
''Manufacturer Perk:'' Blackwind ships are notoriously hostile towards living foes, and the company leans into this specialization. Reduce the BP cost to install [[antipersonnel weapons]] by 1, so long as the weapons used have the [[antibiological]] trait.
<div class="statblock">
* ''Tier'' 5
* Medium transport
* ''Speed'' 8; ''Maneuverability'' average (turn 2); ''Drift'' 2
* ''AC'' 20; ''TL'' 20
* ''HP'' 85; ''DT'' —; ''CT'' 17
* ''Shields'' light 60 (forward 15, port 15, starboard 15, aft 15)
* ''Attack (Forward)'' heavy EMP cannon (special), light laser cannon (2d4)
* ''Attack (Aft)'' gyrolaser (1d8)
* ''Attack (Turret)'' light torpedo launcher (2d8), light torpedo launcher (2d8)
* ''Power Core'' Pulse White (140 PCU); ''Drift Engine'' Signal Booster
* ''Systems'' basic computer, basic long-range sensors, [[crew quarters]] (common), mk 5 armor, mk 6 defenses; ''Expansion Bays'' [[cargo holds]] (5)
* ''Modifiers'' +2 [[Computers]]
* ''Complement'' 6
!!! CREW
* ''Captain'' gunnery +10, [[Intimidate]] +11 (5 ranks), [[Piloting]] +11 (5 ranks)
* ''Engineer'' [[Engineering]] +16 (5 ranks)
* ''Gunners (2)'' gunnery +10
* ''Pilot'' [[Piloting]] +11 (5 ranks)
* ''Science Officer'' [[Computers]] +13 (5 ranks)
</div>
Sepulchers are easily recognized by their dome-like bridge canopy, which resembles an eerie red eye. Though employed by plenty of private Eoxian corporations, their intimidating bone spurs make it hard to forget the ships' origin (and still common use) as troop transport for undead marines.
name:blade hull, heavy
range:1 hex
speed:—
damage:6d8
pcu:10
cost:17
special:—
name:blade hull, light
range:1 hex
speed:—
damage:3d8
pcu:5
cost:10
special:—
name:blade hull, super
range:1 hex
speed:—
damage:3d8 × 10
pcu:30
cost:40
special:—
You have learned how to damage your foes not just with light, but also with the absence of light. As a move action, you can choose a creature within 30 feet of you. For 1 round, or until you leave graviton mode, you gain a +1 bonus to weapon damage rolls against that creature. This bonus damage increases by 1 at 8th level and every 6 levels thereafter. While attuned or fully attuned, this bonus damage instead increases by 1 at 4th level and every 4 levels thereafter.
Blankets come in a variety of materials and styles. Traditional blankets are usually woven textiles, natural wool or fur from a variety of creatures, or synthetic fibers engineered for maximum comfort and warmth. Emergency or survival blankets are thin sheets of reflective polymer that both help you retain body heat and make you more visible to rescuers. Many people combine a blanket with a [[bedroll]] for greater comfort.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|blanket | 1 | 3 | L |
</div>
This weapon fires in a cone that extends only to its first range increment. You can't use it to attack creatures beyond that range.
For each attack you make with a weapon with the blast special property, roll one attack against each target in the cone, starting with those closest to you. Each attack takes a –2 penalty in addition to other penalties, such as the penalty to all attacks during a full attack. Roll damage only once for all targets. If you roll one or more critical hits, roll the extra critical damage only once (or any other special effects on a critical hit that require you to roll) and apply it to each creature against which you score a critical hit. You can't avoid shooting at allies in the cone, nor can you shoot any creature more than once.
Attacks with blast weapons ignore concealment. A blast weapon doesn't benefit from feats or abilities that increase the damage of a single attack (such as the operative's [[trick attack]]). Ammunition for blast weapons is designed for blast attacks, so you spend the usage amount only once for each cone of attacks.
<div class="statblock">
* <<levels>>
* ''School'' conjuration (creation)
* ''Casting Time'' 1 round
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Effect'' wall up to 20 feet high, 20 feet wide, and 5 feet thick
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You conjure a blast door up to 5 feet thick that blocks a hallway no more than 20 feet wide and 20 feet high. If the door would not completely block the targeted hallway, you can't cast this spell. Any creature in the spaces where the door appears is harmlessly shunted to a side of the door you choose. The door's statistics are those of a starship interior wall. It is airtight, and it protects against vacuum and radiation. When the spell ends, the door vanishes without a trace.
When you take a full action to line up a shot to smash an object, your weapon gains the [[penetrating]] weapon special property. If your weapon already has that weapon special property, using this discipline instead adds half your vanguard level to your weapon's item level for the purpose of calculating the amount of hardness that the penetrating special weapon property bypasses. When destroying an object with sudden force, you gain a bonus to the Strength check equal to your Constitution bonus. You must have [[Improved Combat Maneuver]] (sunder) to select this vanguard discipline.
The //blasting// fusion allows a weapon to make a single attack as a [[blast]] once per day as a full action. This attack has a maximum range of 30 feet and deals half the weapon's normal damage. Only ranged weapons that don't have the [[automatic]], [[explode]], [[line]], or [[thrown]] weapon special property can benefit from the //blasting// fusion. Weapons that don't require attack rolls to affect their targets also can't benefit from the //blasting// fusion.
Your entropic aura disintegrates obstacles on contact. When you forgo gaining an Entropy Point for charging when activating the [[entropic charge]] discipline, you can spend 1 or 2 additional Entropy Points. If you spend 1 Entropy Point, you dissolve any plant growth, rubble, or other nonmagical obstructions in your path that create difficult terrain, turning any such squares you move through during your charge into normal terrain. If you spend 2 Entropy Points, you also dissolve such obstructions in any squares adjacent to those squares you move through while charging. So long as you spend at least 1 Entropy Point in this way, any creatures that hit you with an attack of opportunity as you charge take 1d6 acid damage for every 2 vanguard levels you have (Reflex negates). You must have the [[entropic charge]] discipline to select this discipline.
A blaze rifle is a bulky, ungainly weapon, with a rifle stock and two tanks of petrol mounted atop the barrel. Compared to other petrol weapons, the blaze rifle fires a far narrower stream of petrol, which allows for greater accuracy. Fire-loving mercenaries often choose the blaze rifle to avoid charring their allies. Ifrit-, salamander-, hellhound-, firedrake-, and phoenix-class blaze rifles are common throughout the Pact Worlds.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|blaze rifle, ifrit-class | 4 | 1,900 | 1d10 F | 40 ft. | [[burn]] 1d6 | 40 petrol | 2 | 1 |[[analog]], [[unwieldy]] |
|blaze rifle, salamander-class | 7 | 5,800 | 2d8 F | 60 ft. | [[burn]] 2d6 | 40 petrol | 2 | 1 |[[analog]], [[unwieldy]] |
|blaze rifle, hellhound-class | 11 | 23,200 | 3d10 F | 60 ft. | [[burn]] 3d6 | 40 petrol | 2 | 1 |[[analog]], [[unwieldy]] |
|blaze rifle, firedrake-class | 16 | 153,000 | 5d10 F | 60 ft. | [[burn]] 4d6 | 40 petrol | 2 | 1 |[[analog]], [[unwieldy]] |
|blaze rifle, phoenix-class | 20 | 756,000 | 9d10 F | 80 ft. | [[burn]] 5d6 | 40 petrol | 2 | 1 |[[analog]], [[unwieldy]] |
</div>
A blaze scimitar is made of a metallic alloy that wielders can heat to blistering temperatures. These golden blades glow bright orange when activated and shed light in a wide area when they strike. These weapons are commonly used by Sarenrae's faithful, as they represent the perfect fusion of their goddess's sacred weapon with technology capable of illuminating the darkest corners of the galaxy.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|blaze scimitar, acolyte | 2 | 740 | 1d6 F | [[burn]] 1d6 | 1 |[[bright]], [[powered]] (capacity 20, usage 1) |
|blaze scimitar, disciple | 8 | 9,200 | 2d6 F | [[burn]] 1d8 | 1 |[[bright]], [[powered]] (capacity 20, usage 1) |
|blaze scimitar, cleric | 12 | 34,600 | 4d6 F | [[burn]] 2d6 | 1 |[[bright]], [[powered]] (capacity 40, usage 2) |
|blaze scimitar, divine | 16 | 162,000 | 8d6 F | [[burn]] 2d8 | 1 |[[bright]], [[powered]] (capacity 40, usage 2) |
</div>
As a move action, you can move up to your speed, gaining concealment against any attack made against you during the move, and you can leave a trail of flames in every square you pass through. The flames last for 1 round and deal 2d6 fire damage per square entered to anyone who moves into them. You can't move through another creature's space during this movement. If you use blazing orbit again, any flames you previously created with it go out. The damage from the flames increases by 1d6 at 8th level and every 2 levels thereafter.
When you are attuned or fully attuned, any creature damaged by the flames also gains the burning condition (1d6 fire damage).
When you hit a creature within 30 feet of you while using a weapon with the [[bright]] weapon special property, the radiance partially blinds the target, giving it the [[dazzled]] condition for 1 round. If you hit multiple creatures at the same time (such as with an [[automatic]], [[blast]], or [[explode]] weapon), only the creature nearest to you or at the center of the explosion (your choice if multiple creatures are equidistant) is affected.
The target gains the [[bleeding]] condition:
!! bleeding
{{Bleeding}}
You take the listed amount of damage at the beginning of your turn each round until this condition ends. Your bleeding can be stopped with a successful DC 15 [[Medicine]] check as a standard action, or through the application of any ability that restores Hit Points. If you take two or more bleed effects, you take only the damage from the worst effect.
The bleeding fusion weaves entropic energy into the weapon's form. The weapon gains the [[bleed]] critical hit effect. The amount of damage taken each round from this effect is equal to 1d6 per 5 levels of the weapon, rounded down. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the bleed effect. Only weapons that deal piercing or slashing damage can have this fusion.
Your [[biohacks]] include insidious anticoagulants. Any biohack inhibitor that you successfully use against a target also afflicts them with an amount of [[bleed]] damage equal to 1d10 + your key ability score modifier, in addition to the inhibitor's standard effects.
Weapons you wield that have the [[injection]] weapon special property gain [[bleed]] 1d4 as a critical hit effect. If the weapon already has the [[injection DC +2]] critical hit effect, you can apply both effects when you score a critical hit. If the weapon has another critical hit effect, apply either the weapon's normal critical hit effect or this bleed effect. The bleed damage increases to 2d4 at 11th level, 3d4 at 15th level, and 4d4 at 19th level.
For your [[debilitating trick]], you can afflict your target with an amount of [[bleed]] damage equal to your operative level.
Popularized by the half-orc game show gladiator Ketash the Mighty on Eoxian broadcasts, the //blender fist// is an adjustable metal wristband that can be worn on a non-cybernetic limb able to wield a weapon. You can activate the //blender fist// as a swift action, transforming the end of the equipped limb into a small field of whirling blades, dropping anything that was held by the limb in the process. While your //blender fist// is activated, you’re treated as armed, and you gain a special unarmed strike that deals 1d6 lethal slashing damage, threatens squares, and doesn’t count as [[archaic]]. This unarmed strike has the [[bleed]] 1d8 critical hit effect. You can deactivate the //blender fist// as a swift action, restoring your limb to its original form.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//blender fist// | 7 | 5,800 | L |
</div>
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one living creature
* ''Duration'' instantaneous
* ''Saving Throw'' Will negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
You rewind a living creature’s personal timeline to an earlier point in their life cycle, imbuing them with renewed vitality and restoring a number of Stamina Points. //Blessing of youth// ends the [[bleeding]] condition.
//Blessing of youth// restores a number of Stamina Points and applies bonuses to your target depending on the spell’s level.
* ''1st:'' When you cast //blessing of youth// as a 1st-level spell, it restores 1d8 Stamina Points plus grants a +5-foot enhancement bonus to the target’s land speed for 1 round.
* ''2nd:'' When you cast //blessing of youth// as a 2nd-level spell, it restores 3d8 Stamina Points plus grants a +5-foot enhancement bonus to the target’s land speed for 2 rounds.
* ''3rd:'' When you cast //blessing of youth// as a 3rd-level spell, it restores 5d8 Stamina Points plus grants a +5-foot enhancement bonus to the target’s land speed for 3 rounds.
* ''4th:'' When you cast //blessing of youth// as a 4th-level spell, it restores 7d8 Stamina Points plus grants a +10-foot enhancement bonus to the target’s land speed for 4 rounds.
* ''5th:'' When you cast //blessing of youth// as a 5th-level spell, it restores 9d8 Stamina Points plus grants a +10-foot enhancement bonus to the target’s land speed for 5 rounds. Additionally, it heals 1 temporary ability damage to each of the target’s ability scores.
* ''6th:'' When you cast //blessing of youth// as a 6th-level spell, it restores 11d8 Stamina Points plus grants a +10-foot enhancement bonus to the target’s land speed for 6 rounds. Additionally, it heals 2 temporary ability damage to each of the target’s ability scores.
Blight quartz is a rare crystal formed from condensed negative energy under the right exacting conditions. Though there is great danger of handling and transporting blight quartz, only small amounts are needed to alter ammunition and weapons. Blight quartz can’t be used to fashion armor. Those who regularly work with quantities of the dark crystals often complain of lingering headaches and terrible nightmares.
Weapons and ammunition made of blight quartz are especially dangerous when wielding against living creatures. Blight quartz weapons and ammunition gain a +2 enhancement bonus to damage rolls against living creatures (usually any creature without the [[unliving]] universal creature rule). For melee weapons, this enhancement bonus increases by 2 for every 6 item levels the weapon has, up to +8 at 18th level; this enhancement bonus increase doesn’t apply to ammunition. However, the negative energy infused in such weapons and ammunition might adversely affect their users. A living creature that wields or carries a blight quartz weapon or at least 10 pieces of blight quartz ammunition for at least 10 minutes a day must succeed at a Fortitude saving throw (DC = 12 + the item’s level) or gain the [[fatigued]] condition until they get 8 hours of complete rest. If the creature contains to wield or carry the ghost quartz item, though, they will have to attempt another save the next day.
!! Handling Blight Quartz
The majority of blight quartz deposits are no larger than light Bulk, but are quite dangerous in more concentrated amounts. A living creature carrying a quantity of blight quartz weighing at least light Bulk for at least 1 minute gains 1 [[negative level]]; similarly, a living creature within 5 feet of a deposit of at least 1 Bulk for at least 1 minute gains 1 negative level. This negative level can’t be overcome in any way (including magic) and persists as long as the creature’s proximity to the blight quartz continues, and disappears when these conditions end.
<div class="table-wrapper">
|Form | Cost |h
|Ammunition (1 piece) | +100 credits |
|Weapon | +8,500 credits |
|Raw material (1 bulk) | 1,750 credits |
</div>
The target must succeed at a Reflex saving throw or gain the [[blinded]] condition for 1d3 rounds.
<<section 'Blinded' >>
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' divination
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one creature
* ''Duration'' 1/day level; see text
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
You get a sense of the best way to interact with the target to encourage positive regard toward you. You gain a +2 circumstance bonus to Charisma checks, Charisma-based skill checks, and [[Sense Motive]] checks you attempt when interacting with the target. In addition, when you fail a Charisma check or Charisma-based skill check when interacting with the target, you can reroll the check as a reaction. However, if you attempt the reroll, the target receives a new saving throw against the spell. Taking hostile action against the target automatically ends the spell.
You are skilled at attacking opponents you can't clearly see.
''Benefit:'' In melee, every time you miss because of concealment, you can reroll your miss chance percentile roll one time to see if you actually hit.
You aren't [[flat-footed]] against melee attacks from creatures you can't see, and you can withdraw from creatures you can't perceive. You don't need to attempt [[Acrobatics]] checks to move at full speed while [[blinded]].
You cannot see. You are [[flat-footed]] and take a –4 penalty to Strength- and Dexterity-based skill checks and to opposed [[Perception]] skill checks. All checks and activities that rely on vision (such as reading and Perception checks based on sight) automatically fail. You can't observe other creatures, which means (among other things) that you treat all creatures as having total concealment (50% miss chance). You must succeed at a DC 10 [[Acrobatics]] skill check to move faster than half speed. If you fail this check, you fall [[prone]]. Characters who remain blinded for a long time grow accustomed to these drawbacks and can overcome some of them. Creatures that become blinded but that have a precise sense other than vision still automatically fail all checks and activities relying on vision, but they suffer none of the other effects.
An organic sac of ink (similar to that produced by a squid) is surgically implanted in the wrist of one of your hands. As a standard action, you can spray the ink in a 15-foot cone, even if you’re wielding something in that hand. All sighted creatures in the cone must succeed at a Reflex saving throw (DC = 10 + half your level + your Constitution modifier) or gain the [[blinded]] condition for 1d4 rounds. A creature can end the blinded condition early by wiping the ink from their eyes (or the eyes of an ally within reach) as a standard action.
Once you’ve used your blinding ink sac, you can’t use it again until you’ve rested for 10 minutes to regain Stamina Points, though you can spend 1 Resolve Point at any point to recharge it immediately.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|blinding ink sac | 6 | 4,500 | hand |
</div>
For your [[debilitating trick]], you can attempt to temporarily blind a target. The target must succeed at a Fortitude save or gain the [[blinded]] condition for 1 round. Once you've used this ability to attempt to temporarily blind a creature, that creature is immune to your blinding shot for 24 hours. You must have the [[bleeding shot]] exploit to learn this exploit.
<div class="statblock">
* ''Type'' disease (ingested)
* ''Save'' Fortitude DC 16
* ''Track'' [[physical]]
* ''Frequency'' 1/day
* ''Effect'' At the impaired state, the victim also becomes permanently [[blind|blinded]].
* ''Cure'' 2 consecutive saves
Blindmark rifles generate sonic frequencies through carefully aligned resonance in multiple magnetic cylinders positioned between the stock and the short muzzle of the weapon. When the rifle's shot hits a target, that target retains the resonance as a faint or subsonic tone useful for creatures that have [[blindsense]] (sound or vibration) or [[blindsight]] (sound or vibration). Multiple targets struck by the same blindmark rifle emit identical tones that can be distinguished only by location. Blindmark rifles are manufactured in thunderstrike, LFD (low-frequency device), HFD (high-frequency device), and banshee models.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|blindmark rifle, thunderstrike | 3 | 1,400 | 2d4 So | 60 ft. | — | 20 charges | 2 | 1 |[[echo]], [[stun]] |
|blindmark rifle, LFD | 8 | 9,800 | 2d8 So | 80 ft. | — | 40 charges | 5 | 1 |[[echo]], [[stun]] |
|blindmark rifle, HFD | 13 | 51,000 | 4d8 So | 100 ft. | [[sicken]] | 40 charges | 8 | 1 |[[echo]], [[stun]] |
|blindmark rifle, banshee | 19 | 585,000 | 8d8 So | 120 ft. | [[sicken]] | 80 charges | 10 | 1 |[[echo]], [[stun]] |
</div>
You can detect even subtle abnormalities in the natural exchange of heat around you. You gain [[blindsense]] (heat) with a range of 30 feet.
Blindsense is the ability to use an imprecise nonvisual sense (or a combination of senses) to operate effectively without vision. Blindsense operates out to a range specified in the creature's description.
A creature with blindsense typically perceives using a specific sense, which is indicated in parentheses after the blindsense entry in the creature's statistics. If the indicated sense somehow becomes unusable—say, for example, if a creature that uses sound to perceive through its blindsense becomes deaf—the creature loses access entirely to its blindsense. The typical senses through which creatures with blindsense can perceive are emotion, life, scent, sound, thought, and vibration.
If you have the blindsense special ability and succeed at a [[Perception]] check to notice an unseen creature, you become aware of the creature's location. Blindsense negates the bonuses to [[Stealth]] checks that an unseen creature would otherwise receive, but unseen creatures still have total concealment against the attacks of creatures with blindsense, and creatures with blindsense are still [[flat-footed]] against the attacks of unseen creatures.
//Format:// ''Senses'' blindsight (life) 60 ft.
//Guidelines:// Blindsense usually has a range of 60 feet.
Whenever you attempt a [[Computers]] check as part of your stunt and strike and succeed, instead of causing the target to become flat-footed, you gain [[blindsense]] (computers) 30 feet until the start of your next turn. This allows you to detect any creature carrying items that can be used with the Computers skill or can be connected to an infosphere (including personal [[comm units]]).
Your ability to detect anomalous atomic vibration improves. You gain [[blindsight]] (heat) with a range of 20 feet. You must have selected the [[blindsense|Blindsense (discipline)]] discipline or
have [[blindsense]] (heat) from another source before you select this discipline.
Blindsight is a precise nonvisual sense (or a combination of senses) that functions as a more potent version of [[blindsense]]. Blindsight operates out to a range specified in the creature's description.
A creature with blindsight typically perceives using a specific sense, which is indicated in parentheses after the blindsight entry in the creature's statistics. If the indicated sense somehow becomes unusable—say, for example, if a creature that uses scent to perceive through its blindsight loses its sense of smell— the creature loses access entirely to its blindsight. The typical senses through which creatures with blindsight can perceive are emotion, life, scent, sound, thought, and vibration.
If you have blindsight and succeed at a [[Perception]] check to notice a hidden creature, you are observing the creature. Blindsight negates concealment, //[[displacement]]//, [[invisibility|invisible]], magical darkness, and similar effects, though a creature with blindsight still can't perceive ethereal creatures (see the //[[ethereal jaunt]]// spell). A creature with blindsight cannot be [[blinded]] and is not subject to [[gaze]] attacks.
Blindsight is still limited in many ways compared to normal vision. Blindsight never allows a creature to distinguish color or visual contrast, though it might be able to make out other features depending on the sense. A creature cannot read written text with blindsight, though it could still use tactile communication. Blindsight works underwater and in fog or smoke, but it typically does not work in a vacuum (although this depends on the nature of the sense; for instance, emotion-based blindsight would work in a vacuum).
//Format:// ''Senses'' blindsight (life) 60 ft.
//Guidelines:// Blindsight usually has a range of 60 feet.
<div class="statblock">
* ''Tier'' 10
* N Large starship magical beast
* ''Speed'' 8; ''Maneuverability'' average (turn 2)
* ''AC'' 26; ''TL'' 26
* ''HP'' 190; ''DT'' —; 38
* ''Shields'' medium 200 (forward 50, port 50, starboard 50, aft 50)
* ''Attack (Forward)'' linked railgun (16d4), slam (6d8, [[ripper]])
* ''Attack (Turret)'' hurl debris (10d6)
* ''Power Core'' large telelith heart (300 PCU); ''Drift Engine'' none
* ''Systems'' mk 7 armor, mk 8 defenses; ''Expansion Bays'' [[telelith matrix]]
* ''Other Abilities'' auto-destruct, living starship, [[void adaptation]]
!!! CREW ACTIONS
* ''Engineer (1 action)'' [[Engineering]] +24 (10 ranks)
* ''Gunner (2 actions)'' gunnery +15 (10th level)
* ''Pilot (1 action)'' [[Piloting]] +24 (10 ranks)
!!! ECOLOGY
* ''Environment'' any vacuum or the Drift
* ''Organization'' solitary, pair, or cluster (3–4)
!!! SPECIAL ABILITIES
''Auto-Destruct ([[Ex]])'' When a blinking telelith drops to 0 Hull Points, it explodes as if it activated a self-destruct system.
''Hurl Debris ([[Ex]])'' A blinking telelith can hurl debris at short range. This weapon has the [[point]] (+8) special property.
''Living Starship ([[Ex]])'' A swarming telelith is a living creature so immense that it functions as a starship (and thus engages only in starship combat). It has no crew, but it can still take engineer, gunner, and pilot actions using the skill bonuses, ranks, and level listed above. Modifiers for its size, speed, and maneuverability have already been factored into its statistics. Use the table below when the swarming telelith takes critical damage. A telelith's brain can't gain the wrecked condition.
<div class= "table-wrapper">
| d% | System |Effect |h
| 1–30 | circulatory |System Condition applies to all gunner actions |
| 31–60 | nervous system |Condition applies to all pilot actions |
| 61–90 | heart |Condition applies to all engineer actions except patching or repairing the heart |
| 91–100 | brain |Condition applies to all actions |
</div>
''Slam ([[Ex]])'' A telelith can use its slam only against a target in an adjacent hex. This attack has the [[ripper]] special property.
''Telelith Matrix ([[Su]])'' Three times per day, a blinking telelith can attempt the telelith gambit stunt; it performs the maneuver if it succeeds at a DC 30 [[Piloting]] check.
</div>
<div class="statblock">
* Gargantuan mech (phase)
* ''Base HP'' 10; ''HP Advancement'' 9; ''Hardness'' 0
* ''EAC'' +1; ''KAC'' +2; ''Fort'' +0; ''Ref'' +1
* ''Speed'' 60 ft.; ''Strength'' +4
* ''Frame Slots'' 3; ''Aux Slots'' 5
* ''Operators'' 2–6
* ''Cost'' 4 × tier
</div>
This planar engine enables a vehicle to slip into the Ethereal Plane for moments at a time, making it appear to 'blip' out of existence. It must remain installed in a vehicle for 24 hours before it functions; when the modification is removed from the vehicle, the residual magic suppresses the effects of any other modification installed in that slot for 24 hours. The vehicle's pilot can activate a //blip-drive// as a swift action. Until the end of that turn, the vehicle, its passengers, and its contents pass through obstacles, including other creatures and vehicles, as if it were [[incorporeal]]. Additionally, the vehicle can't deal or be dealt collision damage except from sources that impede incorporeal movement, and the vehicle automatically disengages from all vehicles it's engaged with.
<div class= "table-wrapper">
|Modification | Level | Price | Capacity | Usage |h
|//blip-drive// | 16 | 175,000 | 5 | 1 |
</div>
The blitz fighting style is all about using speed and aggression to get into the thick of melee. You increase your speed and responsiveness, gain abilities that make you better at melee combat than your enemies, and keep on fighting even when surrounded by foes.
!! Rapid Response (1st)
You gain a +4 bonus to initiative checks and increase your land speed by 10 feet.
!! Charge Attack (5th)
As a standard action, you can make a charge without the charge penalties, and you can substitute a bull rush for the melee attack at the end of the charge. When you gain the soldier's onslaught class feature, you can make two attacks instead of one at the end of your charge, both with a –4 penalty.
!! Keep Fighting (9th)
As a move action, you can spend 1 Resolve Point to regain Stamina Points equal to 2d6 + your soldier level. You can't use this ability again until after you regain Stamina Points from a 10-minute rest. The number of Stamina Points you regain increases by 1d6 at 10th level, 15th level, and 20th level.
!! Perfect Opportunity (13th)
When you hit a creature with an attack of opportunity, that creature can't move out of the squares you threaten until the start of its next turn. In addition, when an enemy takes a guarded step out of a square you threaten, you can make an attack of opportunity against it with a –2 penalty to the attack roll. If the target provoked an attack of opportunity by moving, hitting with your attack of opportunity ends the target's movement immediately, preventing it from carrying out the rest of its movement.
!! Against the Odds (17th)
You gain a bonus to melee damage rolls equal to double the number of enemies within 10 feet of you. Enemies who don't constitute a significant threat (those with a CR equal to your level – 4 or less, or as determined by the GM) don't count when calculating this bonus.
Only melee weapons can have the block special property, which represents some kind of guard or crossbar that can protect you from attacks by a foe you strike in melee. When you successfully strike a target with a melee attack using such a weapon, you gain a +1 enhancement bonus to your AC for 1 round against melee attacks from that target.
You can deliver carefully placed slashing attacks.
''Benefit:'' When you score a critical hit with a weapon that deals slashing damage, in addition to any other critical hit effect you would normally apply, you also impose the [[dazzled]] condition on the target. The condition lasts until ended by any action or effect that would end the [[bleeding]] condition.
!!! Ancient Veskarium Shipbuilders
<div class="statblock">
* ''Manufacturing Centers'' Conqueror's Forge, Vesk Prime
* ''Specialties'' Military fighters and attack craft
* ''Famous Models'' [[Devastator|BMC Devastator]], [[Dmolangari|BMC Dmolangari]], [[Mauler|BMC Mauler]], [[Predator|BMC Predator]]
</div>
Based on the Veskarium capital world of Vesk Prime, the Blood Mountain Clans (BMC) trace their heritage back to before the Gap, when vesk inhabited only their own home world. The Veskarium had conquered all of Vesk Prime and looked to neighboring planets for its next conquest. Betting on a future beyond a single world, several vesk warrior clans inhabiting the Doshkoraz Mountains around the volcanic Blood Mountain joined forces and created an aerospace consortium that would catapult the Veskarium into space. The Blood Mountain Clans built the first spaceships that carried vesk to other worlds, and they have remained a major force in the Veskarium military-industrial complex ever since.
Now one of the Veskarium's most powerful corporations, the BMC prides itself on its warrior heritage, producing military starships for the Veskarium as well as for private sale. Based on Pact Worlds designs, the BMC built the Veskarium's first Drift engine, which took the vesk empire to the stars and into interstellar war with the Pact Worlds and the Swarm.
The BMC fared well in both the Silent War and the Swarm War, as its famous Mauler fighter was the Veskarium military's primary starfighter, used to great effect against both enemy factions. The core design of the [[BMC Mauler]] has remained virtually unchanged for almost 300 years, though its components have undergone regular updates. The Mauler remains the standard fighter of the Veskarium fleet, and the starship has been so successful and is so well known that many vesk use "mauler" as a synonym for any starfighter, whether or not it was built by the BMC.
The BMC's history and the Mauler's success have given the company a reputation for fierceness in both its corporate behavior and its starships' combat performance, a belief enhanced by the tendency of enthusiastic vesk pilots to ram their Maulers into opponents' ships in overzealous or last-ditch attacks. As a result, BMC ships are widely regarded as good ramming vessels, and ramming prows are a common weapon on larger BMC ships like the [[Devastator|BMC Devastator]]. The Mauler's usefulness for ramming has also made the fighter a favorite among the nihilistic Cult of the Devourer. Cultists can't usually acquire Maulers by legitimate means, however, instead resorting to theft, piracy, or hastily constructed shell corporations. BMC's leadership now faces a dilemma: how to prevent association with the Cult of the Devourer from tarnishing an otherwise famous brand.
''Manufacturer Perk:'' BMC ships are known for packing a punch when they ram other vessels. When using the [[ramming speed]] pilot stunt, a starship with a BMC frame is considered one size category larger when determining collision damage for a successful ramming attack.
Something in your ancestry has strengthened your innate magic and given it an arachnid twist.
''Prerequisites:'' Racial trait that grants a spell-like ability.
''Benefit:'' You can use //[[spider climb]]// once per day as a spell-like ability, using your character level as the caster level.
<div class="statblock">
* ''CR'' 7; ''XP'' 3,200
* NE Huge magical beast (cold)
* ''Init'' +2; ''Senses'' [[blindsight]] (thermal) 60 ft.; ''Perception'' +14
!!! DEFENSE
* ''HP'' 107
* ''EAC'' 19; ''KAC'' 21
* ''Fort'' +11; ''Ref'' +11; ''Will'' +6
* ''Defensive Abilities'' [[fast healing]] 5; ''Immunities'' cold
* ''Weaknesses'' [[vulnerable]] to fire
!!! OFFENSE
* ''Speed'' 30 ft., climb 20 ft.
* ''Melee'' slam +18 (2d6+12 B plus 1d6 C and [[grab]])
* ''Space'' 15 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' cold, rib cage prison
!!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' +4; ''Int'' +0; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +19 (+27 to climb), [[Intimidate]] +14, [[Survival]] +14
* ''Languages'' Vercite (can't speak any language)
!!! ECOLOGY
* ''Environment'' any cold (Verces)
* ''Organization'' solitary, pair, or clan (3–6)
!!! SPECIAL ABILITIES
''Cold ([[Su]])'' A bloodbrother's body generates intense cold, dealing 1d6 cold damage to any creature that hits it with a natural weapon or unarmed strike and to any creature the bloodbrother hits with its slam attack. A creature that begins its turn [[grappled]] by a bloodbrother also takes this damage.
''Rib Cage Prison ([[Su]])'' If a bloodbrother begins its turn grappling a creature that is Large or smaller, it can attempt a grapple combat maneuver as a standard action to transfer the creature into its rib cage prison. A creature in a bloodbrother's rib cage prison has the grappled condition. As a reaction, a bloodbrother can force a creature in its rib cage prison to attempt a DC 15 Fortitude saving throw; on a failed save, the creature takes 1 point of Constitution damage. Any round that a creature in its rib cage prison takes this Constitution damage, the bloodbrother gains [[fast healing]] 5 for that round only; the above statistics assume a bloodbrother has a Small animal with a current Constitution score of 5 (its maximum Constitution score is 10) trapped in its rib cage prison at the beginning of combat. A bloodbrother can have only one creature in its rib cage prison at a time; if it imprisons a new creature, it must release the creature currently in its rib cage. Releasing a creature does not require an action.
</div>
Usually confined to the glaciers that float upon the seas of Darkside—the side of tidally locked Verces that's always turned away from the sun and thus never feels its heat—the abominations known as bloodbrothers hunt smaller creatures for their vital essences.
Measuring over 15 feet tall and 11 feet long, a bloodbrother looks like a millipede or some other armored, wormlike arthropod from the waist down. Its upper half resembles that of a muscular humanoid with a set of bony appendages protruding from a cavity in its chest. This
ersatz rib cage can open like a fanged mouth, and when a bloodbrother places captured prey within it, the bones clamp down on the creature while the walls of the enclosure exude thin tendrilous suckers. These suckers tap into the prey's circulatory system. Rather than simply drinking its blood, though, the bloodbrother uses the trapped creature as an auxiliary heart, absorbing blood-borne nutrients and using the prey's metabolism to help it heat and feed itself. Prey can be kept alive in this way for months, until all its stored energy has been used up and the bloodbrother lets the lifeless husk fall to the ground.
A bloodbrother that hasn't fed in a long time is almost sheer white, its chitinous exterior drying out and splitting like the husk of a coconut into hairlike fibers—the better to hold on to snow and disguise the creature for its ambushes. Once it's successfully implanted a victim, however, its body takes on a purplish hue as it has rejuvenated with the flow of blood and vital fluids, while its fibrous hair lies back down and seals itself into smooth scales once more. This renewed appearance lasts for as long as the bloodbrother holds a victim and for several weeks thereafter.
Bloodbrothers' gruesome feeding habits mean that intelligent creatures with any knowledge of the magical beasts usually flee from them or kill them on sight. However, a hungry bloodbrother's fur is too stringy to be used as a pelt, and its meat tastes foul, meaning that hunting them provides nothing but a sense of bravado. As a result, the bloodbrother population on Verces has remained steady—and luckily small—for millennia. Their need for regular victims in an environment hostile to most life means that bloodbrothers usually live alone, though they may occasionally gather into small packs called clans. Even during times when prey is scarce, these bloodbrothers don't cannibalize one another. Instead, they migrate toward more inhabited areas, fearlessly taking on overwhelming odds if it means refreshing the blood in their veins.
Despite their name—a moniker assigned to them not by themselves but by humanoid Vercites—bloodbrothers have no sense of gender, and they reproduce asexually. At a certain point in a bloodbrother's life, a handful of small, furry nodules appears along its spine. Biologists disagree on the exact conditions that cause this; some believe it is a rise in temperature, while others posit that reproduction requires specific nutrients in the blood of the creature's most recent victim. As the months pass, the buds grow in size (and furriness) until they are about a foot across. Then, with a series of sickening squelches, these bulbs fall off the parent bloodbrother into the surrounding snow and ice. A few moments later, they uncurl into several immature bloodbrothers that are eager to entrap their first victims (usually tiny mammals or birds). In less than a year, a young bloodbrother reaches its full size and ferocity.
Despite their horrific and merciless nature, bloodbrothers are not mere beasts and are actually as intelligent as the average human. This facet of their nature is often overlooked due to both their lack of tool use and their apparent lack of interest in communication with other races. "Interest" is the operative word here, for while bloodbrothers have no language of their own, they appear to be able to understand those of others—they simply don't care to speak. Communication with other members of a clan is conducted entirely through actions, physical touch, and some form of advanced intuition into the other's needs, perhaps aided by pheromones or other signals not yet detected by researchers.
Bloodbrothers typically make their home in ice caves or stone caverns, patrolling the surrounding area for easy-to-capture prey. In the case of a clan, one member typically stays behind to protect the caves and any offspring therein, while those hunting return with an extra captive or two for them. When resting, the bloodbrothers slither onto one another to form one large pile. The blood-drained corpses of their pray lie scattered about the caves, eventually getting buried in the snow and ice, and trackers are quick to recognize a bloodbrother clan's lair by the massive number of bones that can be found poking from the floor and walls.
!! Bloodbrother Serum
Local Darkside tribes and bold big-game hunters sometimes harvest the vital fluids of a bloodbrother's body to make //bloodbrother serum//: a magical liquid that can inure the drinker against cold and fortify its natural healing. The most famous and prolific alchemists to brew this concoction are the Ascetics of Nar, the brilliant scholar-monks who reside in the Fastness of the Ordered Mind. From their frozen fortress, these zealots seek to understand and manipulate the basic order of the universe, seeing it reflected in the crystalline structure of snow and ice. While the greatest of them conduct their meditations in the freezing wastelands without protection, suffering terribly from frostbite until they're no longer able to care for themselves, others prefer to imbibe potions such as //bloodbrother serum// to allow themselves to walk the ice floes beneath the twinkling stars without pain or fear, the better to improve the communion with the universe's frozen oneness.
{{Bloodbrother Serum}}
//Bloodbrother serum// is made from rare alchemical reagents and the vital fluids of the eponymous beast. When the serum is consumed, you gain cold [[resistance]] 5 and regain 2 Hit Points per round for 5 rounds.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//bloodbrother serum// | 5 | 500 | — |
</div>
This figure of green stone mottled with red flecks can change into a [[bloodbrother]]. The bloodbrother starts with no creature in its rib cage prison and can't deal Constitution damage, so it lacks [[fast healing]]. If the bloodbrother reverts to figurine form while a victim is in the bloodbrother's rib cage prison, the victim is released in the bloodbrother's space.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//bloodstone bloodbrother// | 13 | 48,000 | L |
</div>
Stacking plans within plans, blue dragons obsessively dwell on their pet projects.
* ''Required Creature Type and Subtype:'' dragon (earth)
* ''Suggested Alignment:'' lawful evil
* ''Traits:''
** [[blindsense]] 60 feet and [[darkvision]] 120 feet
** [[immunity]] to electricity, paralysis, and sleep
** [[DR]] 5/magic (CR 11+; increase to DR 10/magic at CR 13, DR 15/magic at CR 15, DR 20/magic at CR 17)
** [[SR]] 11 + CR (CR 12+)
** burrow speed of 60 feet
* ''Abilities:''
** [[breath weapon]] (line 30 feet + 10 feet per 2 CR, 1d8 E + 1d8 per CR)
** [[frightful presence]] (CR 9+, 60 feet + 10 feet per CR)
** spell-like abilities (CR 9+)
** sound imitation (see below)
* //Sound Imitation ([[Ex]]):// A blue dragon can mimic any voice or sound it has heard by succeeding at a [[Bluff]] check opposed by a listener's [[Sense Motive]] check.
<div class="statblock">
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 17
* ''Track'' [[Constitution|Constitution Poison Track]] (special)
* ''Frequency'' 1/round for 2 rounds
* ''Effect'' progression track is //Healthy—Weakened—Unconscious//; no end state.
* ''Cure'' 1 save
</div>
<div class="table-wrapper">
|Substance | Level | Price |h
|blue whinnis | 7 | 1,000 |
</div>
You can use words and actions to create distractions, misdirect your opponents, tell convincing lies, and pass along secret messages.
<$list filter="[tag<currentTiddler>tag[Tasks]]">
<$macrocall $name="collapse" tiddler={{!!title}}/>
</$list>
<div class="statblock">
* ''Tier'' 14
* Gargantuan carrier
* ''Speed'' 6; ''Maneuverability'' poor (turn 3); ''Drift'' 1
* ''AC'' 27; ''TL'' 25
* ''HP'' 330; ''DT'' 10; ''CT'' 66
* ''Shields'' medium 140 (forward 35, port 35, starboard 35, aft 35)
* ''Attack (Forward)'' mass driver (2d6×10, 20 hexes), massive ramming prow (2d4×10; 1 hex)
* ''Attack (Port)'' heavy laser array (6d4; 5 hexes), heavy torpedo launcher (5d8; 20 hexes)
* ''Attack (Starboard)'' heavy laser array (6d4; 5 hexes; array), heavy torpedo launcher (5d8; 20 hexes)
* ''Attack (Turret)'' linked light particle beams (6d6; 10 hexes)
* ''Power Core'' Gateway Heavy (400 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic computer, budget long-range sensors, crew quarters (common), mk 7 armor, mk 6 defenses; ''Expansion Bays'' [[hangar bays]] (2; 16 [[BMC Maulers|BMC Mauler]]), shuttle bay ([[BMC Predator]])
* ''Complement'' 150 (minimum 75, maximum 200) plus 50 Mauler and Predator pilots
!!! CREW
* ''Captain'' [[Diplomacy]] +25 (14 ranks), [[Engineering]] +25 (14 ranks), gunnery +20 (14th level), [[Intimidate]] +30 (14 ranks), [[Piloting]] +25 (14 ranks)
* ''Engineers (5 officers, 12 crew each)'' [[Engineering]] +25 (14 ranks)
* ''Gunners (6 officers, 10 crew each)'' gunnery +20 (14th level)
* ''Pilot (1 officer, 5 crew)'' [[Piloting]] +30 (14 ranks)
* ''Science Officers (2 officers, 5 crew each)'' [[Computers]] +25 (14 ranks)
</div>
The Veskarium is not generally known for its subtlety, and neither are the starships of the [[Blood Mountain Clan]]. This trend is perhaps best exemplified by the BMC Devastator, which brings the unflinching boldness of the vesk to new heights. Designed as a smaller, faster, and cheaper carrier-focused alternative to the mighty [[Vindicas Tyrant]], the Devastator is a newer design developed during the Swarm War. In contrast to most carrier designs that are intended to project power from a relatively safe distance, the Devastator is designed to get up close and personal.
The Veskarium's standard tactical doctrine for the Devastator is for the carrier to deploy its complement of 16 [[BMC Mauler]] starfighters, then accelerate toward the greatest threat on the battlefield until it can ram the enemy vessel, softening up its target with its forward mass driver along the way. Outfitted with a massive ramming prow and reinforced frame to absorb much of the kinetic energy released by such collisions, the Devastator is perfectly suited for such unorthodox tactics. The carrier is relatively lightly armored and shielded for a ship of its size, relying instead on its accompanying fighters and secondary armaments for defense. Piloting a Devastator using these traditional tactics is not for the faint of heart, and it is not uncommon for even seasoned pilots to spend significant time studying these ships before daring to take the helm.
The efficacy of this doctrine was proved in 294 AG at the Battle of Kesta-vol, a key engagement in the Swarm War. Unaccompanied by any other Veskarium capital ships, a flotilla of six Devastators was ordered to defend Kesta-vol, a Veskarium colony world in Near Space, against an invading Swarm fleet that outnumbered them three to one. While their fighters targeted the Swarm's landing ships and smaller fighters, the Devastators inflicted massive damage on the capital ships with their ramming attacks. The remnants of the Swarm fleet withdrew into the Drift, leaving Kesta-vol in Veskarium hands with the loss of only three Devastators.
<div class="statblock">
* ''Tier'' 11
* Huge bulk freighter
* ''Speed'' 10; ''Maneuverability'' poor (turn 3); ''Drift'' 1
* ''AC'' 25; ''TL'' 26
* ''HP'' 200; ''DT'' 5; ''CT'' 40
* ''Shields'' heavy 280 (forward 70, port 70, starboard 70, aft 70)
* ''Attack (Forward)'' supermaser (2d8×10; 20 hexes)
* ''Attack (Aft)'' gravity gun (6d6; 10 hexes)
* ''Attack (Turret)'' light plasma torpedo launcher (3d8; 20 hexes), light torpedo launcher (2d8; 20 hexes)
* ''Power Core'' Nova Heavy (2; 400 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' budget short-range sensors, crew quarters (common), mk 6 armor, mk 8 defenses, mk 2 duonode computer; ''Expansion Bays'' [[cargo holds]] (6), [[shuttle bay]], [[tech workshops]] (2)
* ''Modifiers'' +2 any two checks per round, –1 [[Piloting]]
* ''Complement'' 50 (minimum 20, maximum 50)
!!! CREW
* ''Captain'' [[Diplomacy]] +20 (11 ranks), gunnery +16 (11th level), [[Intimidate]] +25 (11 ranks), [[Piloting]] +19 (11 ranks)
* ''Chief Mates (3)'' [[Athletics]] +25 (11 ranks)
* ''Engineers (3 officers, 7 crew each)'' [[Engineering]] +20 (11 ranks)
* ''Gunners (3 officers, 4 crew each)'' gunnery +16 (11th level)
* ''Pilot (1 officer, 4 crew)'' [[Piloting]] +19 (11 ranks)
* ''Science Officers (2)'' [[Computers]] +20 (11 ranks)
</div>
Named for one of the mightiest mountain ranges on Vesk Prime, the [[Blood Mountain Clan]]'s Dmolangari-class combat supply ship is a near-ubiquitous vessel in both the Veskarium's military and commercial navies. Since the end of the Silent War in 291 AG, the Dmolangari has regularly appeared hauling freight throughout the Pact Worlds as well as the Veskarium—a stark contrast to the feared Veskarium warships encountered in generations past.
Though the ship was originally designed as a combat-capable support vessel for the Veskarium's interstellar wars of conquest, a large share of existing Dmolangaris and their crews have taken up civilian contracts, making these starships some of the best-equipped freighters in current widespread use. The Veskarium military continues to use the Dmolangari in its original role and regularly updates its design, while also leveraging the peace afforded by the current Veskarium-Pact Worlds alliance to sell the ship on the civilian market.
For all the tales of its invincibility, the Dmolangari struggles under certain circumstances. The starship is slightly too large to land safely on most planets, restricting it to docking with space stations or relying on smaller shuttles to ferry goods while the freighter remains in orbit. Additionally, some sites of the Veskarium's failed conquests still associate these starships with bitter invasions, with saltier port authorities denying safe harbor to even the most peaceful Dmolangari crews.
Heavily armored and shielded, the Dmolangari is primarily designed to be able to take a beating and still deliver its cargo in one piece, though it is more than capable of holding its own in battle. The Dmolangari can deliver a lethal punch to opponents with its capital-scale supermaser, while its aft gravity gun also doubles as a tractor beam for support duties like recovery, salvage, and towing. Turret-mounted torpedoes round out the Dmolangari's armaments. The Dmolangari is also equipped with an integral shuttle bay—those in Veskarium military service usually a carry a single [[BMC Predator]], giving each freighter its own defensive escort.
In addition to the standard model, BMC also offers a transport variant of the Dmolangari, replacing the stock vessel's cargo holds with passenger seating and giving it the capability to shuttle up to 96 combat-ready troops.
<div class="statblock">
* ''Tier'' 2
* Tiny fighter
* ''Speed'' 10; ''Maneuverability'' good (turn 1); ''Drift'' 1
* ''AC'' 19; ''TL'' 18
* ''HP'' 35; ''DT'' —; ''CT'' 7
* ''Shields'' basic 40 (forward 10, port 10, starboard 10, aft 10)
* ''Attack (Forward)'' light plasma cannon (2d12), tactical nuclear missile launcher (5d8)
* ''Attack (Aft)'' flak thrower (3d4)
* ''Power Core'' Pulse Brown (90 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' advanced mid-range sensors, mk 5 armor, mk 5 defenses, mk 1 mononode computer
* ''Modifiers'' +1 any one check per round, +4 [[Computers]], +1 [[Piloting]]
* ''Complement'' 2
!!! CREW
* ''Pilot'' [[Computers]] +11 (2 ranks), gunnery +6, [[Piloting]] +12 (2 ranks)
* ''Gunner'' gunnery +6
</div>
While Maulers can be flown in combat by a single person, making them popular with bounty hunters and other lone wolves, militaries usually staff them with two: a pilot seated upright in the bubble canopy, and a gunner behind the pilot operating via screens.
<div class="statblock">
* ''Tier'' 9
* Small shuttle
* ''Speed'' 10; ''Maneuverability'' perfect (turn 0); ''Drift'' 5
* ''AC'' 26; ''TL'' 24
* ''HP'' 45; ''DT'' —; ''CT'' 9
* ''Shields'' medium 100 (forward 25, port 25, starboard 25, aft 25)
* ''Attack (Forward)'' linked light plasma cannons (4d12; 5 hexes)
* ''Attack (Turret)'' flak thrower (3d4; 5 hexes)
* ''Power Core'' Pulse Orange (250 PCU); ''Drift Engine'' Signal Ultra
* ''Systems'' advanced short-range sensors, crew quarters (good), mk 2 trinode computer, mk 5 defenses, mk 6 armor, security (advanced [[cloaking device]], anti-hacking systems, computer countermeasures [shock grid rank 1], [[self-destruct system]]); ''Expansion Bays'' [[brig]], [[life boat]], [[tech workshop]]
* ''Modifiers'' +2 to any three checks per round, +4 [[Computers]] (sensors only), +2 [[Piloting]]
* ''Complement'' 1 (minimum 1, maximum 4)
!!! CREW
* ''Pilot'' [[Computers]] +17 (9 ranks), [[Engineering]] +17 (9 ranks), gunnery +15 (9th level), [[Piloting]] +24 (9 ranks)
</div>
The Blood Mountain Clans' original Predator design was meant to address some of the Mauler's perceived weaknesses, but it was considered too flashy and expensive for regular use. Nevertheless, the Predator remains a powerful and innovative starship, and the military does issue the vessel to ace pilots who can handle its complex controls.
You can board or disembark from a vehicle as a move action. Doing so while the vehicle is in motion requires a successful [[Acrobatics]] or [[Athletics]] check.
When the fleet succeeds at a [[flyby]] stunt, a portion of its crew boards and begins damaging the enemy fleet. During the gunnery phase, the fleet attempts a bonus gunnery check to resolve the boarding party's attack. If it succeeds, the boarders deal half the fleet's damage and continue attacking on subsequent gunnery phases. If the gunnery check fails, the boarders are captured, and the effect ends.
<div class= "table-wrapper">
|Ability | BP Cost | Fleet Type |h
|boarders | 2 | [[destroyer|Destroyer-Class Fleet]], [[fighter|Fighter-Class Fleet]] |
</div>
When a starship launches a boarding party, the party's maximum size equals 20% of the attacking starship's complement or 4 combatants, whichever is higher. Some options, such as breaching pods, are exceptions that provide a different maximum size.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
A vehicle equipped with a boarding clamp utilizes a close-range tractor beam, clamps, and tethers to easily attach to other vehicles. A vehicle with a boarding clamp grants its pilot a +2 circumstance bonus to Piloting checks made to [[engage|Engage Another Vehicle]] a vehicle and grants its passengers a +2 circumstance bonus to [[Acrobatics]] and [[Athletics]] checks made to board a vehicle. Additionally, the DC of Piloting checks to [[break free]] from a vehicle equipped with a boarding clamp is increased by 2.
<div class= "table-wrapper">
|Modification | Level | Price |h
|board clamp | 7 | 6,750 |
</div>
!! Anchoring Weapons
If a starship uses a weapon with the [[anchoring]] special property and begins the gunnery phase adjacent to the ensnared target, the gunner can use the [[shoot]] crew action to secure the target. If successful, the attack deals no damage, but the gunner's ship can send one boarding party aboard the enemy starship.
!! Breaching Pods
[[Breaching pods]] fly teams of combatants toward a target, much like a tracking weapon. Upon impact, a breaching pod's prow pierces a hole in the target, allowing the combatants to pour into the starship. Due to their size and composition, breaching pods can't pierce any quadrant with Shield Points.
!! Injected Pathogen
Some creatures can inject dangerous biological agents into a starship. When calculating its boarding statistics, the pathogen's tier equals the creature's tier, and the pathogen's complement modifier is +0. In addition to fending the pathogen off as though it were a boarding party, a defending officer can use environmental controls to weaken the pathogen as an open crew action with a [[Life Science]] check (DC = 10 + 1-1/2 × the creature's tier). If successful, all pathogen boarding parties take a –4 penalty to their next boarding attack before the end of the next round.
!! Ramming
When a starship successfully rams and deals damage to another starship's Hull Points, an officer can direct a boarding party to invade the targeted starship as an open crew action during the gunnery phase that round.
This elegant tailored suit resembles a platinum [[AbadarCorp travel suit]] and has the same statistics as that armor. In addition, sigils of divination woven into the fabric of the suit subtly alert you to lies. When wearing a suit of [[boardroom attire]], roll twice when attempting [[Sense Motive]] checks to detect deception and use the higher result. In addition, you never think a truthful statement contains deceptions, even if you fail your check by 5 or more.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//boardroom attire// | 14 | 62,500 | L |
</div>
These craft enable travel on the surfaces of liquids, such as water, using a wide variety of propulsion methods.
* ''Passengers:'' 2
* ''Cover:'' Partial cover
* ''Speed (Full):'' speed × 15
* ''Modifiers:'' +0 [[Piloting]], –2 attack (–4 at full speed)
<div class="statblock">
* ''Levels'' <<levels>>
* ''School'' illusion
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Target'' two creatures; see text
* ''Duration'' 1 round/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
Upon casting this spell, choose a primary target and a secondary target, both within range. If the primary target fails or forfeits its saving throw, its appearance, scent, sounds, and mannerisms change to match those of the secondary target.
As long as the two targets are of the same size category, they are indistinguishable. As a consequence, if the targets are adjacent and a creature takes an action that would affect one of the targets (such as an attack, a targeted spell, or an area effect), that action has a 50% chance of affecting the other target instead. Any action that would affect both creatures affects them both normally.
This spell doesn't deceive creatures under the effects of //[[true seeing]]//. Likewise, a creature that can't perceive one of the targets isn't fooled by this spell (even if the spell fooled that creature earlier), and its attacks, targeted spells, and other actions affect targets as normal.
You can attempt to ward off attacks that target nearby allies.
''Benefit:'' As a reaction when an adjacent ally is attacked, you can grant that ally a +2 circumstance bonus to its AC against that attack. If you do so, you take a –2 penalty to your own Armor Class until the beginning of your next turn.
This shield-shaped armor plate pulses with magical energy when another upgrade of the same type is nearby. When an ally within 30 feet who is also wearing a //bodyguard module// takes damage, you can spend 1 Resolve Point as a reaction to cause the target to take only half the damage, and you take the amount of damage not taken by the target. The damage you take can't be negated, reduced, or redirected in any way. Forms of harm that do not involve Hit Points or Stamina Points, such as ability drain, charm effects, death effects, permanent negative levels, and temporary ability damage, are not affected.
This upgrade can be installed only in heavy or powered armor.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|//bodyguard module// | 11 | 24,400 | 1 | heavy, powered | L |
</div>
''Required Feat:'' [[Bodyguard]]
When you use the [[Bodyguard]] feat, it requires no action, but you must spend 1 Resolve Point each time after the first you use the Bodyguard feat during a single round, and each use must designate a different ally. Multiple uses of the Bodyguard feat don't increase the penalty to Armor Class that you take using this feat. If you also have [[In Harm's Way]], each round you can use that feat to intercept one attack per target whose AC you have increased with the Bodyguard feat.
<div class="statblock">
* ''CR'' 10; ''XP'' 9,600
* N Medium ooze
* ''Init'' +5; ''Senses'' [[blindsight]] (vibration) 60 ft.; ''Perception'' +19
!!! DEFENSE
* ''HP'' 140
* ''EAC'' 23; ''KAC'' 23
* ''Fort'' +11; ''Ref'' +8; ''Will'' +11
* ''Defensive Abilities'' share body; Immunities [[ooze immunities]]
!!! OFFENSE
* ''Speed'' 20 ft., climb 20 ft.
* ''Melee'' slam +20 (2d8+14 B plus [[grab]])
* ''Offensive Abilities'' bodysnatch
!!! STATISTICS
* ''Str'' +4; ''Dex'' +5; ''Con'' +5; ''Int'' –1; ''Wis'' +2; ''Cha'' –1
* ''Skills'' [[Athletics]] +19 (+27 to climb), [[Bluff]] +24, [[Disguise]] +19, [[Stealth]] +24; see neural integration
* ''Languages'' See neural integration.
!!! ECOLOGY
* ''Environment'' any land
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Bodysnatch ([[Ex]])'' This ability functions as the bodysnatcher slime ability, but the autocrat
can infest a Medium, Large, or Huge creature (Fortitude DC 19 negates). The autocrat can also use any of the creature's supernatural abilities. It takes a DC 25 [[Medicine]] check to expel an autocrat, and each failed check deals the host 2d6 damage.
''Neural Integration ([[Su]])'' This ability functions as the bodysnatcher slime ability, but the skill bonus is +19.
''Share Body ([[Ex]])'' This ability functions as the bodysnatcher slime ability, but the autocrat leaves the host only after taking 70 or more damage.
</div>
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* N Small ooze
* ''Init'' +3; ''Senses'' [[blindsight]] (vibration) 60 ft.; ''Perception'' +8
!!! DEFENSE
* ''HP'' 33
* ''EAC'' 14; ''KAC'' 14
* ''Fort'' +4; ''Ref'' +2; ''Will'' +4
* ''Defensive Abilities'' share body; ''Immunities'' [[ooze immunities]]
!!! OFFENSE
* ''Speed'' 20 ft., climb 20 ft.
* ''Melee'' slam +9 (1d4+5 B plus [[grab]])
* ''Offensive Abilities'' bodysnatch
!!! STATISTICS
* ''Str'' +2; ''Dex'' +3; ''Con'' +2; ''Int'' –3; ''Wis'' +0; ''Cha'' –1
* ''Skills'' [[Athletics]] +8 (+16 to climb), [[Disguise]] +8, [[Stealth]] +13; see neural integration
* ''Languages'' see neural integration
!!! ECOLOGY
* ''Environment'' any land
* ''Organization'' solitary or heist (2–5)
!!! SPECIAL ABILITIES
''Bodysnatch ([[Ex]])'' If a bodysnatcher slime starts its turn grappling a Small, Medium, or Large living creature, the slime can distribute itself throughout that creature's body as a swift action (Fortitude DC 14 negates). While infesting a creature in this way, a bodysnatcher slime has total cover and can take no actions. However, it controls the infested creature's (host's) actions, including using equipment and weapons (using the slime's attack bonus), using the slime's or its host's saving throw bonuses (whichever is higher), using the host's extraordinary abilities, and using the slime's or its host's natural attacks. After 24 hours inside a body, a bodysnatcher slime must succeed at a DC 14 Fortitude save or be forced out of the body and be unable to infest that same creature for 24 hours. If it succeeds at the save, it can continue infesting that creature for another 24 hours. A creature adjacent to a [[pinned]] or [[helpless]] host can attempt a DC 15 [[Medicine]] check as a full action to force the slime to vacate the host and move into an adjacent square. Bodysnatch is a compulsion effect that works on a living creature or the intact corpse of a living creature. The corpse can save as if it were its living version.
''Neural Integration ([[Su]])'' While in a host, a bodysnatcher slime integrates with the creature's neural physiology. The slime can speak and understand one language the host knows, use the host's weapon proficiencies, and use three of the host's trained skills with a +8 total bonus.
''Share Body ([[Ex]])'' Any damage dealt to a bodysnatcher slime's host is split between the host and the slime. If a bodysnatcher slime takes 16 or more damage while in a host, the slime leaves the host, moving into an adjacent square, and cannot infest that host again for 24 hours.
</div>
<<section 'Bodysnatcher Autocrat'>>
Purportedly born from some ill-informed experiment performed during the Gap, bodysnatcher slimes are parasitic organisms that commandeer hosts to experience life through their senses. Unlike most oozes, these slimes contain a complex yet amorphous neural network that enables learning, memory, and reasoning. These neurons can also integrate with a host's nervous system, enabling nearly instantaneous communication between the two beings. Studies suggest the slimes replicate and absorb copies of their hosts' neurons, so hypothetically, a prolific slime could grow smarter over time.
In most cases, though, a bodysnatcher slime never grows to occupy more than several cubic feet. Replicating neurons grants the slime greater control over its form, allowing it to grow and still coordinate its movements and metabolism. However, bigger oozes find it more difficult to fit inside hosts without causing the body to bulge such that it betrays the parasite's presence. Furthermore, the slime's modified neural network can develop multiple personalities that compete for resources and control. Ultimately, such a creature splits and forms two new slimes, each of which begins rebuilding the vast stores of knowledge and neurons that it lost in the process. Rarely, an ooze retains control over its growing mental prowess and so avoids splitting. These rare [[bodysnatcher autocrats]] selectively infest hosts they perceive as powerful.
As with humanoid brains, a slime's neural network requires the slime to consume a large number of calories to sustain it While infesting a host, the slime draws its necessary nutrients from the host's body and digestive system; this process adds a faintly citrus scent to the host's sweat and excrement. However, without a host, a bodysnatcher slime can absorb nutrients from a wide variety of foods, favoring high-calorie options like sugars and flesh. When denied sustenance, the slime can enter hibernation, awaiting suitable prey for months at a time.
Bodysnatcher slimes aren't malicious, but they are insidious. When spoken to, they are baffled by claims that abducting others is reprehensible. Given the oozes' simple physiology and psychology, this mindset likely results from a lack of higher thought processes and capacity for self-reflection. However, bodysnatcher slimes grow increasingly ambitious the longer they spend in hosts and the larger they become, suggesting a moral compass doesn't accompany greater intelligence.
Having stowed away on countless ships, the slimes have spread across the Pact Worlds, the Veskarium, and beyond. Stewards officers have logged several reports of people having extended blackouts and behaving strangely on Absalom Station, and although several operations have cornered and eliminated bodysnatcher slimes, the reports continue to come in. With increasing frequency, authorities contract independent trackers to eliminate these slimes; as such, the bodysnatchers have learned to recognize and avoid the Stewards. The oozes are common on Verces, where hosts have dispersed these parasites along the habitable Ring of Nations. Several cohorts of the Augmented have designated bodysnatcher slimes not as enemies but as intelligent biotech that they accept into their bodies.
!! Bodysnatcher Implants
Bioengineers can dilute the chemicals that allow a bodysnatcher slime to control a host; uses include sedating medical patients and suppressing neurological activity. Incorporated into a special biotech gland, this same technology can protect users against mental attacks.
{{Cerebral Countermeasures}}
<div class="statblock">
* Huge mech (amphibious)
* ''Base HP'' 10; ''HP Advancement'' 8; ''Hardness'' 0
* ''EAC'' +2; ''KAC'' +4; ''Fort'' +2; ''Ref'' +0
* ''Speed'' 30 ft., swim 60 ft.; ''Strength'' +4
* ''Frame Slots'' 2; ''Aux Slots'' 2
* ''Operators'' 1–2
* ''Cost'' 2 × tier
</div>
Bolidas are arthropodan creatures that dwell not on the faces of the planets they inhabit, but far underground, in cave systems that are so deep below the surface that they are blasted by the unforgiving heat of the planets' molten cores. The centipede-like creatures are protected from these extreme environs by metallic, chitinous plates that cover the entirety of their backs, from head to tail tip. This innate armor also protects them from subterranean hazards such as rock falls and the friction of traveling through cramped cave tunnels. Bolidas support themselves on their many sets of legs, holding only the uppermost portion of their bodies upright to wield weapons or manipulate objects. They have evolved over millions of years to thrive in darkness, and they therefore tend to avoid traveling up to the surface world; if they choose to live on a planet's surface or a space station, they prefer to maintain nocturnal schedules, as sunlight blinds them if they're not wearing protective eyewear.
Only a few decades ago, a group of offworld explorers on the bolidas' home planet, Zafaiga, first encountered the modest miners while quarrying the unique stones that they assumed had no claimant. Though the bolidas were territorial, wary, and somewhat xenophobic, it was overall an amicable, if tense, meeting. Afterward, the bolidas reluctantly agreed to establish a mutually beneficial relationship with other species, contracting trade agreements and eventually even adopting Common into their lexicon. Though the broader galaxy has known of their existence for only a few decades, bolidas have been extant for millennia, unconcerned with and largely unaware of the outside world. They independently developed their own technology (though it is predominantly analog and therefore considered primitive by some races), which they use to dig for resources and excavate cavernous dwellings. Even those bolidas who travel the galaxy tend to be rather aloof, blowing off attempts at personal friendships by members of surface races, whom they dismiss as capricious "light dwellers." They choose instead to spend their time alone, with other bolidas, or with members of subterranean races with whom they can share their passion for excavation.
Digging is a euphoric activity for bolidas, and they spend a large portion of their lives creating new tunnels and caves to house their ever-expanding populations. New settlements can grow from a single small cave to hundreds of miles of mazelike tunnels and dozens of vast caverns in mere months. Because of this natural disposition, bolidas have proven themselves to be indispensable in the acquisition and trade of rare minerals. Their ability to thrive in the heat deep underground on molten-core planets means they are often hired as miners by individuals and organizations all across the galaxy to excavate subterranean dig sites that most other races are unable to withstand.
Bolidas exhibit no discernible sexual dimorphism or gender, and each bolida is capable of carrying and fertilizing eggs—oftentimes they will take on both roles. They also sometimes mate in groups, covering the floors of their nursery caves with eggs that are incubated by the heat of the depths. The average bolida is 7 feet long and weighs 350 pounds.
!! Racial Traits
* ''Ability Adjustments:'' +2 Str, +2 Con, –2 Dex
* ''Hit Points:'' 6
* ''Size and Type:'' Bolidas are Medium vermin.
* ''Bolida Movement:'' Bolidas have a land speed of 30 feet and a burrow speed of 30 feet.
* ''Bolida Senses:'' Bolidas have [[blindsense]] (vibration) with a range of 30 feet, [[darkvision]] with a range of 60 feet, and [[low-light vision]].
* ''Chitinous Plates:'' Bolidas are covered in metallic plates that grant them a +1 racial bonus to AC.
* ''Defensive Ball:'' As a move action, a bolida can roll its body into a nearly impenetrable defensive ball. While rolled up this way, a bolida can only uncurl itself as a move action, take the total defense action, or use its rolling charge ability. If the bolida takes the total defense action, its bonus to AC is increased to +5.
* ''Fire Affinity:'' Bolidas have [[resistance]] to fire 5, which stacks with one other source of fire resistance.
* ''Light Blindness:'' Bolidas have the [[light blindness]] special ability.
* ''Rolling Charge:'' A bolida that is rolled up in a defensive ball can charge without taking the normal charge penalties to the attack roll or its AC, and it gains a +5 circumstance bonus to AC against attacks of opportunity during its movement. It can't make a melee attack at the end of its movement, but it can instead attempt either a bull rush or reposition combat maneuver against its target with a +4 circumstance bonus to the attack roll. A bolida can't use this ability again until it takes a 10-minute rest to recover Stamina Points.
!! Defensive Ball Graft
{{Defensive Ball}}
!! Rolling Charge Graft
{{Rolling Charge}}
As a standard action, you can use your [[custom rig]] to modify a touched suit of light armor, heavy armor, or powered armor, granting it a number of temporary Hit Points equal to half your mechanic level. Any damage to the armor or its wearer is subtracted from these temporary Hit Points first. These temporary Hit Points last 1 minute or until reduced to 0. Once you use this ability, you can't do so again unless you expend a Resolve Point to regain Stamina Points following a 10-minute rest.
Additionally, when acting in the engineer role during starship combat, instead of taking any other action, you can spend 1 Resolve Point to modify a single quadrant of your starship. You bolster that section of the ship's armor or defensive countermeasures, increasing the ship's Armor Class or Target Lock (respectively) in that quadrant by 2 for a number of rounds equal to your mechanic level; alternatively, you can restore a number of Shield Points in that quadrant equal to your mechanic level.
As a standard action, you can funnel magical energy into a technological light source within 100 feet. The area that light source illuminates is doubled. At 8th level, you can also cause the light source to increase the light level in its illuminated area by an additional step. At 14th level, the area is quadrupled. This effect lasts for 1 hour, and the maximum number of devices you can affect at one time equals your Charisma modifier; if you exceed this limit, your oldest use of the paradigm shift ends. You can't affect a specific light source with this paradigm shift more than once every 24 hours.
[[Dromadas]] have developed significant natural adaptions from spending years as prey, giving them the ability to run at high speeds. Mechanisms within your legs (or similar locomotive appendages) stimulate your muscles to allow you similar movement. When you take the [[run|Run]] full action, you can move up to five times your speed, change direction once during the movement, and cross difficult terrain (though such terrain requires extra movement as normal).
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|bolt graft | 2 | 750 | all legs and feet |
</div>
The bombard fighting style emphasizes attacking multiple targets, often using grenades, and leverages substantial physical strength to control large weapons with significant recoil. At higher levels, you can use launchers, missiles, and other heavy weapons.
!! Grenade Expert (1st)
You increase the range increment of your thrown grenades by 5 × your Strength bonus. In addition, you're able to salvage enough materials to create a grenade without paying for it. Creating a grenade takes 10 minutes. You can create any grenade whose item level is less than or equal to your soldier level, but this grenade is unstable and only you can use it effectively. If anyone else tries to use the grenade, it is a dud. You can have only one grenade created by this ability at one time (if you create a new grenade using this ability, the old grenade no longer works).
!! Heavy Fire (5th)
You can use your physical power to steady your weapon and make your attacks more dangerous. As a full action, you can make a single ranged attack that deals additional damage equal to your Strength bonus to all targets. You can use this ability in conjunction with the [[automatic]], [[explode]], or [[unwieldy]] special property.
!! Debilitating Attack (9th)
When you hit an enemy with a ranged attack or an attack with a weapon with the [[blast]] or [[explode]] special property, you can spend 1 Resolve Point to inflict a debilitating effect on that enemy for a number of rounds equal to your Strength bonus. You can choose to make the target [[deafened]], [[flat-footed]], or [[off-target]], or to reduce its speeds by half (to a minimum of 10 feet). The target can negate this effect with a successful Fortitude save (DC = 10 + half your soldier level + your Strength modifier).
!! Explosives Acumen (13th)
You increase the DC to avoid attacks you make using weapons with the [[explode]] special property by 1. You reduce the amount of any damage you take from any weapon with the explode special property by an amount equal to your Strength bonus.
!! Impactful Attack (17th)
As a full action, you can make a ranged attack that knocks enemies back. Targets you hit are knocked back 5 feet from you. If you use a weapon with the [[explode]] special property, all targets that fail their saving throws are instead knocked back 5 feet from the center of the explosion. An enemy that you critically hit or that rolls a natural 1 on its saving throw is also knocked [[prone]]. You can't make an impactful attack with an [[automatic]] weapon, but you can use this ability with a weapon that has the [[blast]] special property.
The //bombarding// fusion allows a weapon to duplicate the effect of a single grenade that is loaded into an extradimensional space within the weapon. Loading a grenade into a weapon with the //bombarding// fusion takes a full round, as does removing a previously loaded grenade. A grenade loaded into a weapon with the //bombarding// fusion cannot have an item level greater than the weapon's item level. The grenade cannot be detonated, sundered, or otherwise affected while it is within this extradimensional space, and if the weapon is destroyed or gains the [[broken]] condition, the grenade is permanently destroyed.
Once per day, a weapon with the //bombarding// fusion can launch a mystic version of the loaded grenade. This acts as throwing the grenade, and uses the same proficiency and range increment as throwing a grenade, but does not require a free hand. As long as you are wielding a weapon with the //bombarding// fusion and it has not yet used this ability, you can launch the grenade as a ranged attack. Once this ability has been used, the loaded grenade can be removed from the extradimensional space, but a new grenade cannot be loaded into it until 24 hours have passed.
The fleet fires heavy ordinance that grants it a +1 bonus to gunnery against [[capital fleets|Capital-Class Fleet]], and the fleet's attacks ignore the [[damage threshold]] ability.
<div class= "table-wrapper">
|Ability | BP Cost | Fleet Type |h
|bombers | 2 | [[fighter|Fighter-Class Fleet]] |
</div>
A creation of the Brethedan biotech firm Life Innovations, a //bonding// weapon melds into your limb when you draw it (its coloration changes to match your skin tone). You gain a +2 circumstance bonus to your KAC against disarm and sunder combat maneuvers targeting the weapon.
Bonding epoxy is a two-part adhesive plastic kept in a handheld dispenser that automatically mixes the components as they are dispensed. A single dispenser can be used five times. The dispensers cannot be reloaded, and a new dispenser must be purchased if additional epoxy is desired.
As a full action you can coat up to a 1-square-foot area with the epoxy. Anything held against the area bonds to it over 1d4 rounds as the epoxy dries. This requires a full action each round to maintain contact between the objects, and anything resisting (such as a creature) must be [[pinned]] or [[helpless]] to be held in place during this drying period. Dispensed epoxy that is not used within 1 minute hardens and loses its ability to bond objects together.
Pulling apart objects bonded together with this epoxy requires a successful DC 20 Strength check. If the objects are carefully fitted together (requiring 1 minute and a successful DC 20 [[Engineering]] check), the Strength DC to separate them increases to 25.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|bonding epoxy | 1 | 400 | L |
</div>
''System:'' Arm
Bone blades are weapons built into undead arms that are then grafted onto their recipients. The blade can be retracted into the limb (making it impossible to notice without a careful inspection, scan, spell, or similar ability) or extended from the wrist for combat. Extending or retracting a bone blade is a swift action, and you can't use the hand of the associated arm to hold anything or perform fine manipulation when the blade is extended. A bone blade cannot be disarmed, but it can be sundered. When you regain Hit Points (whether through first aid, magic, or natural healing), the blade regains the same number of Hit Points. If destroyed, a bone blade regrows in 24 hours.
Standard bone blades are one-handed simple melee weapons with the [[operative]] weapon special property. It is possible to have a more complex heavy bone blade installed, which changes the bone blade into a one-handed advanced melee weapon. These heavy bone blades are not operative weapons, but they deal more damage (see the table below). There is no difference in cost between standard and heavy bone blades, but the decision between them must be made when the bone blade is installed and cannot be changed.
<div class= "table-wrapper">
| | Damage |<| |h
|Model | Standard | Heavy | Critical |h
|Mk 1 | 1d4 S | 2d4 S | [[stagger]] |
|Mk 2 | 1d8 S | 2d8 S | [[stagger]] |
|Mk 3 | 2d8 S | 4d8 S | [[stun|Stun (critical)]] |
|Mk 4 | 5d8 S | 7d8 S | [[stun|Stun (critical)]] |
|Mk 5 | 5d10 S | 7d10 S | [[stun|Stun (critical)]] |
</div>
Centuries ago, some kasathas crafted simple weapons out of [[crest-eaters]]' bony protrusions; these formidable gauntlets were badges of honor for the mightiest kasathan warriors, and modern artisans have recreated that aesthetic in the form of bone cestuses, though now they are usually formed of state-of-the-art resin instead of crest-eater bone. Due to the flecks of minerals embedded within, bone cestuses are often warm to the touch, especially after they have been exposed to natural sunlight. These basic one-handed melee weapons are capable of punching through a foe's defenses, sometimes puncturing vital organs in the process.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|bone cestus, austere | 2 | 600 | 1d6 P | [[bleed]] 1d4 | L |[[analog]] |
|bone cestus, measured | 7 | 5,500 | 2d6 P | [[bleed]] 1d6 | L |[[analog]] |
|bone cestus, imposing | 12 | 32,000 | 3d6 P | [[bleed]] 2d6 | L |[[analog]] |
|bone cestus, severe | 17 | 230,000 | 8d6 P | [[bleed]] 5d6 | L |[[analog]] |
</div>
This bone statuette can change into a [[crest-eater]]. The creature prefers to remain close to you, and if it has no other orders and can do so safely, it moves next to you.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//bone crest-eater// | 8 | 9,000 | L |
</div>
Usually crafted from bone and gristle, these pistols are prized by the Corpse Fleet and members of the Urgathoan church, but they have also been found in reaches of the galaxy untouched by Eoxian influence. The energy blasts from a bone pistol are a special blend of cold and negative energy that passes harmlessly over the nonliving. Bone pistols are commonly categorized as grave-class, crypt-class, sepulcher-class, and vault-class.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|bone pistol, grave-class | 3 | 900 | 1d4 C | 40 ft. | — | 20 charges | 4 | L |[[antibiological]] |
|bone pistol, crypt-class | 6 | 4,350 | 1d6 C | 40 ft. | — | 20 charges | 4 | L |[[antibiological]] |
|bone pistol, sepulcher-class | 11 | 25,500 | 2d8 C | 40 ft. | — | 20 charges | 4 | L |[[antibiological]] |
|bone pistol, vault-class | 18 | 591,000 | 5d8 C | 40 ft. | — | 20 charges | 4 | L |[[antibiological]] |
</div>
These narrow clubs are often constructed of numerous intertwined bones—as one might expect from a weapon designed by Eoxians—infused with a silvery absolute-zero alloy that instantly draws the heat out of living creatures on contact. Chill bone scepters and void bone scepters have fine threads of the rare alloy, while rigor bone scepters and cadaver bone scepters shimmer with it.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|bone sceptre, chill | 3 | 1,490 | 1d6 C | [[leech]] | L |[[analog]], [[antibiological]] |
|bone sceptre, void | 8 | 9,850 | 2d6 C | [[leech]] | L |[[analog]], [[antibiological]] |
|bone sceptre, rigor | 13 | 51,800 | 5d6 C | [[leech]] | L |[[analog]], [[antibiological]] |
|bone sceptre, cadaver | 19 | 598,000 | 12d6 C | [[leech]] | L |[[analog]], [[antibiological]] |
</div>
Your bones are laced with dangerous spines that can be extended to harm foes who get too close. You can retract or harmlessly extend your spines as a standard action. You can't extend bone spines while wearing armor not fitted to you. If your bone spines are extended and an opponent within 5 feet hits you with a melee attack, you can use your reaction to deal the listed piercing damage to that attacker. If your opponent's attack roll is a natural 20, the attacker also gains the [[bleeding]] condition equal to the item level of your spines. If you have natural weapons and those weapons are magical, the damage dealt by your bone spines is also magical.
<div class= "table-wrapper">
|Augmentation | Level | Price | System | Damage |h
|bone spines, bristling | 5 | 2,900 | spinal column | 1d4 P |
|bone spines, warding | 9 | 12,900 | spinal column | 2d4 P |
|bone spines, punishing | 13 | 47,900 | spinal column | 4d4 P |
|bone spines, rebuking | 17 | 242,900 | spinal column | 8d4 P |
</div>
<<section 'Bone Trooper Technomancer'>>
<<section 'Bone Trooper Captain'>>
Using magic rituals, technomantic experiments, or both, powerful spellcasters can animate the bones of the dead. Although many of these undead are mindless and easily controlled, others retain their intellects, memories, and personalities, and thus they are able to continue a semblance of their former lives. Called skeletal champions in previous ages, these undead are now more commonly known as bone troopers because of their frequent association with the Corpse Fleet, a renegade starship navy of undead.
A member of almost any sapient species that has a skeleton can become a bone trooper. Bone troopers keep all of the abilities, class features, and skills they had when they were living, and they can benefit from class grafts. When the dead planet Eox suffered the cataclysm that nearly destroyed the world, its inhabitants looked to necromancy for their salvation. The most powerful [[elebrians]] became bone sages, but a significant proportion of Eox's populace that managed to survive did so as bone troopers. As a result, most bone troopers in the Pact Worlds are elebrians from Eox, recognizable by the elongated elebrian cranium.
The Corpse Fleet employs countless elebrian bone troopers, which far outnumber other undead in the exiled navy's ranks. Most of these troopers are soldiers, although many specialize as operatives, technomancers, or [[mindbreaker]] mystics.
A bone trooper looks like a fleshless skeleton with a cold, cunning light burning in its eye sockets. Bone troopers wear normal clothing or armor and wield contemporary weapons.
!! Corpse Fleet Equipment
The Corpse Fleet uses a broad array of armor and weapons in its shadow war against the Pact Worlds. These items are difficult to find in the Pact Worlds, but they are readily available on the black market and in major cities on Eox.
<<section 'Dueling Sword, Corpse Fleet' head:'h3' >>
<<section 'Fossilwrap' head:'h3' >>
<<section 'Skitterhide' head:'h3' >>
!! Bone Trooper Template Graft
The animated skeleton of a dead creature, a bone trooper retains the Intelligence score, skills, and abilities the dead creature had when alive, making the bone trooper a far more formidable combatant than typical mindless undead are.
* ''Required Creature Type:'' undead
* ''Suggested Array:'' combatant or spellcaster
* ''Traits:''
** [[DR]] 5/—
** [[immunity]] to cold
* ''Feats:'' [[Improved Initiative]]
* ''Suggested Ability Score Modifiers:'' combatant—Dexterity, Strength; spellcaster—Dexterity, Intelligence
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* Elebrian soldier
* LE Medium undead
* ''Init'' +10; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +16
!!! DEFENSE
* ''HP'' 125; ''RP'' 4
* ''EAC'' 20; ''KAC'' 23
* ''Fort'' +10; ''Ref'' +10; ''Will'' +9
* ''DR'' 5/—; ''Immunities'' cold, [[undead immunities]]
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' //[[shock]]// officer [[dueling sword]] +16 (3d4+12 E & S) or claw +16 (3d4+12 S)
* ''Ranged'' red star [[plasma pistol]] +19 (1d8+8 E & F; critical [[burn]] 1d8)
* ''Offensive Abilities'' fighting styles ([[arcane assailant]]), gear boosts ([[plasma immolation]] [1d8]), style techniques ([[rune of the eldritch knight|Arcane Assailant]], [[secret of the magi|Arcane Assailant]])
!!! STATISTICS
* ''Str'' +4; ''Dex'' +6; ''Con'' —; ''Int'' +2; ''Wis'' +2; ''Cha'' +2
* ''Skills'' [[Diplomacy]] +16, [[Engineering]] +16, [[Intimidate]] +16, [[Piloting]] +21
* ''Languages'' Common, Eoxian
* ''Other Abilities'' [[unliving]]
* ''Gear'' [[skitterhide]] II (with black [[force field]]), officer [[dueling sword]], red star [[plasma pistol]] with 3 batteries (20 charges each)
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or crew (1 plus 5–10 bone trooper technomancers)
</div>
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* Elebrian technomancer
* LE Medium undead
* ''Init'' +7; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +8
!!! DEFENSE
* ''HP'' 34
* ''EAC'' 13; ''KAC'' 14
* ''Fort'' +2; ''Ref'' +2; ''Will'' +8
* ''DR'' 5/—; ''Immunities'' cold, [[undead immunities]]
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' tactical [[dueling sword]] +5 (1d6+4 S) or claw +5 (1d4+4 S)
* ''Ranged'' tactical [[semi-auto pistol]] +9 (1d6+3 P)
* ''Technomancer Spells Known'' (CL 3rd; ranged +7)
** 1st (3/day)—//[[magic missile]]//, //[[supercharge weapon]]//
** 0 (at will)—//[[daze]]// (DC 15), //[[energy ray]]//
!!! STATISTICS
* ''Str'' +1; ''Dex'' +3; ''Con'' —; ''Int'' +4; ''Wis'' +0; ''Cha'' +1
* ''Skills'' [[Computers]] +13, [[Mysticism]] +8, [[Piloting]] +13
* ''Languages'' Common, Eoxian
* ''Other Abilities'' magic hacks ([[countertech]]), [[spell cache]] (rank insignia), [[unliving]]
* ''Gear'' [[skitterhide]] I, tactical [[dueling sword]], tactical [[semi-auto pistol]] with 30 rounds
!!! ECOLOGY
* ''Environment'' any (Eox)
* ''Organization'' solitary, pair, or platoon (3–12)
</div>
Most books are digital files that can be downloaded onto a [[comm unit]] or computer, allowing them to be easily read almost anywhere. Physical books, made of paper or synthetic paper analogues, remain in use, but due to their bulk and weight, are normally found in the hands of eccentric collectors. While many physical books are quite old and treated as heirlooms, modern mass-printed versions are also available. Standard books can be biographies, fiction, magical theory, scientific texts, technical manuals, and much more.
Holy texts are among the most commonly available books in the Pact Worlds. These are standardized books that detail the holy scriptures, rituals, mysteries, and religious parables of a specific deity or religion. Like standard books, most holy texts are stored in digital files to help spread the faith to the masses in a convenient format, but physical copies are also printed and sold for the same price as digital versions.
The prices listed are for digital or physical books. Rare, ancient, collectible, or ornate physical books (especially holy texts) can command prices hundreds or thousands of times more than the listed price. The listed bulk is for physical books (though ancient books or particularly valuable holy texts often have a higher bulk); digital books have negligible bulk.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|book, holy text | 1 | 2 | L |
|book, standard | 1 | 5 | L |
</div>
A //Book of Predilections// collects predilections from the Zamkan Commune into convenient volumes for contemplation. The price reflects these collections as digital files, downloadable to datapads or computers. Rare, hand-illuminated tomes, valued by collectors, can cost four times as much. The introspective nature of these thought puzzles helps the reader define their sense of self and personal desires. If you spend 30 minutes pondering the book after getting a full night's rest, when you fail a Will saving throw against a charm or compulsion effect, you can reroll the saving throw. Doing so takes no action, but you can do so only once after each qualifying reading. The benefit ends after 24 hours or when you get another full night's rest.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//Book of Predilections// | 3 | 1,500 | — |
</div>
The //Book of Unwritten Truths// is a massive book of 528 metallic pages without images or words. According to legend, the book exists as a strange Material Plane connection to the Akashic Record, and information in the volume is presented through tactile means. However, the tome allows its readers to access information on only obscure topics. The axiomite curators of the library world of Athaeum have long sought this artifact as a capstone to their collection.
If you can touch the //Book of Unwritten Truths//, you can read it. While you touch the book, you can take 20 on any skill check to [[recall knowledge]], provided the DC to recall that knowledge is higher than 20. If you roll the check rather than taking 20, you gain a +10 insight bonus to the check. You can read the book to recall knowledge using any skill, even if you are untrained in the associated skill. Once you gain information from the check, the book closes itself and can't be used to gain knowledge using the same skill for 24 hours.
Once per day, the book allows you to cast //[[vision]]//. You must spend the 1 Resolve Point required for the spell, but you are considered to automatically succeed at the caster level check. The book, rather than a computer, imparts the information the spell accesses.
If you attempt to use the book to research the Gap, you gain 1 negative level. Each time you use the book thereafter, you must succeed at a DC 30 Will saving throw or gain 1 negative level.
Someone who knows a secret lost to the Gap can write that truth in the //Book of Unwritten Truths// to convert it to a mundane tome with none of its powers.
The long, rippled barrel of a boomer rifle focuses the sound of several shells ignited simultaneously into a wave of sonic energy. These weapons arose on Akiton as a wayward Veskarian battalion beset a series of scrappy outposts. When lighter rifles failed to pierce the advanced vesk armor, residents used sonic weapons to overwhelm their foes. Tremor and rumbler boomer rifles use low and damaging sonic frequencies. Concussive and shock wave versions also produce a jolt that can knock a target prone.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|boomer rifle, tremor | 2 | 520 | 1d8 So | 40 ft. | [[deafen]] | 12 shells | 3 | 1 |[[analog]] |
|boomer rifle, rumbler | 6 | 4,100 | 2d6 So | 40 ft. | [[deafen]] | 12 shells | 4 | 1 |[[analog]] |
|boomer rifle, consussive | 11 | 24,000 | 4d6 So | 40 ft. | [[knockdown]] | 15 shells | 5 | 1 |[[analog]] |
|boomer rifle, shockwave | 17 | 230,000 | 8d6 So | 40 ft. | [[knockdown]] | 20 shells | 5 | 1 |[[analog]] |
</div>
Covering the hand and held in place with a horizontal grip, a set of boomknuckles resembles a heavy gauntlet. The weapon projects bone-shattering blasts at its highest setting, though more controlled bursts allow a user to hurl themselves over distances with ease. These weapons are often favored by parkour enthusiasts who use them to project blasts downward to vault over obstacles or leap incredible distances, often to the dismay of security personnel in the area.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|boomknuckles, thunderstrike | 3 | 1,400 | 1d4 So | [[push]] (5 ft.) | L |[[powered]] (capacity 20; usage 1), [[thruster]], [[unbalancing]] |
|boomknuckles, LFD | 6 | 4,350 | 1d6 So | [[push]] (10 ft.) | L |[[powered]] (capacity 20; usage 1), [[thruster]], [[unbalancing]] |
|boomknuckles, HFD | 12 | 36,700 | 2d10 So | [[push]] (10 ft.) | L |[[powered]] (capacity 40; usage 2), [[thruster]], [[unbalancing]] |
|boomknuckles, banshee | 18 | 380,000 | 6d10 So | [[push]] (15 ft.) | L |[[powered]] (capacity 40; usage 2), [[thruster]], [[unbalancing]] |
</div>
You can charge up a weapon with this special property as a move action. When you do, you increase the weapon's damage by the listed amount on the next attack you make with the weapon. Boosting expends charges from the weapon equal to its usage value. This increases the weapon's damage and is multiplied on a critical hit. Boosting a weapon more than once before firing it doesn't have any extra effect, and the extra charge dissipates if the weapon is not fired by the end of your next turn.
Your energy shield grants you a number of temporary Hit Points equal to your Intelligence modifier + double your mechanic level. In addition, if you have already used your shield, you can spend 1 Resolve Point to use it again without having to regain Stamina Points first. This replenishes your shield's temporary Hit Points to full. You must have the [[energy shield]] mechanic trick to learn this trick.
When properly reinforced to absorb the strain, an expansion bay along a starship's aft or sides can house additional thrusters and fuel tanks (the thrusters must be purchased separately and be an appropriate size for the starship) as well as separate fuel tanks. During starship combat, the pilot can activate these additional thrusters before moving the starship during the helm phase as part of their crew action. When activated, the additional boosters increase the starship's speed by an amount equal to the boosters' listed speed divided by 4 (rounded down) and increase the DC of [[Piloting]] checks to perform stunts that round by an equal amount. The boosters' supplemental fuel supply can power them for 5 rounds, after which the thrusters need 24 hours to recharge from the ship's power core. A starship can have only one such additional booster active at a time.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|booster thruster housing | 0 | 3 |
</div>
A //boosting// fusion provides its wielder a burst of confidence when delivering powerful blows with the weapon. When you score a critical hit with the weapon, if at least one target of the attack takes damage equal to at least 3 × the weapon’s item level, you recover a number of Stamina Points equal to the weapon’s item level, in addition to the critical hit’s other effects. After you benefit from this fusion, you can’t do so again until you rest for 10 minutes to recover Stamina Points.
Borais are an unusual form of corporeal undead. Instead of being a dead body animated by negative energy, a borai has a mostly dead body that retains the smallest sliver of its soul. The two are inexorably bound, as the body draws vitality from the soul while the soul uses the body to remain on the Material Plane. Some borais are the results of partially botched resurrection attempts, either magical or technological, while others were people who were simply too stubborn to fully die when their time came.
Borais appear much as they did in life, but their skin becomes pale and fragile, and dark veins of negative energy blossom across their bodies, a visual sign of the undead connection between their flesh and spirits. Borais still need to eat, breathe, and sleep, just like any living creature, but they age at radically slowed rates, allowing them to live for a few additional centuries. After that length of time, a borai's physical body deteriorates to such a degree that the soul can no longer sustain it; the borai then both dies (as living creatures do) and is destroyed (as undead creatures are). Scholars are divided as to whether these souls move on to their appointed afterlives or simply dissipate into nothingness; mystical attempts to contact these souls have unfortunately failed, leaving researchers frustrated in their pursuit of answers.
Though they can be created almost anywhere, the highest "birth rate" of borais is on the planet Eox, as many of the undead who live on that planet experiment with necromancy and undead-strengthening science. Those who come into existence elsewhere tend to migrate to Eox, as they are often viewed with fear and mistrust on other worlds. However, they soon find that similar prejudices await them on the dead planet, as they still require the same comforts as living creatures. A few borais from disparate former races have banded into a small coalition to petition the Pact Council for the official rights to an asteroid or small moon to create a home planet.
Some borais embrace their disconcerting aspects, finding employment as terrifying enforcers or imposing bodyguards, while others seek to overcome and erase the stigma of their undead nature by holding diplomatic positions or taking jobs where they interact with the public. A few borais attempt to hide their pale appearances with cosmetics and full-body clothing. These borais attempt to blend in with members of their original races, though this often results in heartbreak and feelings of betrayal from their friends.
!! Racial Traits
* ''Ability Adjustments:'' +2 Con, +2 Cha, –2 Wis
* ''Hit Points:'' 6
* ''Size and Type:'' Borais are Medium undead, but they do not gain normal undead immunities.
* ''Darkvision:'' Borais can see up to 60 feet in the dark.
* ''Deathly:'' For effects targeting creatures by type, borais count as both humanoids and undead (whichever effect is worse). They are immune to negative energy damage and gain a +1 racial bonus to saving throws against disease, [[exhaustion]], [[fatigue]], mind-affecting effects, [[paralysis]], poison, sleep effects, and [[stunning]].
* ''Living Shell:'' A borai counts as a living creature for the purposes of what can affect him (such as magic healing). If destroyed, a borai can be brought back to his normal undead state by spells (such as //[[raise dead]]//) that restore life to his body as if he were alive.
* ''Old Talents:'' Borais' not-quite-dead bodies still have some of their old racial traits. At character creation, a borai selects one of the following races as his original living form and gains the racial trait indicated in parenthesis for the selected race: [[android]] (upgrade slot), [[human]] (skilled), [[kasatha]] (four-armed), [[lashunta]] (limited telepathy), [[shirren]] (blindsense), [[vesk]] (natural weapons), or [[ysoki]] (cheek pouches). A GM can, at her discretion, allow a borai to choose another humanoid race, along with an appropriate racial trait. Additionally, when a borai attempts to disguise himself as a member of his selected race, the DC of his [[Disguise]] check is not modified as a result of disguising himself as a different creature type.
* ''Resist Energy Drain:'' A borai takes no penalties from [[energy drain]] effects, but he can still be destroyed if he accrues more negative levels then he has class levels. After 24 hours, any negative levels a borai has taken are removed without the need for an additional saving throw.
!! Resist Energy Drain Graft
{{Resist Energy Drain}}
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' willing creature touched
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' none
* ''Spell Resistance'' no
*
</div>
You touch a willing creature with at least one manifestation from corruption and expend 2 Resolve Points. If you do so, you temporarily gain any stains and gifts that corruption grants to the target, and the target retains them. If a gift you gain has limited uses, you can use the gift only by expending 1 Resolve Point for each use.
You can spend 1 Resolve Point to draw magic from a willing or unconscious ally within 30 feet of you, casting one of their spells as a spell-like ability. The spell’s level cannot exceed the maximum spell level you can empower with your [[spell speaker]] ability, and the ally must expend the appropriate available spell slot. You use your envoy level as the caster level, and you use your Charisma modifier to calculate the spell’s saving throw DCs. Activating this improvisation and casting the spell takes a standard action or an amount of time equal to the spell’s casting time, whichever is longer. Each time you use this improvisation per day, its Resolve Point cost increases by 1.
You must have the [[spell speaker]] alternate class ability to choose this improvisation.
You draw on the strengths of alternate versions of yourself. As a standard action, choose an ability score and gain a +2 insight bonus to all skill checks associated with that ability score. If your skill modified by [[compound sight]] uses the selected ability score, you increase compound sight's insight bonus by 2 for the duration of this effect. Once you've used this paradigm shift, you can't use it again until you take a 10-minute rest to recover Stamina Points.
While you are wearing or wielding one or more items with a combined bulk of 1 or more that you have taken from another creature, you can more readily assume a false identity, disguising yourself as a creature of the same race or organization. You don't need a [[disguise kit|tool kit]] to attempt a [[Disguise]] check to change your appearance when using this expertise talent, though using one grants you a +2 bonus to your check. If you forgo rolling your expertise die, changing your appearance takes only 1d3 minutes rather than 1d3 × 10 minutes.
Alternatively, if you have the materials that qualify for you to use this expertise talent, you may forgo your expertise die to attempt to disguise yourself as that exact creature. Anyone who knows that creature well gains a +10 bonus to [[Perception]] checks to oppose your disguise.
By sapping nearby flora, you can protect your own lifeforce.
''Prerequisites:'' [[Mysticism]] 5 ranks.
''Benefit:'' When you would be hit by or fail a saving throw against a cold, death, or necromancy effect, or against an effect that would make you [[exhausted]] or [[fatigued]], you can take a reaction to dissipate that attack into surrounding organisms. Until the end of the turn, you gain cold [[resistance]] equal to your ranks in [[Mysticism]] against such attacks, and you roll saving throws against those effects twice and take the better result. Non-creature plants within 15 feet of you visibly wither; if these plants would provide [[total concealment]], they provide only [[concealment]]; if they would provide concealment, they provide no concealment. Affected plants typically recover within several days; affecting them again with this feat typically kills smaller mundane plants outright. You can use this feat once per day, though you can use it additional times by spending 1 Resolve Point each additional time you use the feat.
To use this feat, there must be at least 8 squares of healthy vegetation within 15 feet of you, such as grasses, mosses, or trees. As few as 4 squares of especially dense vegetation, such as rain forest or intensive hydroponics, is also sufficient, and the GM has discretion over whether there are enough plants nearby to use this ability
You embody the forces that keep a system separated from its surroundings, isolating the reach of its entropy.
!! Aspect Insight
You gain [[Improved Combat Maneuver]] (sunder) as a bonus feat and a +2 insight bonus to [[Perception]] checks.
!! Aspect Embodiment
Once per combat encounter, when an attack misses you or hits but fails to damage you, or you succeed at a saving throw that negates an effect, you can gain 1 Entropy Point without taking any additional action.
!! Aspect Catalyst
Each ally within 30 feet gains the ability to use your [[mitigate]] class feature without spending Entropy Points once within the next 10 rounds, using your vanguard level to determine the amount of damage reduced.
''Improved:'' Each ally within 30 feet can instead use your [[mitigate]] ability twice in the next 10 rounds.
!! Aspect Finale
When you use your [[mitigate]] ability, it applies to all attacks against you until the end of your next turn. This doesn't apply to allies using it as a result of your aspect catalyst.
You track people down for money. It is a dangerous profession, as most of your targets understandably don't wish to be caught. You wouldn't have it any other way. You might have a code of ethics, never taking jobs that, say, target children or members of your own race. You might hunt down only escaped criminals. Or you might be completely amoral, taking any job that comes along—for the right price.
!! Theme Knowledge (1st)
Your mind is a cold steel trap when it comes to scraps of information about the creatures you're tracking down. Choose a specific sentient creature that you can identify by name, alias, or specific identity to be your mark. Reduce the DC of [[Culture]] or [[Profession]] (bounty hunter) checks to [[recall knowledge]] about your mark, as well as to recall knowledge about law-enforcement individuals and practices, by 5. If you choose a mark that is known only by an alias or secret identity, this ability helps you learn facts only about the identity you know about, not any other unknown identities. Once you defeat your mark, as an action that takes 1 minute, you can study dossiers and database information about another individual to be your new mark. You can instead abandon your mark for a new one without defeating it, but if you do so, you take a –2 penalty to all skill checks for 1 week. [[Survival]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to Survival checks. In addition, you gain an ability adjustment of +1 to Constitution at character creation.
!! Swift Hunter (6th)
You know just how to ask around about your marks to gain information and insight in a hurry. You can use [[Diplomacy]] to [[gather information]] about a specific individual in half the normal time, and you reduce the penalty for [[following tracks]] using [[Survival]] while moving at full speed to 0.
!! Relentless (12th)
You never seem to get tired, even when working longer and harder than everyone else in pursuit of your mark; some of your targets might even refer to you as a tireless ghost or an all-seeing hunter. You can walk or be otherwise active for 12 hours instead of 8 before needing to attempt Constitution checks for a forced march, and you can hustle for 2 hours a day during overland travel instead of 1 hour. Reduce the penalty for [[following tracks]] using [[Survival]] while moving at double speed to –10
!! Master Hunter (18th)
Your relentless pursuit of your mark steels your determination and can renew your inner reserves of strength. Once per day while in pursuit of your mark, you can review current information about your mark for 10 minutes to regain 1 Resolve Point; this doesn't count as resting to regain Stamina Points. Additionally, once per day when you defeat your mark, you regain 1 Resolve Point.
Modern compound bows are made of aluminum alloys, for superior lightness and durability. The string is made of high-performance polyethylene. Bows fire [[arrows]] as ammunition, and they can also be used with [[grenade arrows]] for more customized damage and effects.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|bow | 1 | 255 | 1d6 P | 60 ft. | — | drawn | 1 | 1 |[[analog]], [[quick reload]] |
</div>
As a move action, you can choose one enemy within 60 feet. Until the start of your next turn, you and your allies gain a +1 morale bonus to AC if adjacent to at least one other ally, as you all position yourselves so that your armor protects you better. The bonus persists even if the enemy moves beyond 60 feet or out of line of sight or hearing.
At 6th level, you can spend 1 Resolve Point to grant this bonus to AC against attacks made by all enemies within 60 feet.
This is a language-dependent, mind-affecting, sense-dependent effect.
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* CE Large aberration
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +16
!!! DEFENSE
* ''HP'' 105
* ''EAC'' 19; ''KAC'' 20
* ''Fort'' +7; ''Ref'' +7; ''Will'' +13
* ''DR'' 10/magic; ''Immunities'' [[confused]] condition; ''SR'' 19
* ''Weaknesses'' brain dependency
!!! OFFENSE
* ''Speed'' 10 ft., fly 40 ft. ([[Su]], perfect)
* ''Melee'' bite +15 (1d12+12 P plus brain collector venom) or claw +15 (1d8+12 S)
* ''Multiattack'' bite +9 (1d12+12 P plus brain collector venom), 2 claws +9 (1d8+12 S)
* ''Space'' 10 ft.; ''Reach'' 5 ft.
* ''Offensive Abilities'' brain collection
* ''Spells Known'' (CL 7th; ranged +13)
** 3rd (3/day)—//[[arcing surge]]// (DC 20), //[[ray of exhaustion]]// (DC 20)
** 2nd (6/day)—//[[caustic conversion]]//, //[[hold person]]// (DC 19), //[[invisibility]]//, //[[polymorph]]// (self only; four predetermined humanoid forms)
** 1st (at will)—//[[magic missile]]//, //[[unseen servant]]//
!!! STATISTICS
* ''Str'' +4; ''Dex'' +2; ''Con'' +2; ''Int'' +6; ''Wis'' +2; ''Cha'' +2
* ''Skills'' [[Acrobatics]] +2 (+10 to fly), [[Life Science]] +21, [[Mysticism]] +21, [[Physical Science]] +16
* ''Languages'' Abyssal, Aklo, up to 7 other languages as determined by brain collection; [[telepathy]] 100 ft.
* ''Other Abilities'' strange knowledge
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Brain Collection ([[Ex]])'' A brain collector can store up to seven brains of Small or Medium creatures to enhance their knowledge and power, learning a single language known by the former owner of each stored brain. A brain collector can extract a brain from a [[helpless]] opponent with a [[coup de grace]] action that kills the opponent, or they can extract one as a standard action from a body that has been dead for no longer than 1 minute.
''Brain Dependency ([[Ex]])'' A brain collector that has fewer than seven collected brains gains 1 negative level for each missing brain, and a brain collector with no collected brains can't cast any of their spells. These negative levels never become permanent and can be removed only by adding brains to a brain collector's collection. The statistics presented here assume a brain collector with a full collection.
''Strange Knowledge ([[Ex]])'' A brain collector can access the collective knowledge of their stored brains. If they have at least one brain in their collection, they gain one of the following skills (with 8 ranks) in which the former owner was trained: Bluff +16, Computers +16, Culture +16, Engineering +16, Medicine +16, Piloting +16, Profession +16, or Sense Motive +16. For every three additional brains in their collection, the brain collector gains one additional skill from the list among the skills in which the former owners were trained.
!!! Brain Collector Venom
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 18
* ''Track'' [[Strength|Strength Poison Track]] (special)
* ''Frequency'' 1/round for 6 rounds
* ''Effect'' progression track is //Healthy—Weakened—Staggered—Immobile//
* ''Cure'' 2 consecutive saves
</div>
The hideous brain collectors, also known as neh-thalggus, originate from worlds beyond the known galaxy, and they belong to the hostile coalition called the Dominion of the Black. These creatures' common name stems from their obsession with absorbing the brains of any being they deem inferior—in effect, virtually every other being— not to gain sustenance, but to increase their intellect and power their spells.
Brain collectors resemble vaguely scorpion-like creatures with lamprey mouths, jagged pincers, and clattering legs studded with twitching eyes. Pulsating, brain-filled blisters line their backs, making these monstrous creatures easily distinguishable from other predators in the Vast. Those who survive encounters with brain collectors describe eerie, whispering thoughts intruding into their minds. These thoughts seem to simultaneously offer salvation and destruction, and some victims report that they couldn't determine whether the thoughts belonged to the brain collector, the pulsating brain sacs, or their own traumatized imaginations.
Even after millennia of exposure to Pact Worlds species, brain collectors' motivations remain murky; it remains unclear whether they act to fulfill the schemes of sinister overlords among the Dominion of the Black or if their hostility stems from an utterly incomprehensible morality, if not outright cruelty. Whatever the case, brain collectors are relentless. Upon landing on a planet in living drop-ships, their vessels rot into useless biological matter as well as metal components the brain collectors use to convert caves and abandoned buildings into unsettling, flesh-walled compounds. From these bases, the brain collectors systematically hunt, kill, and claim the brains of intelligent beings. Once satiated—which can take anywhere from a few days to many years, depending on their needs—the brain collectors rapidly disassemble their fleshy homes, reconstruct their shuttles, and return to their orbiting starships. They then set off for another distant world to repeat the process—or return their cerebral payload to their unknown home worlds.
Largely solitary, brain collectors hunt alone even when sharing starships and lairs. The greatest emotional bond they form comes through brain-swapping, a grotesque process that allows them to share their victims' memories. To a brain collector, other creatures simply serve as resources, with no more rights or dignity than their ships' fuel. Even so, they regularly attract cults dedicated to the Dominion whose members harbor misguided hopes that obeisance might save the cultists' lives. For the most part, neh-thalggus don't care for these cults, and the members have no guarantees of safety. Yet some brain collectors appear to take pleasure in being worshipped, even if it mostly just makes their jobs easier. A few unsubstantiated reports claim that neh-thalggus who consume the brains of zealous individuals can inadvertently absorb humanoid notions of faith, in turn developing uncharacteristic habits of grandiosity, generosity, or protectiveness. If these anomalies exist, it seems other brain collectors quickly eradicate the heretics.
Xenoanthropologists' research suggests that brain collectors' religion venerates the primordial forces of space and time, potentially serving as the belief that unifies the species and drives their behavior. Others, however, believe that brain collectors simply "practice" religion out of boredom during their long journeys among the stars, and that they take it no more or less seriously than rote mathematics. However, an emerging theory proves among the most concerning: that over the eons they spent accumulating knowledge, brain collectors have discovered some fearful, fundamental truths of the universe—and only faith preserves them from abject terror.
Brain collectors are among the most commonly encountered members of the Dominion of the Black, though they rarely interact or cooperate with others from that enigmatic group. However, they practically never enter into direct competition with one another. A common punishment for a scheming or inefficient brain collector involves violently tearing out their brain collection, then abandoning them on a lifeless moon to suffer centuries of stupefaction and powerlessness. According to unconfirmed rumors, brain collectors that excel at their duties undergo transformations to become far more powerful and horrific creatures.
The average brain collector has a stature about 6 feet tall and 9 feet across; they can weigh over 3,500 pounds.
!! Brain Collector Augmentations
On occasion, brain collectors that have an overabundance of brains conduct sadistic research on other creatures rather than consuming them. A few of these augmented victims survived and escaped from their captors, and biotech laboratories have deduced far more humane ways to replicate the brain collectors' augmentations.
<<section 'Emotion Enhancement' 'h3'>>
<<section 'Neuro-Sensory Sac' 'h3'>>
To you, living brains are merely a type of organic computer, and you've learned to hack them as easily as you would an artificial mind. For the purpose of determining the effects of your technomancer spells, you treat all living creatures with an Intelligence score of 1 or higher as if they were both their original type and subtype and constructs with the technological subtype, whichever is more beneficial for you. This ability allows you to heal living creatures with spells like //[[mending]]// and //[[make whole]]//, as if they were constructs.
This long spear is grown from chitin or horn by shirren, formian, and nuar bioengineers. The psychically sensitive material of a brain pike homes in on the thoughts of its target, adjusting its own movement mid-thrust to hit a vulnerable spot.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|brain pike, drone | 4 | 1,950 | 1d8 P | [[confuse]] | 1 |[[analog]], [[living]], [[reach]], [[thought]], [[unbalancing]], [[unwieldy]] |
|brain pike, warrior | 8 | 8,700 | 2d8 P | [[confuse]] | 1 |[[analog]], [[living]], [[reach]], [[thought]], [[unbalancing]], [[unwieldy]] |
|brain pike, knight | 11 | 24,600 | 4d8 P | [[confuse]] | 1 |[[analog]], [[living]], [[reach]], [[thought]], [[unbalancing]], [[unwieldy]] |
|brain pike, queen | 14 | 66,500 | 7d8 P | [[confuse]] | 1 |[[analog]], [[living]], [[reach]], [[thought]], [[unbalancing]], [[unwieldy]] |
|brain pike, god | 18 | 372,000 | 11d8 P | [[confuse]] | 1 |[[analog]], [[living]], [[reach]], [[thought]], [[unbalancing]], [[unwieldy]] |
</div>
The brakims native to Bortan II live in small tribal groups. A planetwide war that occurred during the Gap reduced their numbers and left their world an irradiated wasteland where the brakims survive, organized into nomadic scavenger tribes. These tribes battle each other across blasted deserts and ruined cities.
When the Azlanti landed on Bortan II, the planet had been stripped of natural resources. The Star Empire engaged in a few brief, brutal skirmishes to prove their supremacy, built a small monitoring station, and left. Since that event, a city has grown up around the monitoring station. This settlement's citizens are not only brakims, but also outcasts from the Star Empire who see Bortan II as a refuge. Criminal enterprise has since flourished on the planet as all sorts of scoundrels find a place on Bortan II. A few brakims head such organizations and have
used the wealth they gained to move offworld.
Brakims are adaptable, industrious, and resourceful. Their ability to modify and even detach their limbs provides them with a considerable survival advantage. However, centuries of life on a war-torn world have left them brusque and distrustful, and they are slow to accept strangers. The opportunity to travel beyond Bortan II has given a few brakims new horizons to explore, although doing so is beyond the means of most of these people.
Some make the leap by hiring on as technicians on starships bound for other imperial worlds. Already used to treating their limbs as tools and extracting useful parts from ancient machines, brakims are well suited to dealing with technology. They see technology as reliable and practical compared to the potential chaos that magic can cause. Brakims also favor hands-on work that has pragmatic results to the abstractions common with computing and sorcery. A brakim's adaptable methods and informal training can produce patchwork results. Nevertheless, a brakim's work is quite functional.
Brakims stand 7-1/2 feet tall, and their gangly bodies weigh around 200 pounds. They're considered adults at 15 and naturally live up to 75 years.
!! Racial Traits
* ''Ability Adjustments:'' +2 Dex, +2 Con, –2 Cha
* ''Hit Points:'' 6
* ''Size and Type:'' Brakims are Medium humanoids with the brakim subtype.
* ''Jerry Rigger:'' Brakims have a +2 racial bonus to [[Engineering]] checks.
* ''Malleable Limbs:'' Lacking an internal skeleton, a brakim can change her limbs easily. This adaptability grants a brakim a +4 racial bonus to [[Athletics]] checks to climb and to swim. If a brakim loses a limb or digit, it regrows in 1d4 hours. In addition, as a full action, a brakim can change up to all four of her limbs to give herself one of the following advantages.
** A brakim can stretch her limbs. A stretched arm has 5 feet of additional reach. A stretched leg gives 5 feet of additional height. Stretched limbs are weak for combat, so a brakim takes a –2 penalty to attack rolls and gains no Strength bonus to damage with them. In addition, while her legs are stretched, a brakim can't run or charge.
** A brakim can modify her arms for locomotion, moving as a quadruped and gaining a 10-foot enhancement bonus to her speed. While a brakim's arms are modified this way, she can't wield or hold objects that require two hands.
** A brakim can modify her legs and feet to be manipulators like arms and hands, respectively. In this mode, a brakim can wield or hold up to four hands worth of weapons or equipment. However, while a brakim holds an object with her modified foot, she takes a 10-foot penalty to her speed. While she holds an object that requires two hands with her feet and legs, she can move only by crawling. If a brakim wants to hold an object with every hand and foot, she must be [[prone]].
** As a move action, or a reaction when grabbed or otherwise held by a limb, a brakim can detach her limbs. She takes 1 damage directly to her Hit Points for each limb she sheds.
* ''Wasteland Dweller:'' Brakims are immune to low [[radiation]]. They also gain a +2 racial bonus to [[Survival]] checks, to Fortitude saving throws against radiation and extreme weather, and to Constitution checks against starvation and thirst.
Brass dragons are garrulous and often live near civilized areas to indulge in the latest gossip. They enjoy conversation immensely and much prefer talking over fighting.
* ''CR'' 3+
* ''Required Creature Type and Subtype:'' dragon (fire)
* ''Suggested Alignment:'' chaotic good
* ''Traits:''
** [[blindsense]] (vibration) 60 feet and [[darkvision]] 120 feet
** [[frightful presence]] (CR 14+, 60 feet + 10 feet per CR)
** [[DR]] 5/magic (CR 13+; increase to DR 10/magic at CR 15, DR 15/magic at CR 17, DR 20/magic at CR 19)
** burrow speed of 30 feet
** [[breath weapon]] (line 30 feet + 10 feet per 2 CR, 1d4 F + 1d4 per CR)
** sleep breath (see below)
** spell-like abilities (CR 8+)
* //Sleep Breath ([[Su]]):// Instead of a line of fire, a brass dragon can breathe a 30-foot cone of sleep gas. Each creature within the cone that inhales the gas must succeed at a Will save or fall asleep for 1d6 rounds plus a number of additional rounds equal to half the dragon's CR.
<div class="statblock">
* ''Level'' 6; ''Price'' 14,500
* ''EAC Bonus'' +12; ''KAC Bonus'' +18
* ''Max Dex Bonus'' +3; ''Armor Check Penalty'' –3; ''Speed'' 30 ft.
* ''Strength'' 20 (+5); ''Damage'' 3d6 B
* ''Weapon Slots'' 3; ''Upgrade Slots'' 2
* ''Capacity'' 40; ''Usage'' 1/min
* ''Size'' Large (10-ft. reach); ''Bulk'' 38
</div>
Designed for brutal gladiatorial matches against other fighters in powered armor, a brawler frame consists of nanotech shock absorbers sandwiched between rigid metal plates. The default frame comes with blunt piston-powered fists designed to deal bludgeoning damage, but customized models with heavy blades or picks (dealing slashing or piercing damage, respectively) are not uncommon. Many owners paint their brawler frames with garish colors to be more distinctive in the arena.
<div class="statblock">
* ''Type'' drug (ingested or injury)
* ''Save'' Fortitude DC 17
* ''Addiction'' Fortitude DC 17 (physical)
* ''Track'' [[Constitution|Constitution Poison Track]]
* ''Effect'' +4 morale bonus to [[Athletics]] and [[Acrobatics]] checks and Strength score is treated as 4 higher for the purpose of determining bulk limit for 3 hours.
</div>
<div class="table-wrapper">
|Substance | Level | Price |h
|brawn | 7 | 4,000 |
</div>
A breach weapon is specifically designed to apply sudden force to doors and walls in an effort to break them. If you are trained in [[Engineering]], as a full action you can use a breach weapon against an adjacent stationary door or wall, or at the GM's discretion, against a similar adjacent object. An attack with the weapon expends ammunition as normal, but instead of making an attack roll, you attempt a Strength check against the object's break DC and add the breach weapon's item level to the check.
<div class="statblock">
* ''Level'' 13; ''Price'' 200,000
* Gargantuan land and water vehicle (20 ft. wide, 30 ft. long, 10 ft. high)
* ''Speed'' 40 ft., full 550 ft., 65 mph (hover)
* ''EAC'' 27; ''KAC'' 29; ''Cover'' total cover
* ''HP'' 230 (115); ''Hardness'' 16
* ''Attack (Collision)'' 14d10 B (DC 15); ignores 10 points of hardness
* ''Modifiers'' +0 [[Piloting]], –2 attack (–3 at full speed)
* ''Systems'' autopilot ([[Piloting]] +23), enhanced sensors ([[darkvision]] 500 ft.), planetary comm unit
* ''Passengers'' 15
!!! SPECIAL ABILITIES
''Breach ([[Ex]])'' After the pilot makes a successful ram action against an object with a hull or wall, if the rammed object has the [[broken]] condition, the breacher's pilot can use a swift action to activate cutting lasers, drills, claws, or other devices mounted on the front of this vehicle. These devices create a hole in the rammed object up to 8 feet in diameter, allowing creatures to pass freely from the breacher into the breached object.
''Ramming Attack ([[Ex]])'' A specially designed frame, kinetic dampeners, or other technology prevents this vehicle from taking damage when its pilot performs a successful ram action.
</div>
These vehicles are most often used to punch holes in barricades, defensive walls, or ship hulls before depositing shock troops within.
This explosive charge releases a concentrated blast that shatters most obstacles efficiently.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Maximum<br/>Result |h
|breaching charge, mk 1 | 1 | 35 | L | 25 |
|breaching charge, mk 2 | 4 | 300 | L | 30 |
|breaching charge, mk 3 | 7 | 860 | L | 35 |
|breaching charge, mk 4 | 10 | 2,575 | L | 40 |
|breaching charge, mk 5 | 13 | 7,100 | L | 50 |
|breaching charge, mk 6 | 16 | 23,000 | L | 60 |
|breaching charge, mk 7 | 19 | 76,000 | L | 70 |
</div>
A breaching gun uses scattergun shells as ammunition against a single target at short range, dealing an impressive amount of damage and even tearing through doors and other objects. These weapons are most commonly seen in the hands of space pirates who need to blast through plastic interior doors, though expert users can use these weapons to break through airlock doors. Breaching guns also saw widespread use on Absalom Station in the aftermath of the Gap, as security forces desperately tried to maintain control over the station's fractured and panicked population, which often required blasting through barricades and sealed interior airlocks. Utility, snub, impact, vortex, and grapeshot breaching guns are widely available on various worlds.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|breaching gun, utility | 4 | 2,350 | 1d10 P | 20 ft. | [[knockdown]] | 4 shells | 1 | 1 |[[analog]], [[breach]], [[penetrating]] |
|breaching gun, snub | 7 | 6,800 | 2d10 P | 20 ft. | [[knockdown]] | 8 shells | 2 | 1 |[[analog]], [[breach]], [[penetrating]] |
|breaching gun, impact | 11 | 25,300 | 3d10 P | 30 ft. | [[knockdown]] | 12 shells | 2 | 1 |[[analog]], [[breach]], [[penetrating]] |
|breaching gun, vortex | 15 | 119,000 | 6d10 P | 30 ft. | [[knockdown]] | 16 shells | 2 | 1 |[[analog]], [[breach]], [[penetrating]] |
|breaching gun, grapeshot | 19 | 509,000 | 10d10 P | 30 ft. | [[knockdown]] | 20 shells | 2 | 1 |[[analog]], [[breach]], [[penetrating]] |
</div>
These high-speed pods can each transport up to two Huge creatures, four Large creatures, or eight Medium or smaller creatures at high velocity toward another vessel with the intention of forcefully boarding that starship. A breaching pod travels in the same way as a long-range tracking weapon with a speed of 8, but its size and composition make it unable to pierce functioning shields. When a breaching pod strikes an unshielded quadrant, it deals 1d6 damage to the target, bypassing any Damage Threshold. The occupants—protected in robust safety harnesses so as to avoid damage from the collision—can then disembark and begin [[boarding]] combat on the following round, though the breaching pod is damaged to the point of being inoperable. A breaching pod that fails to hit its target functions as an [[escape pod]] and can be retrieved for reuse. Outside of starship combat, a breaching pod can serve as a crude shuttle to dock with a disabled or willing vessel without destroying the pod.
Expended breaching pods are replaced automatically whenever the starship is upgraded to the next tier. A breaching pod can also be replaced as though the crew were repairing damage to the starship, using the breaching pod's BP cost as the number of Hull Points to be repaired. A starship that also has a [[tech workshop]] expansion bay halves the time needed to replace a breaching pod.
By increasing a breaching pod's BP cost to 7, the pod is automatically outfitted with robotic combatants that function as a typical boarding crew. By increasing the price to 9 or 11 BP, the robots function as skilled or specialized combatants, respectively, for the purpose of calculating their boarding attack modifier.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|breaching pod | 5 | 5 |
|@@.constrained breaching pod with autonomous combatants@@ | 5 | 7 |
|@@.constrained breaching pod with skilled autonomous combatants@@ | 5 | 9 |
|@@.constrained breaching pod with specialized autonomous combatants@@ | 5 | 11 |
</div>
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 minute
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' up to one creature per level, no two of which can be more than 30 ft. apart
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
This spell frees victims from curses, enchantments, and transmutations. //Break enchantment// can reverse even an instantaneous effect. For each such effect, you attempt a caster level check (1d20 + your caster level, maximum +15) against a DC equal to 11 + the caster level of the effect. Success means that the creature is free of the spell, curse, or effect. For a cursed magic item, the DC of the caster level check is equal to the DC of the curse.
If the spell is one that can't be dispelled by //[[dispel magic]]//, //break enchantment// works only if that spell is 5th level or lower. If the effect comes from a permanent magic item, //break enchantment// doesn't remove the curse from the item but it does free the victim from the item's effects.
As a reaction when you fall onto a solid surface while conscious, you can reduce the damage taken from the fall by 50% and avoid landing [[prone]].
You attempt a [[Piloting]] check (DC = 5 + the enemy vehicle's KAC) to disengage from an [[engagement|Engage Another Vehicle]] with other vehicles. If the engagement includes multiple enemy vehicles, the DC equals the highest KAC among the enemy vehicles + 5 per enemy vehicle beyond the first. If all parties are willing to end the engagement, no Piloting check is required to break free
A breakaway aegis fits on the wearer's arm and is made of interlocking metal pieces that barely stay together. This simple protective item isn't as sturdy as a full shield, but it can turn aside minor blows.
You need a free hand to properly use a breakaway aegis; you can hold an item in that hand but not use it or make attacks with it. As a reaction, when you are hit by a melee attack from an opponent you can perceive, you can use the aegis to absorb some of the blow. This negates 5 damage but causes the aegis to crumble into its component pieces. The aegis is useless until you gather up the parts and spend 10 minutes putting them back together.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|breakaway aegis | 1 | 200 | 1 |
</div>
A breakdown weapon can be taken apart into multiple small pieces. While broken down, the weapon is treated as especially small or easy to hide for the purpose of [[Sleight of Hand]]'s hide object task and can fit into spaces that can typically hold only items of light bulk (including a ysoki's cheek pouches). It takes 1 minute to take apart or reassemble a breakdown weapon.
When attempting to break an object, you have two choices: smashing it with a weapon or destroying it with sheer strength.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
<<section 'Table: Size and Armor Class of Objects' >>
<<section 'Table: DCs to Break Objects' >>
<<section 'Table: Material Hardness and Hit Points' >>
<<section 'Table: Doors' >>
<<section 'Table: Walls' >>
As a standard action, the creature can exhale a cone or line of energy or another magical effect. A breath weapon attack usually deals damage, and it is often energy-based. A breath weapon usually allows a target to attempt a Reflex saving throw for half damage, though some breath weapons require a successful Fortitude or Will save instead. A creature is immune to its own breath weapon and the breath weapons of others of its kind unless otherwise noted. Each breath weapon also indicates how often it can be used.
//Format:// ''Offensive Abilities'' breath weapon (60-ft. cone, 8d6 F, Reflex DC 18 half, usable every 1d4 rounds); if the breath has more complicated effects, it also has an entry in Special Abilities.
//Guidelines:// 1d6 damage + 1d6 per CR, usable once every 1d4 rounds. A cone is usually 30 feet long, increasing by 10 feet for every size category above Medium or decreasing by 5 feet for every size category below Medium. A line is twice as long as a cone would be.
This mask of dark stone is just large enough to fit over the nose and mouth of a human, although it has a hole about an inch across in the center. A ring of brassy metal, an alloy of [[djezet]] and mithral, surrounds this hole on the mask's outside. The mask counts as a worn magic item unless you install it in armor, taking up one upgrade slot.
As a standard action while wearing the mask, you can forcefully inhale. If you do so, creatures that need to breathe within a 30-foot-radius spread of you must succeed at a DC 17 Fortitude saving throw or become short of breath, rendering them [[fatigued]] for 1 minute. You can exclude any number of creatures from this effect. Environmental protections] offer no benefit against this effect. A target [[exhausted]] by the mask can attempt a saving throw at the end of each of its turns, ending that condition on itself if successful. A target that succeeds at such a save still remains fatigued for the full duration.
Once you use this item, you can't do so again until you take a 10-minute rest during which you could regain Stamina Points. If you use any //breath-stealer mask//, you can't use another for the same period. If you try to use any //breath-stealer mask// more than three times per day, the mask targets you and every breathing creature it can within range of its power. You can spend 1 Resolve Point to activate the mask without being subjected to these limitations, but you can spend no more than 2 Resolve Points per day to activate any //breath-stealer mask//.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//breath-stealer mask// | 7 | 6,800 | L |
</div>
Brenneris are a mostly peaceful species that hail from Varturan, a planet in Near Space covered in vast waterways. These 5-foot-tall mammalian humanoids resemble otters, though they have slightly longer legs that allow them to walk upright. Brenneris are particularly adept at detecting subtle physical and emotional reactions. This makes them especially skilled at understanding the emotions of others, and they are naturally talented diplomats.
When brenneris developed space travel sometime before the Gap, they enthusiastically began making expeditions from their home world to nearby planets in hopes of learning from their galactic neighbors. They quickly found that their empathetic nature allowed them favorable interactions, even with typically aggressive species. The brenneris began to intentionally hone this skill into diplomacy, and once they developed Drift travel, they were welcomed with open arms at Absalom Station and in the Pact Worlds at large. Now, a significant number of brenneris sell their skills as diplomats to other species that require ambassadors or that would prefer for brenneris to act on their behalf. Brenneri diplomats usually work in pairs, knowing that the experience and judgment of another brenneri is invaluable. Most other species allow brenneri to work as duos, even in cases where only a single representative would normally act on behalf of a particular group, such as intergalactic senates. Some brenneris partner up with members of other similarly minded species, such as [[vlakas]].
Brenneris often find themselves apart from others of their kind, as their wide travels take them far from friends and family. Their fine-tuned sensitivity to emotions extends to their own, which can sometimes lead to bouts of spiraling anxiety or melancholy. To help manage these moods, most brenneris keep a small token to help them calm their emotions and focus their minds on the task at hand. This can range from a simple object, such as a small stone, to more personal items, such as an image of a lover or a childhood relic. A brenneri might even keep multiple items that they favor, choosing a specific object to suit a given situation.
Though most brenneris find themselves acting as ambassadors of some kind or performing related tasks, there are many who break away from this tradition. This usually happens when they meet individuals who express great joy, excitement, or some other positive emotion about a profession, calling, or experience. A brenneri's emotional insight can then kick into overdrive, causing them to decide to pursue a similar experience themselves. It's not uncommon for a brenneri to meet a spacefarer who's just returned from an exhilarating adventure and then quickly want to become an adventurer themself. Brenneris find themselves especially taken with enthusiastic [[shirrens]], and many become early adopters of new technologies and lifestyles.
Though brenneris' natural empathy for the emotional journeys of others usually serves them well, it can sometimes bring them into conflict with others. They might, for example, compulsively attempt to intervene as councilor or intermediary in cases where the involved parties aren't interested in outside interference—and others may find brenneris' well-meaning attempts to help condescending or intrusive. It's not uncommon to hear tales about brenneri companions who were "too helpful," insisting on trying to assist someone in a rough emotional state even after being declined repeatedly. In some circles, this has earned the species a reputation for nosiness, though even then, few would consider a brenneri's interest malicious.
!! Brenneri Stones
While a brenneri can chose almost any small object as their favored object, brenneris have learned to create magical stones that tap into the psychological effects of focusing on a favored object. Brenneris have since learned to replicate the magical power of these stones to allow other species to experience their effects.
<<section 'Brenneri Stone' head:'h3' >>
!! Racial Traits
* ''Ability Adjustments:'' +2 Con, +2 Cha, –2 Int
* ''Hit Points:'' 4
* ''Size and Type:'' Brenneris are Medium humanoids with the brenneri subtype.
* ''Astute:'' Brenneris gain a +2 racial bonus to [[Diplomacy]] and [[Sense Motive]] checks.
* ''Darkvision:'' Brenneris have [[darkvision]] with a range of 60 feet.
* ''Favored Object:'' A brenneri can designate any object they own of negligible bulk as a favored object. Once per day, when a brenneri spends a Resolve Point and takes a 10 minute rest to regain Stamina Points, they can focus on a favored object during the rest and recover Hit Points equal to half their level (minimum 1).
* ''Hold Breath:'' Brenneris can hold their breath for 10 minutes, and taking actions does not reduce this duration.
* ''Swimmer:'' Brenneris have a swim speed of 20 feet.
!! Hold Breath Graft
{{Hold Breath}}
This small, smooth stone glows with a pale light that sheds dim light in a 20-foot radius around you. Once per day, you can spend 10 minutes focusing on the //brenneri stone// to gain an additional effect; this doesn't count as resting to regain Stamina Points. After you use the stone, the radius of its light effect is reduced to 5 feet for 24 hours. You can gain the benefits of only one brenneri stone per day. [[Brenneri]] can use their favored object racial trait with a //brenneri stone// and gain the benefits of both the item and the class feature.
* ''Glossy:'' You gain a +2 morale bonus against fear effects for 1 hour.
* ''Luminous:'' You lose the [[fatigued]] condition or reduce your [[exhausted]] condition to fatigued. This doesn't remove any underlying source of exhaustion or fatigue.
* ''Radiant:'' You gain an additional saving throw against a disease or poison with a +2 morale bonus.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|Glossy brenneri stone | 3 | 1,000 | — |
|Luminous brenneri stone | 7 | 6,000 | — |
|Radiant brenneri stone | 1 | 124,000 | — |
</div>
<div class="statblock">
* ''Tier'' 10
* Large [[vermelith]]
* ''Speed'' 8; ''Maneuverability'' average (turn 2); ''Drift'' 2
* ''AC'' 26; ''TL'' 25
* ''HP'' 170; ''DT'' —; ''CT'' 34
* ''Shields'' medium 100 (forward 20, port 30, starboard 30, aft 20)
* ''Attack (Forward)'' light torpedo launcher (2d8; 20 hexes), railgun (8d4; 20 hexes)
* ''Attack (Port)'' light particle beam (3d6; 10 hexes)
* ''Attack (Starboard)'' light particle beam (3d6; 10 hexes)
* ''Attack (Aft)'' coilgun (4d4; 20 hexes)
* ''Attack (Turret)'' light plasma cannon (2d12; 5 hexes)
* ''Power Core'' Pulse Orange (250 PCU); ''Drift Engine'' Signal Booster
* ''Systems'' basic mid-range sensors, crew quarters (good), mk 7 armor, mk 7 defenses, mk 2 tetranode computer; ''Expansion Bays'' [[cargo holds]] (3), [[guest quarters]] (luxurious), [[launch tube]], [[tech workshop]]
* ''Modifiers'' +2 to any 4 checks per round, +2 [[Computers]] (sensors only)
* ''Complement'' 20 (minimum 6, maximum 20)
!!! CREW
* ''Captain (1 officer, 2 crew)'' [[Diplomacy]] +19 (10 ranks), gunnery +15 (10th level), [[Intimidate]] +24 (10 ranks), [[Piloting]] +19 (10 ranks)
* ''Engineer (1 officer, 4 crew)'' [[Engineering]] +24 (10 ranks)
* ''Gunners (4)'' gunnery +15 (10th level)
* ''Pilot (1 officer, 4 crew)'' [[Piloting]] +24 (10 ranks)
* ''Science Officer'' (1 officer, 2 crew) [[Computers]] +19 (10 ranks)
!!! SPECIAL ABILITIES
''Articulated Spine ([[Ex]])'' The DC of [[barrel roll]], [[evade]], and [[flip and burn]] stunts is reduced by 3.
''Extreme Resistance ([[Ex]])'' The effects of [[EMP|EMP (starship weapon property)]] weapons are halved against a Vermelance. The Vermelance has a +1 bonus to its AC against direct fire weapons that use gravity and a +1 bonus to [[Piloting]] checks attempted due to gravity effects.
</div>
Originally constructed and employed by Apostae's House Brevak to operate as both a show ship and mobile arms-dealing platform, the formidable Vermelance is now a staple in the cutthroat world of drow business. These ships are made from the repurposed corpses of vermeliths—massive, rock-eating, silicon-based space worms—slain by Apostae outriders near the Diaspora. Inspired by the disconcerting effects its appearance has on potential enemies, drow traders emphasize the Vermelance's intimidation factor as part of their business strategy; if the mere sight of the starship throws potential partners or rivals off their game, negotiations might sway in the owners' favor.
Of course, many species in the galaxy are not so easily intimidated, so House Brevak is happy to treat dignitaries and potential buyers to firsthand demonstrations of the ship's combat prowess and maneuverability during which they can also enjoy the ship's lavishly appointed accommodations.
While the Vermelance often serves as a show ship, it possesses genuine lethality, darting through space with impossibly agile twists and turns. Drow technicians enhance the naturally articulated body of the Vermelance with electromechanical rigging, enabling a well-coordinated team of pilots to bend and twist different portions of the once-living ship in elusive and dazzling combat maneuvers. Even so, some Vermelances demonstrate residual willfulness and minor glitches, as though the deceased creature were trying to regain consciousness and reclaim control of its corpse.
Training crews of pilots to synchronize their movements across a single ship isn't without its hazards. Rumors abound of a Vermelance that tore itself apart when its operators' actions fell out of sync, but this might be a warning to spook pilot trainees, an outright lie spread by envious industry competitors, or a tall tale among would-be thieves.
A brig contains all the necessary restraints and security systems to incarcerate up to eight Medium creatures.
<div class="table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|brig | 1 | 1 |
</div>
This simple, shiny metal bolt is the size of a thumbnail and has an image of a tiny gear on its head. As a full action, you can affix a //Brigh's bolt// to a broken suit of armor, tool, vehicle, or weapon to negate the penalties of the [[broken]] condition for as long as the bolt is affixed. The bolt does not repair any damage sustained by the object and the object is still visibly damaged, so its resale value is reduced as normal for a broken item. If the item is repaired so as to no longer have the broken condition, the //Brigh's bolt// falls off; otherwise, it can be removed as a full action. If an item to which a //Brigh's bolt// is attached is destroyed, the bolt is also destroyed.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//Brigh's bolt// | 3 | 1,300 | — |
</div>
Attacks with bright weapons illuminate the area within 20 feet of your target for 1 round following the attack, increasing the illumination level by one step, to a maximum of normal light.
Any weapon from the flame category gains the [[bright]] weapon special property while you wield it. If the weapon already has the bright property, the weapon's attacks increase the area's illumination by two steps, to a maximum of normal light. You can suppress or resume this gear boost for weapons you wield without spending an action.
While this //aeon stone// orbits you, you gain a +4 insight bonus to [[Culture]] checks to decipher exotic, intricate, or very old writing. In addition, once per day as a standard action, this //aeon stone// can be activated to cast //[[comprehend languages]]// as a 1st-level spell (caster level 4th).
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//bright yellow cabochon// | 4 | 2,000 | — |
</div>
This set of magical illumination functions as a [[light projector]], except its magical light can penetrate even magical darkness. While this upgrade is active, your melee attacks gain the [[bright]] weapon special property.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk | Capacity | Usage |h
|//brightlight projector// | 6 | 3,000 | 1 | any, shield | 1 | 20 | 1/hour |
</div>
A weapon with this special property can fire in an arc adjacent to the one in which it was installed with a –2 penalty. A broad arc weapon can fire at only one target at a time.
When activated, this unobtrusive lump of metal and plastic emits an irritating sonic whine, aggravating bystanders' senses. When you wear the activated upgrade and enter the [[blindsense]] or [[blindsight]] range of a creature whose sense is based on sound or vibration, that creature must succeed at a Fortitude save (DC = 10 + 1/2 the upgrade's item level + your Constitution modifier) or its special sense becomes hindered: its blindsight functions as blindsense, or it loses its blindsense. This effect lasts for 1 minute, and whether the creature succeeds or fails the save, they become immune to the armor upgrade's effect for 24 hours.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|broadband noise generator, mk 1 | 2 | 650 | 1 | any | — |
|broadband noise generator, mk 2 | 6 | 3,900 | 1 | any | — |
|broadband noise generator, mk 3 | 11 | 17,500 | 1 | any | — |
</div>
<div class="statblock">
* <<levels>>
* ''School'' divination (language-dependent, mind-affecting)
* ''Casting Time'' 1 round; see text
* ''Area'' emanation with a radius of 100 ft. centered on you; see text
* ''Targets'' all creatures
* ''Duration'' concentration, up to 1 minute/level
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You broadcast a short telepathic message of up to 25 words to all creatures in the area. The message repeats each round for the duration. A technomancer casting this spell also broadcasts the message to all computers or constructs with the technological subtype that are designed to receive messages.
You can spend additional time casting this spell to increase its area. If you do, for each additional full action spent to cast this spell, the emanation’s radius increases by 100 ft., to a maximum of 1,000 ft.
Your exocortex can broadcast crucial combat data to allies. When you use your [[combat tracking]] exocortex ability to track a creature, as a swift action, you can grant an ally the ability to make attacks against that target as if their base attack bonus were equal to your mechanic level. If you do, attacks you make against that target use your normal attack bonus. To benefit from this ability, the ally must be within 30 feet and have an active [[comm unit]] (such as those installed in most armor) or have a cybernetic or magitech eye(s) augmentation; if the ally has both a comm unit and applicable augmentation, you can broadcast to that ally at a range of 60 feet. When you use this trick, exocortex abilities that increase the number of targets you can track with combat tracking instead increase the number of targets that your ally can track.
This ability lasts until you end it with a swift action, you become [[unconscious]], you can no longer perceive the target, or the ally moves beyond this trick's range. You must have an [[exocortex]] to select this mechanic trick.
At 6th level, you can expend 1 Resolve Point to fire all of the starship weapons mounted in one arc (including turret-mounted weapons). Each weapon can target any vessel in that arc. All of these attacks are made with a –2 penalty.
Items that have taken damage in excess of half their total Hit Points gain the broken condition, meaning they are less effective at their designated tasks. The broken condition has the following effects, depending upon the item.
If the item is a weapon, any attacks made with the item take a –2 penalty to attack and damage rolls. Such weapons can't deal extra critical effects on a critical hit but still deal double damage.
If the item is armor, the bonuses it grants to AC are halved, rounding down. Broken armor doubles its armor check penalty to skill checks.
If the item is a vehicle, it has a –2 penalty to its AC and collision DC, its [[Piloting]] modifier decreases by 2, and its full speed and its MPH are halved.
If the item is a tool or a piece of cybertech or biotech that provides a bonus to ability checks, saving throws, skill checks, or speed (including new movement speeds), those bonuses are halved, rounding down (minimum 0).
If the item does not fit into any of these categories, the broken condition has no effect on its use.
Items with the broken condition, regardless of type, can be resold for only half the normal resale value (usually 5% of the item's purchase price). Any item can be repaired with a //[[mending]]// or //[[make whole]]// spell cast by a character with a caster level equal to or higher than the item's level. Items lose the broken condition if the spell restores the object to half its original Hit Points or higher.
In addition, magic items can be repaired with the [[Mysticism]] skill, and technological items can be repaired with the [[Engineering]] skill. Hybrid items can be repaired with either skill. Most repair shops (magical or technological) charge 10% of the item's original purchase price to repair such damage (or more if the item is badly damaged or ruined).
Choose either photon mode or graviton mode. When using [[stellar mode]], you can either become unattuned or enter only the chosen mode. When learning stellar revelations, you can choose only revelations associated with your chosen mode, including learning only the initial zenith revelation: [[black hole]] or [[supernova]]. You ignore the effect of disproportionate revelations. Multiply your solarian level by 1-1/2 for the purpose of calculating your insight bonuses to Reflex saves and damage rolls granted by graviton mode and photon mode, respectively.
At 3rd level, you must choose both of the skills for [[sidereal influence]] from the list for your chosen mode, and the ability’s effects apply to both skills while sidereal influence lasts. At 11th level, you choose one more skill from that list, and at 19th level, your sidereal influence applies to all five skills associated with your chosen mode. At 9th level, and again at 17th level, you learn two new revelations associated with your chosen mode, at least one of which must be a zenith revelation.
This alters your [[stellar mode]], [[stellar revelations]], [[sidereal influence]], and [[zenith revelations]].
Metallic valves are surgically grafted onto the ends of certain tubes in your lungs that offer some protection against inhaled toxins, but also contain microscopic pressurizes that can supercharge the air you breathe. As a reaction, when you’re subjected to an inhaled affliction or other effect that requires you to be able to breathe, you can shut these valves to gain a +2 circumstance bonus to the saving throw. The valves open at the beginning of your next turn, and you are unable to breathe until then, but if you’re still in the area of the harmful effect, you must use another reaction to continue to gain the benefit. In this way, you can avoid the normal effects of being in a vacuum for as long as you can hold your breath (and have reactions to use). In addition, when you’re [[fatigued]], you can spend 1 Resolve Point as a swift action to ignore the effects of that condition for 10 minutes, after which you become [[exhausted]].
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|bronchial valves | 2 | 700 | lungs |
</div>
Often found near seas and lakes, bronze dragons aid travelers of noble intent.
* ''CR'' 3+
* ''Required Creature Type and Subtype:'' dragon (water)
* ''Suggested Alignment:'' lawful good
* ''Traits:''
** [[blindsense]] (vibration) 60 feet and [[darkvision]] 120 feet
** [[frightful presence]] (CR 13+, 60 feet + 10 feet per CR)
** DR 5/magic (CR 13+; increase to DR 10/magic at CR 15, DR 15/magic at CR 17, DR 20/magic at CR 19)
** [[immunity]] to electricity
** swim speed of 60 feet
** [[breath weapon]] (line 30 feet + 10 feet per 2 CR, 1d6 E + 1d6 per CR)
** repulsion breath (see below)
** spell-like abilities (CR 7+)
** [[vortex]] (CR 21+)
** [[change shape]] (CR 7+, animal or humanoid)
** [[water breathing]]
* //Repulsion Breath ([[Su]]):// Instead of line of electricity, a bronze dragon can exhale a 30-foot cone of repulsing gas. Each creature within the cone that inhales the gas must succeed at a Will save or be compelled to do nothing but move away from the dragon for 1d6 rounds plus a number of additional rounds equal to half the dragon's CR. This is a mind-affecting compulsion effect.
A piece of metal jewelry originally used to fasten a cloak, a //brooch of shielding// has a brilliantly colored jewel mounted in its center. The brooch counts as a worn magic item unless you install it in armor, taking up one [[upgrade slot|Armor Upgrades]]. While worn, the brooch absorbs incoming force damage, which causes the jewel's color to fade. Once the brooch absorbs 55 force damage, the colorless jewel crumbles to dust and the brooch becomes nonmagical.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//brooch of shielding// | 2 | 1,000 | — |
</div>
<div class="statblock">
* ''CR'' 20; ''XP'' 307,200
* NE Gargantuan magical beast (aquatic, cold)
* ''Init'' +5; ''Senses'' [[blindsight]] (vibration) 120 ft., [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +34
!!! DEFENSE
* ''HP'' 400
* ''EAC'' 34; ''KAC'' 35
* ''Fort'' +19; ''Ref'' +19; ''Will'' +22
* ''Defensive Abilities'' depth-inured; ''Immunities'' cold
* ''Weaknesses'' [[vulnerable]] to fire
!!! OFFENSE
* ''Speed'' 20 ft., swim 60 ft.
* ''Melee'' slam +29 (13d6+25 B plus [[swallow whole]])
* ''Ranged'' keratin dart +31 (8d8+20 P)
* ''Space'' 20 ft.; ''Reach'' 20 ft.
* ''Offensive Abilities'' rage spasm (two 120-ft. cones, 4d12+20 E plus terrify, Reflex DC 27 half, usable every 1d4 rounds), swallow whole (13d6+25 A, EAC 34, KAC 31, 100 HP), terrify (DC 27)
* ''Spell-Like Abilities'' (CL 20th; ranged +31)
** 1/day—//[[mass inflict pain]]// (DC 29), //[[mass suggestion]]// (DC 29), //[[mind thrust]]// (6th level, DC 29), //[[psychic surgery]]//
** 3/day—//[[dominate person]]// (DC 28), //[[feeblemind]]// (DC 28), //[[greater synaptic pulse]]// (DC 28)
** At will—//[[confusion]]// (DC 27), //[[fear]]// (4th level, DC 27)
!!! STATISTICS
* ''Str'' +5; ''Dex'' +5; ''Con'' +9; ''Int'' +6; ''Wis'' +12; ''Cha'' +6
* ''Skills'' [[Athletics]] +34 (+42 to swim), [[Intimidate]] +39, [[Mysticism]] +39, [[Stealth]] +34, [[Survival]] +34
* ''Languages'' Common, Sarcesian (can't speak any language); [[telepathy]] 120 ft.
* ''Other Abilities'' [[compression]], [[water breathing]]
!!! ECOLOGY
* ''Environment'' any cold aquatic (Nisis)
* ''Organization'' solitary or breeding scrum (2–4)
!!! SPECIAL ABILITIES
''Depth-Inured ([[Ex]])'' A brood sovereign's invertebrate body is accustomed to navigating ocean depths. They're immune to damage related to changes in atmospheric or liquid pressure.
''Keratin Dart ([[Ex]])'' As a ranged attack, a brood sovereign can fire a horn-like dart with a range increment of 100 feet. This ranged attack ignores penalties for attacking underwater.
''Rage Spasm ([[Su]])'' A brood sovereign's xenophobic rage is so great that they can radiate it from their bodies in both physical and psychic manifestations. As a full action, a brood sovereign can cause their tree-like crowns to spasm violently, sending out two 120-foot cones of concentrated psychic anger that can be aimed independently. A creature caught in the area of at least one cone takes 4d12+20 electricity damage as its brain and nervous system short out (Reflex DC 27 half).
''Terrify ([[Su]])'' A creature that takes damage from a brood sovereign's rage spasm ability must attempt a DC 27 Will saving throw. On a failure, the creature gains the [[panicked]] condition for 1d6 rounds. At the end of an affected creature's turn, it can attempt an additional saving throw to end the panicked condition early; on a successful save, it's instead [[shaken]] for the remainder of the effect's duration.
</div>
These rare, titanic slug-like creatures dwell amid coral reefs of polar oceans, such as the core of icy Nisis in the Diaspora. Nibbling on the reef ridges with their rasping footpads and conifer-like sensory appendages, brood sovereigns consume silicon-laced corallites, and their bodies process the element into defensive dermal nodules and pseudo-circuitry within their brains. Over millennia, this augmented brainpower has endowed brood sovereigns with true, but malign, intelligence.
The brood sovereigns of Nisis believe themselves the world's true rulers, so they've begun to psychically direct other sea life to drive off the intelligent species that they view as interlopers.
A Veskarian corporation, Brortrav Ordnance Factories manufactures a wide range of personal weaponry, but it is most famous for its specialty heavy weapons that incorporate menacing decorative elements such as spikes and fanged maws. These motifs are intended to be stylish, and yet unnerving to your foes. When you fire a Brortrav heavy weapon, targets take a –2 penalty to attack rolls for attacks of opportunity made against you as a result of that ranged attack. Brortrav heavy weapons cost 10% more than normal and have a bulk 1 higher than normal.
You gain a +2 insight bonus to damage rolls with weapons that have the [[blast]] special property (such as a [[scattergun]]). This extra damage applies only to creatures within 10 feet of you; creatures farther away take the normal amount of damage. This bonus increases by 1 for every 4 soldier levels you have.
You use your finely honed natural attacks to rend an enemy to pieces.
''Prerequisites:'' Str 17, Dex 13, base attack bonus +6, [[Rending Slash]]
''Benefit:'' When your unarmed strike inflicts [[bleed|Bleeding (condition)]] damage using your [[Rending Slash]] feat, that unarmed strike deals additional slashing damage equal to half your character level. The bleed damage caused by Rending Slash increases to 1d8 + half your character level, or 2d8 + half your character level if your base attack bonus is +13 or higher.
<div class="statblock">
* ''CR'' 15; ''XP'' 51,200
* CE Medium aberration (chaotic, evil)
* ''Init'' +9; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +26
* ''Aura'' impossible aura (15 ft., DC 23)
!!! DEFENSE
* ''HP'' 233
* ''EAC'' 28; ''KAC'' 29
* ''Fort'' +13; ''Ref'' +13; ''Will'' +20
* ''Resistances'' electricity 15, fire 15; ''SR'' 26
* ''Weaknesses'' [[vulnerable]] to cold
!!! OFFENSE
* ''Speed'' 40 ft.
* ''Melee'' claw +22 (5d8+22 S)
* ''Ranged'' ray of light +24 (4d6+15 F)
* ''Offensive Abilities'' spectrend
* ''Spell-Like Abilities'' (CL 15th)
** 1/day—//[[dominate person]]// (DC 25), //[[mislead]]// (DC 25)
** 3/day—//[[confusion]]// (DC 24), //[[greater invisibility]]//, //[[mind probe]]// (DC 24), //[[mind thrust]]// (4th-level, DC 24)
** At will—//[[arcane sight]]//, //[[clairaudience/clairvoyance]]//
!!! STATISTICS
* ''Str'' +7; ''Dex'' +5; ''Con'' +5; ''Int'' +9; ''Wis'' +5; ''Cha'' +5
* ''Skills'' [[Intimidate]] +26, [[Mysticism]] +31, [[Stealth]] +31
* ''Languages'' Aklo, Common; [[telepathy]] 100 feet
* ''Other Abilities'' light absorption
!!! ECOLOGY
* ''Environment'' any (Aucturn)
* ''Organization'' solitary, pair, or canvas (3–7)
!!! SPECIAL ABILITIES
''Impossible Aura ([[Su]])'' Once per hour as a swift action, a bryrvath can emit an aura of
colors that could not possibly exist; these inconceivable hues ravage the sanity of any creature that stands within them. This aura has a range of 15 feet and lasts for 5 rounds. A creature that begins its turn within or enters the aura must attempt a DC 23 Will saving throw. On a failure, the creature takes 1d4 Intelligence and Wisdom damage; a success means the creature takes 2d6 damage and is [[sickened]] until the beginning of its next turn. This is a mind-affecting, sense-dependent effect.
''Light Absorption ([[Su]])'' When a bryrvath is within 10 feet of any light source, it can absorb a portion of the light into its body as a move action. The bryrvath attempts a caster level check (DC = 11 + the item level if the source is an item, or the spell's caster level if the light comes from a spell); on a success, the light emitted from the target source is lowered by one step for 1 hour and the bryrvath regains 5 Hit Points.
''Ray of Light ([[Su]])'' As an attack, a bryrvath can unleash a focused ray of light that can burn a target like the beam of a powerful laser rifle. This ray has a range increment of 120 feet, but it doesn't function in areas of bright light.
''Spectrend ([[Su]])'' In an area illuminated by dim light or brighter, a bryrvath can slash its claws
through the air in a square adjacent to it, rending the spectrum into tatters. This produces a stationary anomaly of twisting and roiling, half-seen, non-Euclidean shapes that persists for 1d4 rounds. A creature that can see this anomaly at the start of its turn can attempt a DC 23 Will saving throw. If it fails, it is [[confused]] for 1 round; if it succeeds, it is instead [[dazzled]] for 1 round. This is a mind-affecting, sense-dependent effect.
</div>
For many creatures, light is a source of hope and healing, often associated with benevolent gods and their servants. For others, light is an abhorrence to be shunned at all costs, as it causes disorientation and pain, if not complete extermination, upon exposure. For adventurers, light can be an invaluable resource, guiding them through uncharted territory or acting as a beacon to draw them home after they have become lost in the darkness of space.
For bryrvaths, light is a plaything that they twist into an impossible spectrum. Dwelling primarily on the foreboding planet of Aucturn, bryrvaths are a bane to creatures that use light for survival. A bryrvath appears to feed upon any source of light it can find, regardless of whether the light is natural, technological, or magical in origin. It can absorb light in its immediate vicinity, using the waves and packets of photons to nourish itself. Speculation endlessly spins around whether a bryrvath actually consumes light out of hunger or whether it seeks to snuff out light as a source of perverse pleasure. The truth may be utterly alien to any sane mind.
A bryrvath is difficult to describe because of the way its body interacts with light and darkness. Those who have seen a bryrvath and survived provide conflicting accounts of the creature. Cobbled together, these many tales tell of a multi-limbed humanoid (some say two limbs, some say eight, while others say an infinite number) whose head is constantly masked by swirling shadows. At least one pair of its limbs ends in obsidian claws. Its body has several lipless gashes that open to draw in light. A bryrvath appears to have no actual skeletal structure, moving like rubber—sometimes upright, sometimes on all its limbs, and other times tumbling and clambering about in chaotic locomotion. Whenever it moves, its body seems somehow out of joint with itself: its limbs may appear detached in one moment, and then in the next, its entire torso may seem to split at an impossible angle, as if viewed through a pane of cracked glass, never quite aligning in a way that makes sense.
In the act of feeding, a bryrvath emanates a distorted aura of colors that can't possibly exist in this multiverse; some who see this display have horrific dreams for the rest of their lives, envisioning alien cities or whole planets baking beneath a sun that blazes with hues no eye has ever seen. Oddly, such victims also display a tendency toward a mental condition that prevents them from properly recognizing color, rendering them fully color-blind.
Many occult scholars posit that what can be seen of a bryrvath's form is only a fraction of its true self and that it exists simultaneously in several other dimensions. This theory goes on to explain that a bryrvath's impossible aura is but a glimpse of the aberration's other facets (hence the strange, mind-bending colors). The academics who put forth this hypothesis have yet to present any kind of proof, though they work tirelessly to fabricate the necessary detection equipment to prove or disprove the theory. This has given rise to an obscure branch of study called esoteric optics that blends the physics of light with various arcane rituals. Though not many in the Pact Worlds have heard of this field, it occasionally appears in news vidfeeds, such as when an expert is committed to a psychiatric hospital after splashing acid in his eyes and raving about "the impending refraction."
While bryrvaths are very intelligent, they don't appear to have an advanced society of any kind. They occasionally gather in small groups for unknown reasons, usually near a source of bright light, much in the way certain animals congregate around a watering hole. Also, despite their intelligence, bryrvaths have very little use for tools, as their unusual feeding needs don't require them; they instead rely on their spell-like abilities and natural weapons to defend themselves.
The average bryrvath is 6 feet tall when standing upright and weighs approximately 250 pounds. While often found in areas that are primarily covered in darkness—presumably to plunge those who carry artificial light sources into terrible inky blackness—a bryrvath shows no fear of natural light, though it tends not to linger in areas exposed to it.
!! Aura Goggles
Physicists from AbadarCorp who specialize in esoteric optics risk their lives and their sanity studying the bryrvath's predilection for absorbing and ingesting light, hoping to find some way to recreate the effect (an ability that would undoubtedly be very useful to stealthy infiltrators and snipers). While they were unsuccessful, they did develop goggles that mitigate the effects of the bryrvath's impossible aura as well as other sight-based attacks. This eyewear—dubbed //aura goggles//—also allows the wearer to see sources of magic.
{{Aura Goggles}}
<div class="statblock">
* ''Type'' disease (inhaled or injury)
* ''Save'' Fortitude DC 17
* ''Track'' [[physical]]
* ''Frequency'' 1/day
* ''Cure'' 2 consecutive saves
You have used your unique biology to bud off a biological drone you can more easily integrate with.
''Prerequisites:'' Drone class feature, adaptation or early stage adaptation racial trait
''Benefit:'' Your drone has living components. You can use [[Medicine]] instead of [[Engineering]] to repair it, and your drone naturally heals to full Hit Points when you rest for 8 hours. A drone modified in this way is considered an aberration rather than a construct for the purpose of spells and effects targeting it. In addition, [[Life Science]] and [[Medicine]] become class skills for you.
A reusable battlefield trap that SDF soldiers deploy to secure locations and encampments against wild animals and smaller [[Swarm]] foes, a bug snare is four large metallic claws that extend outward from a central point and snap shut when disturbed. As a full action, you can set a bug snare at an intersection to cover a 5-foot radius. The next creature that steps into that radius sets off the trap and must succeed at a DC 13 Reflex save or take 1d4 piercing damage and gain the [[entangled]] condition until it (or an adjacent ally) can extricate itself with a successful DC 14 Strength check as a standard action. An included wireless remote control can be used to disarm the trap from 15 feet away as a move action. You can attempt to hide a bug snare from view with a [[Stealth]] check (this check is opposed by the [[Perception]] check of a potential target). You can attach a bug snare to a fixed object (such as a nearby tree) with a length of cable line, rendering a trapped creature immobile, but this grants any creature attempting to spot a hidden bug snare a +2 circumstance bonus to its Perception check.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|bug snare | 10 | 740 | 2 | 20 | 1/use |
</div>
Bugging weapons are primarily designed to attach a tracking device to a starship on a successful hit, and thus don't typically deal damage. The tracking device allows the starship that made the attack to trace the bugged starship even when it engages a [[cloaking device]]. The tracking device stops functioning once the bugged vessel enters the Drift. Otherwise, personnel must remove the device from the exterior of the starship and deactivate it (requiring a successful [[Engineering]] check with a DC equal to 10 + 1-1/2 × the tier of the attacking ship) in order to prevent being tracked. A bugged ship automatically knows it has been bugged.
You build a temporary shelter in order to mitigate adverse environmental effects.
''Activity:'' You spend the day building a 10–foot-by-10-foot shelter from nearby material that can accommodate one Large creature or two Medium or Small creatures. At the end of the day, attempt a DC 20 [[Survival]] check. You can't take 20 on this check.
''Results:'' On a failure, the shelter lasts for only the following day. On a success, it lasts for a number of days equal to the number by which your result exceeded the check's DC. While the shelter lasts, occupants of the shelter are protected from [[cold dangers]] and [[heat dangers]]. This also counts as a shelter for the purpose of Survival checks to endure severe weather and protects its occupants from damage from dust storms and thunderstorms. At the GM's discretion, a well-built shelter might also provide other protections.
The statistics and definitions below define a fleet's capabilities.
''Name and Tier:'' This is the fleet's name and power level. Fleets of the same tier are roughly comparable in strength but can vary based on their size and specializations. A fleet's tier can at most be 1 higher than its armada's tier.
''Size:'' This is a relative measure of how many starships make up the fleet or the relative size of the primary starship in the fleet. A fleet's size impacts its Hull Points, Shield Points, damage, and Base Cost.
''Speed:'' This is the number of hexes a fleet can move each turn.
''Maneuverability:'' This entry determines how quickly a fleet can turn. The maneuverability ratings and their turn distances are the same as those in [[starship combat]].
''Armor Class (AC):'' This value is used when determining whether an attack hits a fleet. It is based primarily on the fleet's tier. A fleet with 1 or more Shield Points also gains a +1 bonus to AC against gunnery checks originating from its front arc.
''Hull Points (HP):'' This is the total amount of damage a fleet can take before being defeated. Each fleet has 1 HP plus an additional number of HP multiplied by its tier: 3 HP per tier for Small fleets, 4 per tier for Medium fleets, and 5 per tier for Large fleets.
''Critical Threshold (CT):'' When a fleet's HP are reduced to this value, the fleet takes critical damage, reducing its effectiveness. This value is always one-half the fleet's HP (rounded down).
''Shield Points (SP):'' This is the total amount of damage a fleet can take before losing Hull Points. Shield Points regenerate over time. Each fleet has a number of SP equal to its HP divided by 3, rounded down.
''Strong and Weak:'' Many fleets are especially strong against or vulnerable to other types of fleets. Against a fleet to which it is weak, a fleet takes +1 damage per damage die. Against a fleet against which it is strong, a fleet takes –1 damage per damage die.
''Check Modifier:'' This is the modifier the fleet applies to d20 rolls when attacking, performing complex feats, or checking morale, similar to how a starship crew would use [[Computers]], gunnery, and [[Piloting]] modifiers. A fleet's base modifier is +1, and it increases by 1 at every odd tier above tier 1. An armada's [[officers]] can grant a fleet a bonus to certain checks.
''Damage:'' This is the amount of damage a fleet deals when it hits a target.
<div class= "table-wrapper">
| Tier | Small Damage | Medium Damage | Large Damage |h
| 1 | 1d4 | 1d6 | 1d8 |
| 2 | 1d6 | 1d8 | 1d10 |
| 3 | 1d8 | 1d10 | 1d12 |
| 4 | 2d6 | 2d8 | 2d10 |
| 5 | 2d6 | 2d8 | 2d10 |
| 6 | 3d6 | 3d8 | 3d10 |
| 7 | 3d6 | 3d8 | 3d10 |
| 8 | 4d6 | 4d8 | 4d10 |
| 9 | 4d6 | 4d8 | 4d10 |
| 10 | 5d6 | 5d8 | 5d10 |
| 11 | 5d6 | 5d8 | 5d10 |
| 12 | 6d6 | 6d8 | 6d10 |
| 13 | 6d6 | 6d8 | 6d10 |
| 14 | 7d6 | 7d8 | 7d10 |
| 15 | 7d6 | 7d8 | 7d10 |
| 16 | 8d6 | 8d8 | 8d10 |
| 17 | 8d6 | 8d8 | 8d10 |
| 18 | 9d6 | 9d8 | 9d10 |
| 19 | 9d6 | 9d8 | 9d10 |
| 20 | 10d6 | 10d8 | 10d10 |
</div>
''Range:'' This is the range at which a fleet can fire its weapons, measured in hexes. A fleet's range is broken into three distances: short range, long range, and extreme range. Attacks made against a target within short range take no range penalty; attacks beyond short range but within long range take a –2 penalty; and attacks beyond long range but shorter than extreme range take a –4 penalty. A starship can't attack targets beyond its extreme range.
''BP Cost:'' This is the fleet's cost in Build Points (BP). BP are an abstract resource used for creating and upgrading fleets.
<div class="table-wrapper">
| Tier | Small BP Cost | Medium BP Cost | Large BP Cost |h
| 1 | 5 | 6 | 8 |
| 2 | 6 | 8 | 10 |
| 3 | 9 | 12 | 15 |
| 4 | 12 | 16 | 20 |
| 5 | 15 | 20 | 25 |
| 6 | 18 | 24 | 30 |
| 7 | 21 | 28 | 35 |
| 8 | 24 | 32 | 40 |
| 9 | 27 | 36 | 45 |
| 10 | 30 | 40 | 50 |
| 11 | 33 | 44 | 55 |
| 12 | 36 | 48 | 60 |
| 13 | 39 | 52 | 65 |
| 14 | 42 | 56 | 70 |
| 15 | 45 | 60 | 75 |
| 16 | 48 | 64 | 80 |
| 17 | 51 | 68 | 85 |
| 18 | 54 | 72 | 90 |
| 19 | 58 | 77 | 95 |
| 20 | 60 | 80 | 100 |
</div>
''Special Abilities:'' These are the fleet's additional properties that modify its statistics or provide additional options in combat. Most special abilities cost additional BP and can be applied only to particular fleet types.
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Building a Fleet'>>
</div>
!! Step 1: Conceptualize
Start by deciding what kind of mech you're designing, with a general idea of its purpose and required number of operators.
!! Step 2: Allocate Mech Points
As a group, your party has a pool of Mech Points (MP) with which to create one or more mechs, with each PC contributing a number of points to the pool based on their level. The group can then pool or divvy up these MP as they see fit to create one or more mechs, whether it be a single-pilot mech for each PC, one assembled mech for the whole party, or a combination of mechs in between. No one mech can be built using more than three times the MP of any other mech in the group.
The party determines a mech's tier based on the number of MP they assign to the mech. The mech's tier can't exceed the party's Average Party Level (APL) by more than 1. For example, a group of four 5th-level PCs would have a total of 300 MP and an APL of 5. They could create one mech with the 300 MP, and although its maximum tier would be 6, the PCs would have lots of leftover MP to spend on additional features for it. Alternatively, they might create three tier-5 mechs. If each PC wanted their own single-pilot mech, they might instead split the MP evenly, each spending 75 MP to create their own tier-4 mech.
!! Step 3: Select Frame
Each mech has a [[frame|Mech Frames]], a reinforced torso that houses its power core, operators, and various systems. A mech's frame determines its size category, crew complement, Hit Points, frame slots, auxiliary slots, speed, EAC, KAC, and hardness. Each frame costs a number of MP based on the mech's tier.
!! Step 4: Select Limbs
Each mech includes a set of [[upper limbs and lower limbs|Mech Limbs]]. Unless your mech has a special ability that allows it to install an exceptional number of limbs, each mech includes only one set of upper limbs and one set of lower limbs, and each set can affect the mech's Hit Points, speed, weapon slots, attack modifiers, EAC, and KAC.
!! Step 5: Select Power Core
A mech's [[power core|Mech Power Cores]] determines how much power it can store and generate, measured in Power Points (PP), which allow the mech to perform exceptional actions.
!! Step 6: Select Weapons
A mech can mount as many [[weapons|Mech Weapons]] as it has frame slots, upper limb slots, and lower limb slots. A weapon's level determines its damage and MP cost; each weapon also gains a simple template based on its type that can affect its damage, range, and special abilities. A mech must either mount or hold any weapons in its available weapon slots.
!! Step 7: Select Auxiliary Systems
Each mech frame provides auxiliary slots, each of which can accommodate one [[auxiliary system|Auxiliary Systems]] to provide additional capabilities. These systems don't cost additional MP.
!! Step 8: Select Upgrades
If you have leftover Mech Points, you can spend them on miscellaneous [[upgrades|Mech Upgrades]], such as a frame reinforcement that provides additional HP or an enhancement to the mech's speed.
!! Step 9: Add Details
Finally, determine your mech's remaining statistics using the information in [[Mech Statistics]] and record them on the mech sheet. You might also want to give your mech a name, quirks, a physical description, and so on.
!! Mech Points per PC
<div class= "table-wrapper">
| PC Level | MP per PC |h
| 1 | 15 |
| 2 | 30 |
| 3 | 45 |
| 4 | 60 |
| 5 | 75 |
| 6 | 90 |
| 7 | 105 |
| 8 | 120 |
| 9 | 135 |
| 10 | 150 |
| 11 | 165 |
| 12 | 180 |
| 13 | 195 |
| 14 | 210 |
| 15 | 225 |
| 16 | 240 |
| 17 | 255 |
| 18 | 270 |
| 19 | 285 |
| 20 | 300 |
</div>
!! Minimum Mech Points
<div class= "table-wrapper">
| Mech Tier | Minimum MP |h
| 1 | 30 |
| 2 | 45 |
| 3 | 60 |
| 4 | 75 |
| 5 | 90 |
| 6 | 105 |
| 7 | 120 |
| 8 | 135 |
| 9 | 150 |
| 10 | 165 |
| 11 | 180 |
| 12 | 195 |
| 13 | 210 |
| 14 | 225 |
| 15 | 240 |
| 16 | 255 |
| 17 | 270 |
| 18 | 285 |
| 19 | 300 |
| 20 | 315 |
</div>
Use these guidelines to design a squadron. Except where noted, building squadron ships is identical to building a single starship.
''Conceptualize:'' Start by deciding how many starships are in the party's squadron and who is most likely to operate them. Usually, the number of starships shouldn't exceed the number of PCs, though the PCs could recruit NPC pilots to expand their squadron.
''Determine Squadron Tier and Assign Starship Tiers:'' The squadron's tier is equal to the PCs' average party level (APL), which is determined by totaling the PCs' levels and dividing by the number of PCs. The number of starships and the squadron's tier determine the individual starships' tiers, per the following table.
<div class= "table-wrapper">
| Number of Starships | Starship Tier |h
| 2 | APL – 1 |
| 3 | APL – 2 |
| 4 | APL – 3 |
| 5 | APL – 4 |
| 6 | APL – 5 |
</div>
''Build Starships:'' The PCs design their squadron starships following the standard design rules for [[building starships]]. Because of the minimum crew requirements for larger starships, squadron starships are almost always Medium or smaller. A Tiny squadron starship always has capacity for an [[escape pod]] expansion bay, even though the starship would otherwise lack expansion bay space.
The GM may elect to build one, some, or all of the starships in advance if the campaign requires that PCs operate standard-issue ships or premade vessels (such as in a military campaign with standardized starships).
''Design the HQ (Optional):'' Many squadrons consist of starships too small or claustrophobic for long-term use. Instead, these starships regularly dock within a larger flagship that serves as the team's headquarters (HQ). The HQ is primarily a utility vessel built with the heavy freighter or carrier base frame. The HQ's effective tier equals the squadron tier, and it gains only 25% the number of starship Build Points normally granted to a starship of its tier. However, the cost of its base frame and any [[hangar bay]] or [[shuttle bay]] expansion bays is only 10% the normal cost (minimum 1 each). The HQ must be outfitted with enough hangar bays or expansion bays to accommodate the entire squadron. The HQ can combine three shuttle bays to accommodate a single Medium starship. In addition, the HQ's minimum crew is reduced to four, and it loses all weapon mounts except a single turret with a mount for a light weapon.
An HQ is a good fit for a squadron piloted by independent adventurers, giving them a place to retire between encounters and interact face-to-face. It increases the squadron's number of Build Points available by accommodating some of the expansion bay facilities (like a medical bay or tech lab) that the smaller starships might otherwise have installed. However, it's also an added complication. If an HQ isn't a good fit for your group or campaign, it's entirely possible to do without one. Alternatively, in a game where the PCs are part of a larger organization like a military or commercial expedition, there could be a much larger ship nearby that serves as their HQ but is run by NPCs.
''Details:'' After performing the earlier steps, the PCs should devise unifying details for the squadron, such as a visual design common to the starships or a squadron name.
Each armada is created using the same process. An armada's tier typically matches the PCs' average party level, and the armada gains a number of Build Points (BP) based on its tier, with which it acquires [[fleets|Building a Fleet]] and special abilities for those fleets. Each fleet costs a number of BP based on its tier, size, and special abilities, all of which contribute to the fleet's power level. Except at the GM's discretion, the maximum tier of any fleet in an armada is the armada's tier + 1. Appoint one of these fleets as the armada's [[flagship]], which provides the armada additional benefits.
<div class= "table-wrapper">
| Tier | Armada Build Points | Tier | Armada Build Points |h
| 1 | 36 | 11 | 264 |
| 2 | 48 | 12 | 288 |
| 3 | 72 | 13 | 312 |
| 4 | 96 | 14 | 336 |
| 5 | 120 | 15 | 360 |
| 6 | 144 | 16 | 384 |
| 7 | 168 | 17 | 408 |
| 8 | 192 | 18 | 432 |
| 9 | 216 | 19 | 456 |
| 10 | 240 | 20 | 480 |
</div>
As a GM, you can create mech combatants to challenge the PCs using the rules in the Building a Mech section on. When doing so, calculate a mech's challenge rating by adding 2 to its CR if it has one operator, 3 to the CR if it has 2–3 operators, and 4 to the CR if it has 4 or more operators. Assume an operator's [[Piloting]] ranks equal the mech's tier. Be aware that mechs designed in this way have statistics best suited for PCs, and as a result, such mechs have fewer Hit Points, stronger defenses, lower attack bonuses, and slightly lower damage per attack than a creature of comparable CR.
As a recommended alternative, use the following rules to create NPC mechs that are both quicker to design and better designed for use as antagonists.
* ''Challenge Rating:'' Select the mech's CR. Remember that PCs in their own mechs are much stronger, and an enemy mech's CR must be approximately 3 higher than normal to provide an equivalent challenge.
* ''Operators:'' Because a mech's number of actions depends on its number of operators, an NPC mech's statistics depend on its number of operators; a larger number of operators results in the mech having lower bonuses to compensate. Use the instructions below for a mech with 1 operator. For a mech with 2–3 operators, treat the mech's CR as 2 lower for the purpose of calculating its attack bonuses. For a mech with 4–6 operators, treat the mech's CR as 3 lower for the purpose of calculating its attack bonuses.
* ''Statistics:'' Follow the instructions for [[building a creature|Step 1: Array]], using the EAC, KAC, saving throw bonuses, attack bonuses, and ability DCs for a creature of the chosen CR. Use the skill bonuses for a creature whose CR is 3 lower than the mech's CR. NPC mechs use the combatant array.
* ''Hit Points and Shield Points:'' Use the listed number of Hit Points for a creature whose CR is 2 lower than your mech's CR. Give the mech a number of Shield Points equal to one-fifth the mech's Hit Point total. Each turn, the mech regains a number of missing Shield Points equal to its CR.
* ''Weapons and Damage:'' Rather than use the damage listed in the combatant array, give the mech several [[mech weapons]] whose levels are each 3 lower than the mech's CR (minimum 1). A typical mech should have weapons whose combined Mech Point cost per level is approximately 9, providing it with about three weapons. Use the weapons' level and type to determine their base damage dice, per the table for weapon damage. For ranged weapons, add the mech's CR – 3 (minimum 0) as a damage modifier. For melee weapons, add an additional damage modifier of 5, representing the mech's extraordinary strength.
* ''Hardness:'' The mech has a hardness value equal to half its CR, rounded down.
* ''Speed:'' A typical mech has a speed of 40 feet. Optionally, increase the mech's speed by up to 40 feet, give the mech a fly speed of 60 feet (average), or a swim speed of 60 feet.
* ''Power Points:'' A typical mech begins an encounter with 3 Power Points, regains 1 PP per turn, and can store a maximum of 5 PP.
* ''Auxiliary Systems:'' The mech can select up to 4 auxiliary systems. Depending on the role the mech plays in the encounter, it might not need all of these systems. In general, limit the mech to one auxiliary system that's restricted to a particular mech frame, such as a [[cloaker]] or [[teleporter]].
<<list-links "[tag<currentTiddler>]" class:index>>
Regardless of starships' size and purpose, they're all created using the same process. GMs and players alike can use the following steps to create an incredibly diverse array of vessels, from sleek science ships and nimble skirmishers to heavily armored combat frigates.
When creating a starship, follow these steps.
''Step 1: Conceptualize.'' Start by deciding what type of starship you are designing, with a general idea of its purpose and required crew size. If you are creating a starship to be used by PCs, make sure that all the PCs can fit within the vessel. Some of the choices you make later might depend on your overall concept.
''Step 2: Determine tier and Build Points.'' If you are creating a PC starship, determine the characters' APL by adding together the characters' levels and dividing by the number of characters. That number is their ship's tier. If designing enemy starships, decide the difficulty of the encounter and choose the enemy ship's tier. Once you know the tier of the ship, consult [[Table: Base Starship Statistics]] to determine the number of Build Points you can spend to create the starship. Note that a starship receives a boost to its Hull Points equal to its HP increment at tiers 4, 8, 12, 16, and 20.
{{Table: Base Starship Statistics}}
''Step 3: Select a frame.'' Each starship is built upon one of a variety of [[base frames]] that determines its size, maneuverability, crew complement, weapon mounts, and other basic statistics. Each frame costs a certain number of Build Points.
''Step 4: Select a power core.'' A starship's [[power core]] determines its overall power available (listed in power core units, or PCU), so you should spend Build Points on it first. This amount of power can be used as a kind of budget when installing other systems, such as thrusters and weapons.
''Step 5: Select thrusters.'' A starship without a means of propulsion is nothing more than a floating target (or an inert hunk of metal on a planet's surface), so spending Build Points on the starship's [[thrusters]] should be your next priority. Thrusters are listed by starship size and speed (in hexes) during combat.
''Step 6: Select other systems.'' Next, spend your remaining Build Points on all the other systems you wish to have on your starship. To be effective in combat, a starship needs [[armor|Armor (starship)]], [[defensive countermeasures]], [[shields|Shields (starship)]], and [[weapons|Starship Weapons]]. If you wish to travel to locations outside of your home star system, it also needs a [[Drift engine]]. Other, more optional purchases include upgrades to the starship's [[computers|Computers (starship)]], [[expansion bays]], security, and [[sensors]].
''Step 7: Add details.'' Finally, once all these choices have been made, you should give your starship a name, determine its relevant statistics (such as its AC and TL), and add any other details (such as quirks, physical description, and so on).
<<section 'Refitting and Upgrading Starships'>>
!! See Also:
* [[Biomechanical Starships]]
* [[Supercolossal Starships]]
<div class="statblock">
* ''Size'' Huge
* ''Maneuverability'' poor (–1 Piloting, turn 3)
* ''HP'' 160 (increment 20); ''DT'' 5; ''CT'' 32
* ''Mounts'' forward arc (1 heavy), aft arc (1 heavy), turret (2 light)
* ''Expansion Bays'' 10
* ''Minimum Crew'' 20; ''Maximum Crew'' 50
* ''Cost'' 55
You knock the target back 5 feet, plus 5 additional feet for every 5 by which the result of your attack roll exceeds the target's KAC + 8. If an obstacle is in the way, the target stops at the obstacle instead.
Bullet Barrage ([[Ex]])
You gain a +1 insight bonus to damage rolls for weapons in the projectile category. This bonus increases by 1 for every 4 soldier levels you have.
Whether the roar of flamethrowers heralds your entrance or the staccato beat of bullets punctuates your battle cries, you're a master at using heavy weapons.
!! Spray Targets (1st)
When attacking an area (like a line or cone) with heavy weapons, you ignore [[concealment]] and any [[cover]] less than total cover.
!! Focus Fire (5th)
When you make a single attack against an area—such as by using a weapon's automatic mode—and the attack would affect only a single target, you can focus your attack on that target. If you hit, the target chooses to either drop [[prone]] or take additional damage from the attack equal to your soldier level. Dropping prone doesn't negate the normal damage, nor does it affect the target's AC against the triggering attack. This attack expends all of the weapon's remaining ammunition, even if the attack wouldn't normally do so.
!! Furious Reload (9th)
On your turn, you can spend 1 Resolve Point to reload a heavy weapon without using an action. When you do so, you gain a +1 morale bonus to attack rolls made with the reloaded weapon as well as temporary Hit Points equal to your key ability score modifier. Both effects last until the beginning of your next turn.
!! One-Handed Gunner (13th)
You can wield a two-handed heavy weapon with only one hand as long as your Strength exceeds the minimum Strength needed to wield the weapon without a penalty by 2 or more. When you're using two hands to operate a heavy weapon you could wield one-handed, once per round when you hit a target with the weapon, you can provide [[covering fire]] to one of your allies against the target you hit in addition to dealing damage.
!! Overwhelming Firepower (17th)
When you use a heavy weapon to attack an area, choose any number of targets in the area that you missed with the attack and that don't benefit from total cover. The selected targets still take damage from the attack equal to your soldier level or equal to the weapon's damage, whichever is lower. The damage type is identical to that dealt by the weapon.
You can use Intimidate to bully a creature to temporarily [[change its attitude|change attitude]] to helpful (see [[Diplomacy]]). This is a language-dependent, sense-dependent ability. You must spend at least 1 minute conversing with the creature. The DC of this check is equal to either 10 + your opponent's total Intimidate skill bonus, or 15 + 1-1/2 × the opponent's CR, whichever is greater. If you succeed, the creature gives you information it has that you want, takes actions that do not endanger it, or grants limited assistance that you request, but does so under duress. Such a change in attitude lasts for 1d6 × 10 minutes. At the end of this time, the creature's attitude toward you becomes unfriendly. If you fail the check by 5 or more, the creature's attitude becomes unfriendly, or hostile if it was already unfriendly. If the creature becomes unfriendly due to a failed check, it is likely to try to deceive you or otherwise hinder your goals.
You specialize in close combat, leveraging your intimidating presence to crush your foes’ defenses and hinder their attacks.
''Associated Skills:'' [[Athletics]] and [[Intimidate]]. You can attempt an Intimidate check with a +4 bonus to make a trick attack by menacing your opponent, making them hesitate to raise a defense. This is a fear effect, and if your foe has a bonus to saving throws against fear effects, they also apply it to the skill check DC of this Intimidate check.
''Specialization Exploit:'' [[fearsome presence]]
''Domineering Strike ([[Ex]])'': Whenever you make a [[trick attack]] against a creature that’s [[frightened]], [[panicked]], [[prone]], or [[shaken]], you treat any trick attack damage dice that roll a 1 or 2 as if they had rolled a 3 instead.
[[Trox]] are intimidating creatures with sturdy, chitinous shells, and this augmentation grants you an artificial version of that armor which you can use to shield your allies. When you fight defensively or take the total defense action, you can grant half the bonus to AC granted by that action to an adjacent ally (who receives that bonus only as long as they remain adjacent to you).
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|bulwark graft | 2 | 600 | spinal column |
</div>
Most [[vlakas]] are acutely attuned to the emotional states of others, and with a well-timed word or a knowing glance they can bolster their allies. Augmentations to the empathic regions of your neural system emulate this trait, allowing you to identify the perfect time to encourage your allies. As a standard action, you can spend 1 Resolve Point to restore 1 Resolve Point to an ally within 30 feet. You can't use this ability again until you have taken a 10-minute rest to regain Stamina Points. This is a sense-dependent, mind-affecting effect.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|buoy graft | 8 | 9,500 | spinal column |
</div>
This silky, palm-sized pouch is worn on the back and includes stretchy bands that can slip over all major limbs. Visitors to Bretheda don buoyant harnesses while within the upper levels of the planet's atmosphere, but some planetary explorers also find them useful for arresting sudden falls.
Putting on a buoyant harness is a full action. You can deploy a properly attached buoyant harness as a reaction by pulling sharply on any of the bands. Once deployed, the pouch uses organically heated helium to inflate into a balloon as large as you and filling the space directly above you, causing you to float; while floating, use the rules for moving in zero gravity. A buoyant harness does not function in heavy or extreme gravity. The balloon remains inflated and self-heated as long as it has charges remaining. You can deflate it as a move action, collapsing it by the start of your next turn. If you deflate a buoyancy harness while it is maintaining your altitude, you immediately descend 60 feet; if you reach the ground, you land safely. If not, you fall any remaining distance.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|buoyant harness | 2 | 500 | L | 20 | 2/hour |
</div>
This backpack doubles as a flotation device thanks to hard-shelled pockets of inert gas sewn into the lining. The pack functions as an industrial [[backpack]], and its hydrophobic polymer fibers keep all items stored inside dry. Also, a buoyant pack helps keep you afloat while worn or held in two arms; while swimming, you sink deeper when you fail an [[Athletics]] check to swim by 10 or more, rather than failing by 5 or more. Further, if you take no actions on your turn (including if you're [[unconscious]]), you can automatically stay afloat in any fluid whose Athletics DC to swim is 15 or less. The backpack's air pockets make it difficult to dive, and you take a –1 penalty to Athletics checks to swim below the surface (except to ascend) while wearing this backpack.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|buoyant pack | 1 | 50 | 1 |
</div>
First commissioned by the wardens of the prison-planet Daegox 4 and now used in prisons throughout Near Space, the //burdening// weapon fusion often bears chains or manacles. When you score a critical hit using a weapon with the //burdening// fusion, the target gains the [[encumbered]] condition for 1d4 rounds. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the burdening effect.
You're a civil servant, facilitating the day-to-day operations of a governmental agency and leaping systemic hurdles to accomplish your goals. Whether you're a minor dignitary in the Pact Worlds, the Veskarium, or beyond, you operate within institutional boundaries to effect change, navigating the proper channels to find solutions and dealing with opposing bureaucrats who block your way. You're now an adventurer, and the skills you've developed as a bureaucrat continue to serve you well in encounters with organizations across the galaxy.
!! Theme Knowledge (1st)
As a bureaucrat working for a governmental agency, you have become knowledgeable regarding your agency's field. Choose one of the following skills that most closely relates to your governmental agency: [[Culture]], [[Life Science]], [[Mysticism]], [[Physical Science]], or a [[Profession]] skill (other Intelligence-, Wisdom-, or Charisma-based skills might apply at the GM's discretion). Reduce the DC of checks with your chosen skill to [[recall knowledge]] on topics related to your governmental agency and its specific field of expertise by 5. The chosen skill is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to checks with that skill. In addition, you gain a +1 ability adjustment to the chosen skill's key ability score at character creation.
!! Straight to the Source (6th)
You find a common—though not necessarily intentional—thread wherever you go in the wide galaxy: the convoluted inefficiencies of governmental organizations. You have learned to expertly navigate such labyrinthine bureaucracies, bypassing their most common runarounds and pitfalls. Once per day when you [[gather information]] in a settlement or other region with a notable governmental organization, you gain a +2 circumstance bonus to the check and reduce the time taken by half (to a minimum of 1 hour).
!! Expertin the Field (12th)
You leverage your knowledge of your agency's field to enhance your interactions with other professionals. When you spend 10 minutes with a creature that knows about your agency or is related to your agency's field of expertise, you can pepper jargon and insider knowledge into your interaction, such as name- or title-dropping. On your next attempted [[Diplomacy]] check to change such a creature's attitude or Intimidate check to bully such a creature, you gain a +4 circumstance bonus.
!! Friends in High Places (18th)
Throughout your career, you have developed connections with all sorts of governmental agents and agencies, and you can use these ties to further your influence throughout the galaxy. When in a region with either your governmental agency or a different one with a related field of expertise, you can leverage your status to gain an appointment with a minor governmental functionary. You can usually schedule an appointment to take place sometime 1d4 to 2d6 days after you make your request, depending on diplomatic relations, familiarity between the two agencies, your personal reputation in the region, and any particular NPC's attitude toward you (all at the GM's discretion).
In addition, your expertise in your field and experience in dealing with various professionals navigating it have made you famously difficult to outmaneuver in negotiations. After you spend at least 10 minutes interacting with a creature that knows about your agency or is related to your agency's field of expertise, you can attempt a [[Bluff]] check to [[lie]], a [[Diplomacy]] check to [[change attitude]], an [[Intimidate]] check to [[bully]], or a [[Sense Motive]] check to [[detect deception]] against that creature. If you succeed, you regain 1 Resolve Point. This doesn't count as resting to regain Stamina Points. You can use this ability twice per day, but only once per creature.
The target gains the [[burning]] condition.
<<section 'Burning (condition)'>>
Your attacks' cosmic energy shreds the magical forces wielded by spellcasters. As a move action, you sheathe your body in protective energy that attunes to spellcasters you strike. If the next successful melee attack you make before the beginning of your next turn hits a creature capable of casting spells or using spell-like abilities, you gain a +2 enhancement bonus to saving throws against that creature's spells and spell-like abilities for 1 round.
When you are attuned or fully attuned, your weapon gains the [[dispelling]] critical effect. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the dispelling effect. A target affected by the dispelling critical hit effect is the subject of a targeted //[[dispel magic]]//, per the spell, using your solarian level as the caster level.
Indistinguishable from a flamethrower to the lay observer, a burner uses petrol as fuel to produce a strong jet of flame. However, the subtly narrower nozzle and recoil-suppressing gyros allow a burner to fire streams of petrol with more control and focus than its traditional cousin. Ifrit-, salamander-, hellhound-, firedrake-, and phoenix-class burners are all widely available.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|burner, ifrit-class | 3 | 1,300 | 1d10 F | 30 ft. | [[burn]] 1d6 | 40 petrol | 4 | 2 |[[line]], [[unwieldy]] |
|burner, salamander-class | 7 | 6,050 | 2d10 F | 40 ft. | [[burn]] 2d6 | 40 petrol | 4 | 2 |[[line]], [[unwieldy]] |
|burner, hellhound-class | 11 | 23,800 | 3d10 F | 50 ft. | [[burn]] 3d6 | 40 petrol | 4 | 2 |[[line]], [[unwieldy]] |
|burner, firedrake-class | 16 | 158,000 | 6d10 F | 60 ft. | [[burn]] 4d6 | 40 petrol | 4 | 2 |[[line]], [[unwieldy]] |
|burner, phoenix-class | 20 | 795,000 | 10d10 F | 75 ft. | [[burn]] 5d6 | 40 petrol | 4 | 2 |[[line]], [[unwieldy]] |
</div>
You are on fire. As long as you have this condition, at the start of your turn each round before you take any actions (or attempt the Reflex saving throw described below), you take the listed amount of damage as fire damage (or 1d6 fire damage, if no amount is listed in the effect that causes burning). Fire damage from multiple sources that inflict the burning condition is cumulative.
At the end of each round you are burning, you can attempt a Reflex saving throw to remove this condition. The DC of this saving throw is equal to 10 + the amount of fire damage you took this round from the burning condition. If you succeed at this saving throw, you lose the burning condition. You can attempt a new saving throw each round you have this condition, and you receive a +2 bonus for each previous saving throw you've attempted in consecutive rounds.
You can also automatically end this condition by jumping into enough water to douse yourself. If you don't have enough water on hand, you can spend a full action to roll on the ground or otherwise smother the fire to attempt a new saving throw with a +4 bonus (plus any bonuses from previously failed consecutive attempts) to end the condition.
Weapons with the //burning// fusion often take on an appearance that includes numerous flame-like elements. However, if applied to a weapon that already has visual details representing crows or ravens, the fusion adds further raven-like flourishes to the weapon instead. A weapon with the //burning// fusion gains the [[burn]] critical hit effect. The burn damage for the critical hit effect is 1d6 when the fusion is applied to a 4th- or 5th-level weapon, 2d6 when applied to 6th- to 10th-level weapons, 3d6 when applied to 11th- to 15th-level weapons, and 4d6 when applied 16th- to 20th-level weapons. If the weapon already has a critical hit effect, you can apply either the weapon's normal critical hit effect or the burn critical hit effect when you score a critical hit.
<div class="statblock">
* <<levels>>
* ''School'' conjuration ([[creation]], fire)
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' 20-ft.-radius spread
* ''Duration'' 1 round/level
* ''Saving Throw'' see text
* ''Spell Resistance'' no
</div>
You conjure forth a cloud of smoke and burning embers that billows out from the point you designate. The cloud obscures all sight, including [[darkvision]] beyond 5 feet. The area counts as a smoke hazard, except a creature within the cloud has total concealment (50% miss chance, and the attacker can't use sight to locate the target) against their attackers. In addition, the embers within the cloud deal 2d6 points of fire damage to creatures ending their turns within the cloud.
A moderate wind (11+ mph) disperses the cloud in 4 rounds; a strong wind (21+ mph) or stronger disperses the cloud in 1 round. This spell doesn't function underwater or in a vacuum.
Hellknights of the Order of the Chain favor these lengths of blackened, fiery chain, which often incorporate etchings of infernal runes or hellscapes into their complex designs. Burning chains aren't known for their damage so much as their extreme flexibility in confounding an enemy—and, of course, for the visual imagery a burning chain provides when combined with the distinctive Hellknight armor. The order's names for the various models have become the most commonly used, from fiend-class burning chains to malebranche- and archdevil-class burning chains.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|burning chains, fiend-class | 3 | 1,450 | 1d8 F | [[fatigue]] | 2 |[[analog]], [[disarm]], [[fueled]] (capacity 20, usage 1), [[reach]], [[trip]] |
|burning chains, malebranche-class | 9 | 13,900 | 2d8 F | [[fatigue]] | 2 |[[analog]], [[disarm]], [[fueled]] (capacity 20, usage 1), [[reach]], [[trip]] |
|burning chains, archdevil-class | 16 | 178,000 | 5d12 F | [[fatigue]] | 2 |[[analog]], [[disarm]], [[fueled]] (capacity 20, usage 1), [[reach]], [[trip]] |
</div>
A weapon with this special property fires a highly focused beam of energy that can slice through shields with ease. Burrowing weapons are always short range and cannot fire at targets outside the first range increment. When a burrowing weapon's beam hits shields, apply half of its damage to the shields and the other half (rounded down) to the target vessel's Hull Points. If any of the damage applied to the shields depletes those shields, apply the remainder to the ship's Hull Points as normal. If a burrowing weapon deals damage to a ship with a damage threshold, halve that threshold before determining if any damage is dealt.
This armor upgrade became popular for adventurers who needed to traverse the Plane of Earth, which can frequently require excavation. It consists of modifications to the arms that allow you to quickly move dirt and other loose material, granting a burrow speed. Unless otherwise stated, burrowing arms can’t be used to burrow through solid rock or metal. This upgrade can be installed only in heavy or powered armor.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk | Burrow Speed |h
|burrowing arms, mk 1 | 7 | 7,350 | 1 | heavy, powered | 1 | 5 ft. |
|burrowing arms, mk 2 | 11 | 25,000 | 1 | heavy, powered | 1 | 10 ft. |
|burrowing arms, mk 3 | 13 | 51,500 | 1 | heavy, powered | 1 | 15 ft.* |
|* you can burrow through solid rock at a speed of 5 feet |<|<|<|<|<|<|f
</div>
With the //burst// fusion, a weapon's energy damage can form a small explosion that spills onto a second target. The weapon gains the [[arc]] critical hit effect. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the arc effect. The amount of damage dealt to the secondary target is equal to one-third the level of the weapon with the //burst// fusion (minimum 1). Only weapons that deal acid, cold, electricity, fire, or sonic damage can benefit from a //burst// fusion. If your weapon deals more than one type of energy damage, you select one of those types for the arc critical hit effect to apply to secondary targets when the fusion is added.
A weapon with this special property fires blasts of disruptive energy that devastate shields but have difficulty penetrating physical armor. A buster weapon deals the indicated damage to a starship's shields. If the shields in the quadrant are reduced to 0, split any remaining damage between the two adjacent quadrants' shields. If the targeted quadrant's shields and the shields of any adjacent quadrants are reduced to 0, halve any remaining damage before applying it to the starship's Hull Points. During a starship's next engineering phase after being hit by a buster weapon (whether or not its shields were depleted), the DC of [[Engineering]] checks to divert power to the starship's shields increases by 5.
name:heavy buster cannon
range:medium
speed:—
damage:6d8
pcu:15
cost:16
special:[[buster]]
name:buster cannon, light
range:short
speed:—
damage:3d8
pcu:10
cost:9
special:[[buster]]
name:buster cannon, super
range:medium
speed:—
damage:3d8 × 10
pcu:35
cost:35
special:[[buster]]
You can cause even seemingly insignificant actions to ripple throughout a battlefield and cause outsized effects. As a reaction when you or an ally within 60 feet miss an attack that targets AC, you can use a paradox to grant an insight bonus to subsequent attacks against that target’s AC. The bonus starts at +1 and increases by one with each subsequent missed attack against the target’s AC, to a maximum of +5. The bonus ends when the target is hit by an attack that targets AC. A target can be affected by only one instance of this ability at a time.
When activated, this weapon exudes subtle static charges that tightly bind nearby objects to one another, granting them additional resilience from incoming attacks. After you make an attack with this weapon, you: increase the AC bonus you gain from cover by 1, increase the [[hardness]] of objects within 5 feet of you by an amount equal to 1/4 × the weapon's item level, and gain a +1 bonus to your KAC to resist combat maneuvers. These benefits last until you move or until the beginning of your next turn, whichever comes first. Objects that are moved from their space lose this benefit immediately. The effects of multiple buttressing weapon attacks don't stack with each other.
<div class="statblock">
* ''Type'' melee; ''Special'' [[thrown]] (20 ft.)
* ''Damage'' medium; ''Damage Type'' S; ''Critical'' [[bleed]]
* ''Slots'' 1 (upper limb or lower limb)
* ''Cleave (2 PP)'' As a standard action, the mech makes an attack against multiple targets in an area as though the buzzblade had the [[blast]] weapon special property. The length of the cone equals the mech's reach with the buzzblade.
* ''Cost'' 3.5 × level
</div>
This serrated blade whirs as it slashes through enemy lines.
\define by-level(tag)
<div class="by-level">
<$list filter="[tag[$tag$]has[level]each[level]nsort[level]]">
<h3>Level {{!!level}}</h3>
<<list-links "[level{!!level}tag[$tag$]]" class:index>>
</$list>
</div>
\end
Example:
<<by-level 'Gear Boosts'>>
You are skilled at getting inside computer systems and electronic devices. At 1st level, you gain a +1 insight bonus to [[Computers]] and [[Engineering]] skill checks. At 5th level, every 4 levels thereafter, and at 20th level, this bonus increases by 1.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one computer, control panel, datapad, or similar digital device
* ''Duration'' instantaneous; see text
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
//Bypass password// allows the caster to access a computer, control panel, or other similar digital device protected by a password. When you complete the casting of this spell, attempt a caster-level check (1d20 + your caster level) with a +10 bonus against the DC of the computer password. If successful, //bypass password// gives access through three password-protected security measures. //Bypass password// only works on technological or hybrid devices.
A bypass subroutine is a miniaturized single-function computer which takes the form of a ring with four nanite circuit-nodes and can be sized to fit nearly any finger. The compact nanites are attuned to input from the circuit-nodes and can form specific tools much larger than the ring itself as directed by information stored within the circuit-node. Infiltrators utilize these high-tech metal bands to assist in covert missions. Aspis Consortium agents also use these rings to ensure that locks that were opened appear as if they were never tampered with.
When you succeed at a [[Computers]] or [[Engineering]] check to open a lock, you can activate the ring as a reaction. The ring then stores a record of the processes and tools used in opening the lock, and one of the nanite circuit-nodes on the ring takes on a texture or color associated with the area around the lock. As a move action, you can touch the ring to a lock recorded therein and it recreates the conditions needed to change the lock's status (creating any required tool output with nanites), either opening or relocking that lock.
A bypass subroutine can record one lock in each of its circuit-nodes. Any additional recordings must replace one of the four already in the ring.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|bypass subroutine | 11 | 23,000 | — |
</div>
Industrial-strength cabling is typically woven from hundreds of cords of high-durability plastic that are often coated in metal for added strength, usually adamantine or titanium alloy.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|cable line, titanium alloy | 1 | 5/10 ft. | L/10 ft. |
|cable line, adamantine alloy | 2 | 500/10 ft. | L/20 ft. |
</div>
Your studies of the fundamental forces of the galaxy have enabled you to enhance one of your body's systems to benefit from the energy of stored spells. You might have been bestowed this augmentation by an order of technomancers, implanted the augmentation into yourself as part of your research, or witnessed part of your body undergo a technomantic apotheosis that left you with the ability to cast spells. Your cache augmentation takes the form of any cybernetic augmentation or magitech augmentation of your choice with an item level of 1. Each time you gain a level, the item level of your augmentation increases by 1, and you can replace it with a different augmentation with an item level equal to your technomancer level or lower. This augmentation counts toward the total number of augmentations you can have implanted into each of your body's systems as normal.
At 6th level, each time you regain your spells, choose one of the following: attack rolls, [[Computers]] and [[Engineering]] checks, Fortitude saves, or Reflex saves. You gain a +1 enhancement bonus to rolls of your chosen type. This enhancement bonus increases to +2 at 12th level and +3 at 18th level.
At 12th level, each time you regain your spells, choose a second option from the 6th-level list. You gain a +1 enhancement bonus to rolls of this type. This enhancement bonus increases to +2 at 18th level.
At 18th level, each time you regain your spells, choose a third option from the 6th-level list. You gain a +1 enhancement bonus to rolls of this type.
These enhancement bonuses count as part of the effects of your cache augmentation, and if your augmentation is removed or its effects suppressed (such as by the //[[reject augmentation]]// spell) you also lose these bonuses.
This replaces [[spell cache]] and [[cache capacitor]].
You expand your [[spell cache]] into a cache capacitor. As part of regaining your spells each day, you can cast a single spell into your spell cache and have it affect you continuously for 24 hours. The cache capacitor can hold any of the following spells: //[[detect radiation]]//, //[[disguise self]]//, //[[keen senses]]//, or //[[unseen servant]]//. You must know a spell to store it in your cache capacitor. When you cast the spell into your cache capacitor, you expend the spell slot normally and make any decisions required for that spell, but the duration doesn't expire for 24 hours. If the spell in your cache capacitor is dispelled or dismissed, you can spend 5 minutes of uninterrupted concentration to reestablish it, keeping the same decisions you made when you cast it, and gaining whatever duration the spell had remaining. You can't exchange the stored spell for another spell until you again regain your spells.
At 12th level, your cache capacitor gains a second slot that can hold //[[darkvision|Darkvision (spell)]]//, //[[lesser resistant armor]]//, //[[life bubble]]//, or //[[spider climb]]//.
At 18th level, your cache capacitor gains a third slot that can hold //[[arcane sight]]//, //[[flight]]// (spell level 3rd or lower), //[[see invisibility]]//, or //[[tongues]]//.
The first time each round that a crew member gains a circumstance bonus to their starship combat check from the starship's integrated control module, they increase that bonus by 1.
Whenever you cast a spell with a duration of concentration, you can spend 1 Resolve Point to automate the concentration process by transforming the necessary concentration into a program loop that your [[spell cache]] can maintain for you. If the spell has a maximum duration, your spell cache maintains the spell for that maximum duration, during which you can act normally. Otherwise, your spell cache maintains the spell until you interrupt the program loop, which does not require an action. Your spell cache can loop only one spell at a time, and if you use this ability to loop a new spell while your spell cache is already looping a spell, the spell cache immediately stops concentrating on the previous spell.
You must have the spell cache class feature to choose this magic hack.
At 6th level, you can acquire a cache hack, a fundamental shift in the focus of your [[spell cache]] that alters the spells you can cast with the [[cache capacitor]] class feature. Choose one of the cache hacks described below; your cache capacitor can hold the listed spells.
Some of the cache hacks described below allow you to place spells with targets into your cache capacitor. These spells are marked with an asterisk (*). For such spells, you effectively gain the ability to cast the cached spell at will. You don't need to make any decisions required for the spell in advance, but their duration expires normally. Reestablishing one of these spells requires only that you cast the spell again; you don't need to spend 5 minutes reestablishing it. You can have only one instance of each spell active at a time, and casting the spell again causes the previous instance to automatically end, as if its duration had expired. After 24 hours, you lose the ability to cast the spell in your cache capacitor and effects produced by those spells immediately end, as if their duration had expired.
Aside from the change in the spell list and the changes listed above, your cache capacitor otherwise functions as described in the cache capacitor class feature. This alters cache capacitor.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
<div class="statblock">
* ''Type'' disease (inhaled)
* ''Save'' Fortitude DC 16
* ''Track'' [[mental]]
* ''Frequency'' 1/day
* ''Cure'' 2 consecutive saves
</div>
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Target'' one living creature
* ''Duration'' 1 round/level
* ''Saving Throw'' none (harmless)
* ''Spell Resistance'' no
</div>
You transform your outer layer into solid rock, amplifying your offense and defense. You gain a special unarmed strike that deals lethal damage, doesn't count as [[archaic]], and threatens squares. You also add 1-1/2 × your character level to damage dealt with this attack (instead of the normal [[Weapon Specialization]] damage). You also gain [[DR]] 2/—. Finally, you gain a +2 circumstance bonus to your AC against [[bull rush]], [[reposition]], and [[trip|Trip (combat maneuver)]] combat maneuvers.
Kalos of the Brethedan moon of Kalo-Mahoi have developed numerous magical innovations honoring their artistic traditions. They created //calcification rods//, idealistically, to perfectly preserve objects of natural history that might otherwise rot away. Such rods see use well beyond Kalo-Mahoi, whether by scholars of natural history or those with less scrupulous aims. An authentic Kalo-Mahoian //calcification rod// is a rough shaft of coral that glows at the end that touches a chosen target.
As a standard action, you can touch a //calcification rod// to a nonmagical object made of once-living matter, including a corpse. If the object fits into a 10-foot cube, it must succeed at a Fortitude saving throw (DC = 14 + your key ability score modifier) or turn to stone. If a creature holds or wears the target object, that creature can use its own Fortitude save bonus in place of the object's.
Alternatively, you can use the rod as a club (which counts as magic for the purpose of bypassing [[DR]]), or you can attempt to touch a creature with the rod by making an attack against its EAC. If your attack hits a creature that is living or made of once-living matter, the target must succeed at a Fortitude saving throw (at the same DC) or move one step further along the [[Dexterity poison track]]. While under this effect, a creature can attempt a new saving throw at the end of its turn each round, curing the affliction with one successful save. A creature that would reach the dead state is instead affected as if it had failed its saving throw against a //[[flesh to stone]]// spell, except it can attempt a new saving throw once every 24 hours to end the affliction.
Any target that is immune to petrification is immune to this rod's effects.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//calcification rod// | 8 | 9,500 | 2 |
</div>
As a move action, you can predetermine all potential outcomes and variables before attacking a foe with a spell to consistently strike them at their most vulnerable spot, forcing the target to rely on its reflexes to avoid your attack. If you cast a spell that requires a melee attack or ranged touch attack to affect a target before the end of your next turn, you automatically hit your target, but your foe can attempt a Reflex save to negate your spell's effect (calculating your spell's save DC normally).
<div class="statblock">
* ''CR'' 17; ''XP'' 102,400
* CN Large fey
* ''Init'' +5; ''Senses'' [[darkvision]], [[low-light vision]]; ''Perception'' +29
!!! DEFENSE
* ''HP'' 300; ''RP'' 6
* ''EAC'' 30; ''KAC'' 31
* ''Fort'' +17; ''Ref'' +17; ''Will'' +20
* ''Defensive Abilities'' [[void adaptation]]; ''Immunities'' mind-affecting effects, [[paralysis]], poison, polymorph, [[radiation]], sleep, [[stunning]]
!!! OFFENSE
* ''Speed'' 60 ft., fly 120 ft. ([[Su]], perfect)
* ''Melee'' slam +25 (8d6+21 B plus ruined mind)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' ruined mind, sympathetic ruin
* ''Spell-Like Abilities'' (CL 17th; ranged +27)
** 1/week—//[[interplanetary teleport]]//, //[[plane shift]]//, //[[terraform]]// (for 6 RP)
** 1/day—//[[control gravity]]// (DC 26), //[[disintegrate]]// (DC 26)
** 3/day—//[[crush skull]]// (DC 25), //[[feeblemind]]// (DC 25), //[[holographic terrain]]// (DC 25), //[[mystic cure]]// (5th level)
** At will—//[[corrosive haze]]// (DC 24), //[[remove radioactivity]]//
!!! STATISTICS
* ''Str'' +4; ''Dex'' +5; ''Con'' +4; ''Int'' +2; ''Wis'' +8; ''Cha'' +11
* ''Skills'' [[Acrobatics]] +29 (+37 to fly), [[Life Science]] +34, [[Survival]] +34
* ''Languages'' [[truespeech]]''
* Other Abilities'' planetary bond
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Planetary Bond ([[Su]])'' A calecor is bonded to a planet devastated by cataclysm. The creature is dimly aware of everything happening on that world. However, this deluge of information is difficult for it to process. The calecor has a 33% chance to become aware of anything occurring on the planet that might affect the fey, its goals, or the world itself. Once aware of an event, the calecor can take a full action to observe that occurrence as if using //[[clairaudience/clairvoyance]]//, but without any restrictions on range and duration. This ability functions even when the calecor is not on the bonded planet, and the entire planet is considered to be familiar to the calecor.
''Ruined Mind ([[Su]])'' A calecor's traumatized and divided mind makes the fey dangerous to interact with on a mental level. Any creature that touches a calecor (or is touched by one), uses mind-affecting or mind-reading magic on the fey, or attempts to communicate with it telepathically must attempt a DC 24 Will save. On a failure, the creature takes 4d10 damage and becomes [[confused]] for 1 round. The calecor can suppress this ability at will. This is a mind-affecting effect.
''Sympathetic Ruin ([[Su]])'' As a standard action, the calecor can project the mental torment of its ruined mind into the mind of a creature within 250 feet. If the target fails the save against ruined mined, it suffers the effects of that ability.
</div>
When a world suffers a global calamity—a tremendous loss of resident life-forms due to asteroid impact, rapid climate change, war, or other apocalyptic scenario—the ramifications can ripple far beyond that planet. In some cases, as the torrent of souls leaves the planet, bound for Pharasma's Boneyard, some of the life energy from dying fey creatures and nonsentient organisms ripples back to the First World, tearing a hole in the fabric of the Material Plane. The essence of the First World surrounds and contains this blast of anguished energy, waves of planar force wrapping around it like an oyster making a pearl, until the two elements combine and solidify into a new entity, a calecor.
A calecor is the fey embodiment of the planetary disaster that birthed it—nature's violent reaction to the cycle of birth, growth, evolution, and death being catastrophically and irreparably interrupted. Biologists and mystics are unsure why some disasters result in the creation of a calecor while others do not. After all, most planets suffer events that were disastrous for some and beneficial for others, and evolution itself kills off existing species through natural processes, such as when newly evolved trees absorb enough carbon dioxide from an atmosphere to cause global cooling. To date, the best theory is that the dying fey associated with a world's biome have an innate sense of a planet's natural order, a sort of racial memory for the planet as a whole. Therefore, only extinctions that this aggregate fey consciousness deems the work of outside actors trigger enough resentment to coalesce into a calecor.
Calecors not only take forms suiting their planet's primary environments, but also have sphinx-like shapes, with the body of a hunting cat and great wings of overlapping leaves. A calecor's body is formed not of flesh, but rather vines that wrap and twist around pieces of broken stone, such as rubble from a native civilization destroyed by the calamity. Instead of a head, the vines of the creature's neck writhe up and cradle a holographic globe split down the middle into two pieces: a perfect, real-time representation of the calecor's bonded world. A calecor is 10 feet tall and can weigh more than 6 tons.
Always encountered singly, calecors have little culture and might not even be aware of the existence of other calecors. As soon as a calecor emerges into consciousness, its first action is to leave the First World and travel back through the planar breach to the world whose death spawned it. Once there, it does everything in its power to undo the damage and reset the ecosystem to a stable state, magically tearing down the structures of those it deems responsible for the tragedy and terraforming regions too blasted to support life. So deep is the calecor's bond to its planet that it instinctively knows everything happening on or within it, and it is able to see and hear events on the other side of the world just by thinking about it.
Instinctively able to speak any language, a calecor's mind is nevertheless as broken as the globe that forms its head, its mind split between painful visions of the past and the overwhelming desire to heal and nurture. Those who attempt to make psychic contact with the creatures report a devastating, disorienting whirlwind of different thoughts—the death cries of a billion organisms—and such contact can seriously harm those who lack superior mental fortitude.
Although not inherently bellicose, and in fact gentle toward organisms it deems in need of recovery or repopulation, a calecor has no patience for those who would despoil its world or oppose its mission. In such situations, interlopers might be warned off with painful visions of the terrifying apocalypse that led to the calecor's birth. If that tactic doesn't work, a calecor shifts gravity to keep foes off-kilter while it picks them off, breaking minds and disintegrating bodies until the threat is neutralized. Those who can convince the calecor that their goals align, however, might find themselves with the most powerful ally on the planet.
!! Calecore Skull-Globe
When a calecor dies, whether as a result of violence or its world being either repaired to the calecor's satisfaction or devastated beyond hope, the illusory halves of the planet that serve as the creature's head fuse and become a mysterious crystalline globe. A calecor skull-globe retains part of the calecor's magical bond to its planet, making this magic accessible to anyone who touches the globe. The globe shatters if the planet to which it is bonded is destroyed.
{{Calecor Skull-Globe}}
This crystalline globe is bonded to a planet and constantly changes to reflect a real-time image of that world. Touching the globe allows you to use //[[clairaudience/clairvoyance]]// at a location of your choice on that planet, regardless of range and lasting as long as you concentrate. You don't need to have prior knowledge of the location—you just zoom in on the desired point from the global view. Additionally, once per week, the globe allows you to use //[[interplanetary teleport]]// to transport yourself and other willing creatures touching the globe to the location you're currently observing using the globe's //clairaudience/clairvoyance// effect. If you are currently on a different plane, this teleportation shifts you back to the Material Plane, as well. A //calecor skull-globe's// planetary bond can't be changed to a new planet.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//calecor skull-globe// | 17 | 250,000 | 1 |
</div>
Your experimental armor prototype enables faster movement. Your experimental armor's speed adjustment is increased by 5 feet (maximum 0 feet) while you're wearing it. At 8th level, you instead ignore the armor's speed adjustment. You must have an [[experimental armor]] prototype to select this mechanic trick.
<div class="statblock">
* <<levels>>
* ''School'' evocation
* ''Casting Time'' 1 standard action
* ''Range'' long (400 ft. + 40 ft./level)
* ''Area'' cylinder (20-ft. radius, 40 ft. high)
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' none
* ''Spell Resistance'' yes
</div>
You evoke a vertical column of dangerous material from across the universe that rains down upon creatures in the area. This matter is made up of bits of burning stars and chunks of frozen comets, and it deals 4d6 fire damage and 3d6 cold damage to every creature in the area. This damage occurs only once, when the spell is cast. For the spell's remaining duration, the fallen starstuff makes the entire area difficult terrain, and thick, swirling clouds of particulate space matter magically block vision. This obscures all sight beyond 5 feet, including [[darkvision]] and other vision-based senses (including vision-based [[blindsight]] and [[sense through]]), but doesn't prevent [[blindsense]]. A creature within 5 feet of its attacker has concealment (attacks have a 20% miss chance). Creatures farther away have total concealment (50% miss chance, and the attacker can't use sight to locate the target). Additionally, the swirling cosmic particles are distracting to spellcasters in the area, who have a 20% chance of losing any spell they attempt to cast in the area. At the end of the duration, the starstuff disappears, leaving no aftereffects (other than the damage dealt).
A weapon with the //called// fusion can be teleported to its owner's hand as a swift action, even if the weapon is in the possession of another creature. This ability has a maximum range of 100 feet, and effects that block teleportation prevent the return of a //called// weapon. A weapon with the //called// fusion must be in your possession for at least 24 hours for this ability to function.
The mech expends either 1 PP or 3 PP and makes an attack against a single mech. If the attack's damage causes system damage, the operator can choose which component takes system damage, excluding the power core or cockpit; if the mech expended 3 PP, the operator can select any component to take the system damage.
<div class="statblock">
* <<levels>>
* ''School'' enchantment
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Duration'' 10 minutes/level
</div>
Developed by ikeshti brood-minders and congregants who moved beyond the threat of becoming a rivener, this spell is a celebration of the mental fortitude that one needs to resist one’s urges and to shrug off outside influence. You gain a +2 morale bonus to saving throws against all spells and effects with the mind-affecting descriptor. If you would fail a saving throw against a mind-affecting spell or effect while under the effects of //calm the storm//, you can reroll the failed saving throw as a reaction. If you do, //calm the storm// ends.
Your drone has a camera that you can see through using your [[custom rig]] as long as your drone is within range. The camera has ordinary sight, and is capable of seeing whatever an ordinary human could see. The camera can also record up to 1 hour of footage, which can be downloaded and viewed using your custom rig.
This fine webbing is coated with reactive dyes that can be altered through minor electrical charges. It can be slipped over clothing or armor and adjusted to reflect the patterns of the local terrain to provide some camouflage, in a process that takes 10 minutes. When you wear a camouflage membrane, you gain a +2 circumstance bonus to [[Stealth]] checks while in the particular biome to which the membrane has been adjusted. You can take another 10 minutes to change the biome for which the item provides its bonus.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|camouflage membrane | 1 | 100 | L | 20 | 1/day |
</div>
Your nanites can alter their color and appearance, settling on your flesh in a variety of patterns and colors, providing you camouflage in your surroundings. When you attempt a [[Stealth]] check while your [[sheath array]] is active, you can use a move action to increase the insight bonus to your Stealth check by 2 until the end of your turn. You can additionally use a [[nanite surge]] to [[hide]] in plain sight.
This hollow plastic or metal container can hold up to a half gallon of liquid.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|canteen | 1 | 1 | L |
</div>
Who Canu was, if they were a person, is lost to the Gap. //Canu's cache// is a bracer datapad (negligible bulk, changes to fit its user) that functions as a tier 10 computer with a personality specially attuned to you and your preferences. The device has planetary range for controlling peripheral devices. Not only does the bracer never need power, but it can also act as a recharging station for up to three batteries at a time. If you're a technomancer and use Canu's cache as your [[spell cache]], as part of casting a spell, you can activate this artifact three times per day to cast a spell you know of 5th level or lower, even if you lack a spell slot to do so; alternatively, you can activate the artifact in this way once per day to cast a 6th-level spell. For your [[cache capacitor]] class feature, Canu's cache gains two slots each time your normal cache would gain one. Also, this artifact grants you the [[cache concentration]] and [[summon cache]] magic hacks.
Canu's cache can be destroyed only by someone who uses the [[fuse spells]] feature with 2 Resolve Points and two 6th-level spell slots to cast //[[wish]]// to destroy the bracer; the spell slots and Resolve Points used to do so are permanently lost.
Consisting of a single immense starship, a capital fleet boasts heavy armor and utterly devastating weapons. However, these ponderous starships are slow to maneuver, and they struggle to fend off tiny attackers.
<div class="statblock">
* ''Speed'' 4 hexes; ''Maneuverability'' average (+0 [[Piloting]], turn 2)
* ''Strong'' [[destroyer|Destroyer-Class Fleet]]; ''Weak'' [[fighter|Fighter-Class Fleet]]
* ''Range'' 5 hexes
* ''Special Ability Access:'' [[array|Array (fleet ability)]], [[damage threshold]], [[EMP|EMP (fleet ability)]], [[flagship]], [[point defense]], [[self-destruct]], [[superweapon]]
</div>
Your role in combat is about encouraging the crew while taunting enemies into making critical mistakes. A starship can have only one captain, and a character can assume that role only if it is currently vacant. The captain alone can act in any phase of combat.
!! Actions
<<list-links '[tag[Captain Actions]]' class:index>>
As a captain, you can take any of the following actions, depending on your character level, during any phase of combat.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
\define captitle(tiddler)
<$view tiddler='$tiddler$' field='caption'><$view tiddler='$tiddler$' field='title' /></$view>
\end
Example:
<<captitle 'Elementals'>>
The pendant of a //captive-star amulet// is a miniature containment field that holds magical energy compressed to resemble a tiny star. While you wear the amulet, if a spell includes you as a target, the necklace allows you to use the counter option of //[[dispel magic]]// against that spell as a reaction. You must attempt a dispel check (1d20 + half the amulet's item level + your key ability score modifier). A //captive-star amulet// works once per day, but you can spend 1 Resolve Point to activate it a second time during that same day. Once you use a given //captive-star amulet//, you can't use a different one for 24 hours.
Captive star amulets come in three types with varying functions.
!! Red Dwarf
A //red dwarf captive-star amulet// has no other functions.
!! Magnetar
In addition to countering the spell, a //magnetar captive-star amulet// allows you to absorb
a successfully countered spell to recover one of your previously expended spell slots of a level lower than that of the negated spell.
!! Pulsar
A //pulsar captive-star amulet// can function like a //magnetar captive-star amulet//. Alternatively, instead of negating and absorbing the spell, you can redirect the spell. You choose the spell's new targets, area, or other variables, but statistics determined by caster level are still calculated according to its original caster.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//captive-star amulet (red dwarf)// | 9 | 14,500 | L |
|//captive-star amulet (magnetar)// | 13 | 54,000 | L |
|//captive-star amulet (pulsar)// | 17 | 270,000 | L |
</div>
Built to resemble an ancient pre-Gap weapon used to apprehend prisoners of war, a capture pole consists of a polearm with a two-pronged robotic head that snaps shut when its center is pressed against a target during an attack. Designed to lock around a creature's neck, each of a capture pole's prongs are outfitted with armor-piercing syringes used to inject a creature with a substance, typically a sedative to make apprehension easier. This occurs on a successful attack roll for a melee attack or grapple combat maneuver. Capture poles are favored weapons among the drow, who use them to capture slaves and discipline their orc servants.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|capture pole, enforcement-class | 2 | 325 | 1d8 P | [[injection DC +2]] | L |[[grapple]], [[injection]], [[reach]] |
|capture pole, apprehension-class | 7 | 6,600 | 2d8 P | [[injection DC +2]] | L |[[grapple]], [[injection]], [[reach]] |
|capture pole, imprisonment-class | 12 | 36,300 | 6d6 P | [[injection DC +2]] | L |[[grapple]], [[injection]], [[reach]] |
|capture pole, domination-class | 17 | 256,500 | 7d12 P | [[injection DC +2]] | L |[[grapple]], [[injection]], [[reach]] |
|capture pole, overlord-class | 20 | 855,000 | 15d8 P | [[injection DC +2]] | L |[[grapple]], [[injection]], [[reach]] |
</div>
Though these suits of light armor appear to be made of stiff fabric, they are actually woven from carbon fibers. Higher-quality carbon skins are reinforced with carbon allotypes, such as white carbon or diamond, and the heightened sheen of the fabric hints at their expensive construction.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br/>Bonus | KAC<br/>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br/>Slots | Bulk |h
|carbon skin, graphite | 3 | 1,220 | +3 | +4 | +4 | –1 | — | 1 | 1 |
|carbon skin, white carbon | 10 | 19,650 | +12 | +14 | +5 | –1 | — | 3 | 1 |
|carbon skin, diamond | 15 | 126,400 | +17 | +19 | +7 | –1 | — | 4 | 1 |
|carbon skin, nanotube | 20 | 825,000 | +21 | +23 | +8 | –1 | — | 6 | 1 |
</div>
As plantlike creatures, [[khizars]] have different respiratory functions than oxygen-breathing creatures. A complete overhaul of your own respiratory organs enables you to breathe in carbon dioxide and exhale oxygen. (Most atmospheres considered hospitable to life have an abundant supply of both.) In situations of slow suffocation, you reduce the number of effective creatures consuming oxygen by two, unless no oxygen-breathing creatures are present.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|carbonic respiration graft | 1 | 150 | lungs |
</div>
This implant plugs directly into your heart and can be triggered to overclock the performance of your heart and circulatory system. When you run, charge, or take a move action to move, you can spend 1 Resolve Point to increase your speed (in the relevant mode of movement) by 20 feet for that action. This extra movement is treated as an enhancement bonus.
Alternatively, you can spend 1 Resolve Point as a reaction when you attempt a Reflex saving throw to gain a +1 enhancement bonus to your roll.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|cardiac accelerator | 6 | 3,850 | heart |
</div>
You are a career member of a military and have been embroiled in conflicts and military bureaucracy for many years. During your enlisted time, you have trained with top ground troops, participated in war games that have turned deadly, and been privy to military intelligence given only to commanders. You are prepared for almost anything on the battlefield that your own commanders or your enemies able to throw at you.
!! Theme Knowledge (1st)
You are adept at telling fact from fiction when it comes to determining enemy movements and assessing rumors. Reduce the DC of any [[Culture]] or [[Diplomacy]] check to [[gather|Gather Information]] or [[recall knowledge]] about enemy troop sizes and tactics by 5. [[Piloting]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to Piloting checks. In addition, you gain an ability adjustment of +1 to Constitution at character creation.
!! Adaptive Kit (6th)
You know the importance of being prepared for various environmental conditions. If you study reports and information about an area for at least 10 minutes (or if you spend at least 1 hour in that area learning the lay of the land), you can adapt your equipment. In a process that takes an additional 10 minutes, you can modify your armor to gain the benefits of one set of environmental clothing that is appropriate to the area's climate. In addition, any suit of armor you adapt reduces its armor check penalty by 1 for 24 hours. Only you can wear this adapted armor, and you can adapt your armor only once per week.
!! Indefatigable (12th)
You are trained to push yourself to your limits and are extremely hard to put down. Once per day as a move action, you can regain a number of Stamina Points equal to your level plus your Constitution modifier.
!! Determined Upkeep (18th)
Due to your many brushes with death, you know that your success in battle is directly related to the quality of your equipment. You always strive to keep your weapons cleaned, your armor polished, and your other gear functioning at maximum capacity. Up to twice per day, you can spend 10 minutes examining and maintaining your equipment to regain 1 Resolve Point; this doesn't count as resting to regain Stamina Points.
''Prerequisite:'' The mech must have a [[cargo hold|Cargo Hold (auxiliary system)]] auxiliary system. The mech's cargo hold conceals subtle boosters that can launch its contents at high velocity.
''Dispatch Hot (3 PP)'' As a standard action, the mech can transfer one operator into a vehicle it has stored in its cargo hold, after which the mech launches the stored vehicle at high speed; the vehicle exits the mech using the [[race]] action. The pilot of the launched vehicle, if any, doesn't need to succeed at a [[Piloting]] check as part of the race action this turn.
<div class="statblock">
* ''CR'' 4; ''XP'' 1,200
* N Medium aberration
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +10
!!! DEFENSE
* ''HP'' 46
* ''EAC'' 16; ''KAC'' 17
* ''Fort'' +7; ''Ref'' +5; ''Will'' +5
* ''Defensive Abilities'' molecular mimicry; ''DR'' 5/—
* ''Weaknesses'' [[vulnerable]] to acid
!!! OFFENSE
* ''Speed'' 15 ft., climb 20 ft.
* ''Melee'' tentacle +10 (1d4+5 B)
* ''Space'' 5 ft.; ''Reach'' 5 ft. (10 ft. with tentacle)
!!! STATISTICS
* ''Str'' +1; ''Dex'' +3; ''Con'' +5; ''Int'' –3; ''Wis'' +1; ''Cha'' +0
* ''Skills'' [[Athletics]] +10 (+18 when climbing), [[Disguise]] +15 (+19 when imitating an appropriate material), [[Stealth]] +15 (+19 when in an appropriate environment), [[Survival]] +15
* ''Languages'' Common (can't speak any language)
* ''Other Abilities'' [[compression]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or pod (3–5)
!!! SPECIAL ABILITIES
''Molecular Mimicry ([[Ex]])'' As a standard action, a cargo creep can alter its physical composition to match a material within reach of its tentacle. When it does so, it gains a specific benefit and a vulnerability to a specific energy type based on the material. In addition, the cargo creep gains a +4 circumstance bonus to [[Disguise]] and [[Stealth]] checks when attempting to imitate or hide among that material, such as disguising itself as a metal plate in metallic form or hiding among plants in vegetation form. A cargo creep can match one of the following materials and can revert back to its default flesh state as a move action. The above cargo creep begins in its flesh state.
@@.special
* //Flesh:// When a cargo creep touches the flesh, fur, scales, or other skin covering of a creature, it gains a +2 circumstance bonus to Reflex saving throws and a [[vulnerability]] to acid.
* //Metallic:// When a cargo creep touches worked metal, it gains [[DR]] 5/adamantine and a [[vulnerability]] to electricity.
* //Mineral:// When a cargo creep touches natural, non-worked minerals such as stones and gems, it gains a +1 circumstance bonus to KAC and a [[vulnerability]] to sonic.
* //Synthetic:// When a cargo creep touches material like fibers, plastics, and polymers, it gains a +1 circumstance bonus to EAC and a [[vulnerability]] to cold.
* //Vegetation:// When a cargo creep touches natural plant matter (including that of plant creatures) or worked wood, it gains a +2 circumstance bonus to Fortitude saving throws and a [[vulnerability]] to fire.
@@
</div>
The exact origin of cargo creeps is a mystery, though those who have seen them understand they are nuisances to crews of transport ships, especially those carrying the types of perishable goods that cargo creeps find delicious. A cargo creep vaguely resembles a cephalopod, with four large eyes and five tentacles that it uses for locomotion. The unusual cells in its skin allow a cargo creep to mimic any sort of material with uncanny accuracy, almost down to its molecular structure. This allows a cargo creep to hide almost anywhere and easily slip into cargo holds in search for food. A cargo creep is generally quick to hide or flee at the first sign of danger, except when cornered, at which point it strikes out at anything that gets too close.
<div class="statblock">
* ''Level'' 8; ''Price'' 9,500
* ''EAC Bonus'' +6; ''KAC Bonus'' +16
* ''Max Dex Bonus'' +2; ''Armor Check Penalty'' –4; ''Speed'' 20 ft.
* ''Strength'' 24 (+7); ''Damage'' 3d10 B
* ''Weapon Slots'' 0; ''Upgrade Slots'' 2
* ''Capacity'' 40; ''Usage'' 1/hour
* ''Size'' Large (5-ft. reach); ''Bulk'' 38
</div>
Similar in appearance to a [[cargo lifter]], a cargo hauler consists of sturdy legs or treads supporting a basic metal frame. Large gripping appendages allow the user to lift and transport large crates and other bulky pieces of cargo. A cargo hauler isn't designed to use weapons and takes a –2 penalty to all attack rolls. It can carry 10 bulk more than normal for its Strength score without becoming [[encumbered]] or [[overburdened]].
Unconverted expansion bays count as cargo holds. A cargo hold can contain approximately 25 tons of goods, with no item being larger than Large. A starship with multiple cargo holds can hold larger objects; usually 4 contiguous cargo holds are required to hold Huge objects and 8 for Gargantuan objects. These size restrictions can be overridden at the GM's discretion.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|cargo hold | 0 | 0 |
</div>
''Prerequisite:'' The mech must have a transporter frame.
The mech's body houses a small garage capable of storing a single creature, vehicle, or other object no larger than two size categories smaller than the mech. An operator can move from a stored vehicle to the mech's cockpit as a move action, and vice versa. A mech can have no more than two cargo hold systems.
<div class="statblock">
* ''Level'' 4; ''Price'' 2,150
* ''EAC Bonus'' 0; ''KAC Bonus'' +7
* ''Max Dex Bonus'' 0; ''Armor Check Penalty'' –10; ''Speed'' 15 ft.
* ''Strength'' 20 (+5); ''Damage'' 1d10 B
* ''Weapon Slots'' 0; ''Upgrade Slots'' 0
* ''Capacity'' 40; ''Usage'' 1/min
* ''Size'' Large; ''Bulk'' 34
</div>
A cargo lifter consists of a simple metal frame atop slow-moving legs or treads. Rather than having articulated hands, its arms end in specialized gripping tools meant to lift bulky containers. A cargo lifter can't use weapons and takes a –4 penalty to all attack rolls. It can carry 10 bulk more than normal for its Strength score without becoming [[encumbered]] or [[overburdened]].
Your drone is outfitted with cargo space. The drone's Strength score counts as 4 higher for the purpose of how determining much bulk it can carry, but all of this extra bulk must be stored gear and cargo, not mounted weapons, armor mods, or the like. This does not affect the drone's actual Strength score in any way, merely how much it can carry. Due to its size, a drone might still be unable to carry awkward or unwieldy items.
<div class="statblock">
* ''Level'' 1; ''Price'' 5,000
* Huge land vehicle (10 ft. wide, 20 ft. long, 10 ft. high)
* ''Speed'' 10 ft., full 450 ft., 50 mph (hover)
* ''EAC'' 13; ''KAC'' 16; ''Cover'' improved cover
* ''HP'' 40 (20); ''Hardness'' 6
* ''Attack (Collision)'' 6d4 B (DC 10)
* ''Modifiers'' –1 [[Piloting]], –2 attack (–4 attack at full speed)
* ''Systems'' hover trailer, planetary comm unit
* ''Passengers'' 4
!!! SPECIAL ABILITIES
''Hover Trailer ([[Ex]])'' Every Company rig has a hover trailer stowed in a specialized compartment between the floorboards and the hover jets. One person can take 10 minutes to unpack this trailer, attach it to the back of the vehicle, and extend it up to 80 feet. A hover trailer can carry up to 50 tons, but any cargo must be carefully secured, as the trailer has no roof or walls and provides no cover. When a Company rig has a hover trailer attached, double the vehicle's [[Piloting]] and attack modifiers.
</div>
EJ Corp manufactures these vehicles for freighter crews to transport cargo to and from their ships. The cab seats four and is decorated with the EJ Corp logo and slogan: "Take it to the EJ!"
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Duration'' 1 minute/level
</div>
Your mouth expands to twice its normal size,and fills with rows of razor-sharp teeth, giving you a bite attack. This attack is treated as an attack with a basic melee weapon with the [[operative]] special quality for purposes of proficiency and [[Weapon Specialization]] and for other abilities that function with basic melee operative weapons. You can make this attack without using any limbs and when [[pinned]].
The attack deals 1d4 piercing damage. At 7th level, the damage increases to 2d4. At 10th level, it increases to 2d8. At 14th level, it increases to 3d8. At 16th level, it increases to 4d8. At 18th level, it increases to 5d8. At 20th level, it increases to 10d8.
<div class="statblock">
* ''CR'' 11; ''XP'' 12,800
* N Medium ooze (earth, extraplanar)
* ''Init'' –1; ''Senses'' [[blindsense]] (vibration) 60 ft., [[sightless]]; ''Perception'' +20
* ''Aura'' infrasonic hum (60 ft., DC 18)
!!! DEFENSE
* ''HP'' 180
* ''EAC'' 25; ''KAC'' 25
* ''Fort'' +15; ''Ref'' +8; ''Will'' +11
* ''Immunities'' cold, electricity, [[ooze immunities]], [[radiation]]; ''Resistances'' fire 15
* ''Weaknesses'' [[vulnerability]] to bludgeoning and sonic
!!! OFFENSE
* ''Speed'' 20 ft., climb 20 ft.
* ''Melee'' slam +23 (4d6+17 S plus [[grab]]; critical [[bleed]] 2d6)
!!! STATISTICS
* ''Str'' +6; ''Dex'' –1; ''Con'' +7; ''Int'' —; ''Wis'' +0; ''Cha'' –5
* ''Other Abilities'' [[mindless]], [[no breath]]
!!! ECOLOGY
* ''Environment'' any (Plane of Earth)
* ''Organization'' solitary, pair, or cluster (3–5)
!!! SPECIAL ABILITIES
''Crystallize ([[Su]])'' A creature made of flesh that ends its turn [[grappled]] by a carnivorous crystal must succeed at a DC 18 Fortitude save or become [[staggered]]. If a creature already staggered from this ability fails this save, it becomes [[paralyzed]]. A creature staggered or paralyzed by this ability but not grabbed by a carnivorous crystal recovers completely at the end of its next turn. A creature that remains grabbed while paralyzed by this ability must attempt a third saving throw; on a failure, it becomes an amalgam of crystal and flesh, unconscious but alive. A creature in this crystallized state must succeed at a DC 18 Fortitude saving throw each day or die. If receiving successful long-term care, the creature gains a +4 bonus to this saving throw and needs to attempt it only once every 3 days. The crystallization
is cured after two successful saving throws. //[[Remove affliction]]// allows a creature to automatically succeed at the saving throw, but an affected creature can benefit from this spell only once every 24 hours. //[[Flesh to stone]]// reverses this effect immediately.
''Infrasonic Hum ([[Su]])'' A carnivorous crystal emits infrasonic vibrations that act like static for any sense that relies on vibration, rendering it useless, although carnivorous crystals are immune to this effect. In addition, any creature that can hear must succeed at a DC 18 Fortitude saving throw within the aura or become [[dazed]] for 1 round. A creature that successfully saves or becomes dazed by the aura can't be dazed by any carnivorous crystal's infrasonic hum for 24 hours.
</div>
Rare natives of the Elemental Plane of Earth, carnivorous crystals feed on minerals and metals, transforming them into crystalline substances. They can alter flesh in a similar way and then consume it, but carnivorous crystals are predators only in the sense that an amoeba is, as these creatures are both mindless and indiscriminate about their prey. They reproduce through fission, but only very slowly and in areas with ample food.
Amoral technomancers capture carnivorous crystals and implant them with magitech that stimulates the creatures' aggression. The agitated oozes are confined to breakaway containers, which allow them to be dropped safely into enemy territory. The augmented oozes then kill any fleshy creatures in the vicinity. This magitech burns out in a few days, so the creatures can either be recovered for further use or left in their new homes. This practice means carnivorous crystals can be found in unexpected places, such as abandoned space stations, derelict freighters, and planetoid mines.
You make the most of your downtime by spending it out on the town or holed up, reveling in whatever hedonistic experiences or substances you favor. This helps you shed the stress of an adventuring lifestyle—or prepares you for it.
''Activity:'' Spend a number of credits equal to 100 × your character level while in a settlement, or else consume an equivalent value of intoxicants while aboard a starship. At the end of the day, attempt a Fortitude saving throw (DC = 10 + half your character level). You take a cumulative –2 penalty to this saving throw for each time you've used the carouse activity in the past 7 days.
''Results:'' On a success, you begin the following day with an extra Resolve Point that is lost at the end of that day (double this number of Resolve Points if your character level is at least 10th level). If you fail the Fortitude saving throw by 5 or more, you're drained by the experience instead and lose 1 Resolve Point; you can't regain this Resolve Point in any way until after the following day.
This drone boasts numerous features for partygoers on the move. Its reinforced compartment can carry up to 10 Bulk of items (which increase its own bulk by the same amount). In addition, it sports several customizable features including lighting (increasing the light level by 1 step in a 10-foot radius) and a music player with speakers. When you purchase the drone, you receive a control module for your comm unit, with which you can adjust temperature settings, control movement, and customize features.A carousing drone has 2 bulk.
The carousing drone has two modes, mobile and stationary. While mobile, the drone has a land speed of 15 feet. In stationary form, it can serve as a table or provide seating for up to 2 Medium creatures. If you use the [[carouse]] downtime activity with a carousing drone, you gain a +2 bonus to the Fortitude check required by that activity.
<div class="statblock">
* ''Size'' Gargantuan
* ''Maneuverability'' poor (–1 [[Piloting]], turn 3)
* ''HP'' 240 (increment 30); ''DT'' 10; ''CT'' 48
* ''Mounts'' forward arc (1 capital), port arc (3 heavy), starboard arc (3 heavy), turret (2 light)
* ''Expansion Bays'' 10 (must have at least 1 hangar bay)
* ''Minimum Crew'' 75; ''Maximum Crew'' 200
* ''Cost'' 120
<div class="statblock">
* ''CR'' 4; ''XP'' 1,200
* NE Medium undead
* ''Init'' +1; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +10
!!! DEFENSE
* ''HP'' 48
* ''EAC'' 16; ''KAC'' 18
* ''Fort'' +6; ''Ref'' +6; ''Will'' +5
* ''Immunities'' [[undead immunities]]
* ''Weaknesses'' [[vulnerable]] to critical hits
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' bite +12 (1d6+9 P)
!!! STATISTICS
* ''Str'' +5; ''Dex'' +1; ''Con'' —; ''Int'' —; ''Wis'' +3; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +10, [[Athletics]] +10, [[Stealth]] +15
* ''Other Abilities'' grotesque adaptation, [[mindless]], [[no breath]], [[unliving]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or abattoir (2–10)
!!! SPECIAL ABILITIES
''Grotesque Adaptation ([[Ex]])'' A carrion dreg gains additional abilities based on the body parts it has scavenged. Roll 1d6 and consult the table below to add one of these abilities randomly, or pick one.
<div class="table-wrapper">
| d6 |Ability |h
| 1 |//Grasping Arms:// The carrion dreg gains a climb speed of 20 feet. |
| 2 |@@.constrained //Leathery Wings:// The carrion dreg gains an extraordinary fly speed of 20 feet with clumsy maneuverability.@@ |
| 3 |//Rotting Fins:// The carrion dreg gains a swim speed of 30 feet. |
| 4 |//Rough Hide:// The carrion dreg gains a +1 bonus to its KAC. |
| 5 |@@.constrained //Sharp Fangs:// The carrion dreg's bite attack deals an additional amount of damage equal to half the dreg's Strength modifier.@@ |
| 6 |//Solid Thews:// The carrion dreg gains 10% additional Hit Points. |
</div>
</div>
In places suffused with necromantic energy, such as the necrograft facilities of Eox, parts of discarded corpses sometimes spontaneously come together to form the undead creatures known as carrion dregs, horrifying amalgamations of severed heads, arms, and legs arranged haphazardly around central cores of rotting flesh and sinew. These undead creatures are savage predators, instinctually driven to gather more lifeless forms to add limbs and heads to their own bodies.
No two carrion dregs look the same, and their attributes vary based on the limbs they have scavenged, making the vicious creatures highly unpredictable and even more dangerous. When hunting, multiple carrion dregs act in concert with one another to kill their prey, but they quickly turn to fight among themselves over the remains.
!! Carrion Dreg Template Graft
Carrion dregs are like undead vermin, hunting for limbs to add to their growing forms.
* ''Required Creature Type:'' undead
* ''Required Array:'' combatant
* ''Traits:''
** [[vulnerable]] to critical hits
** grotesque adaptation (see above)
** [[mindless]]
** [[no breath]]
* ''Suggested Ability Score Modifiers:'' Strength, Wisdom, Dexterity
<div class="statblock">
* ''Type'' disease (injury)
* ''Save'' Fortitude DC 13
* ''Track'' [[physical|Physical Disease Track]]
* ''Frequency'' 1/day
* ''Effect'' When an infected creature reaches the comatose state, 1d10+10 Diminutive [[ksarik]] seedlings burrow out of its flesh and wriggle away. This ends the disease and deals 1 piercing damage for each ksarik seedling.
* ''Cure'' 2 consecutive saves
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* NE Medium aberration
* ''Init'' +5; ''Senses'' [[darkvision]] (60 ft.); ''Perception'' +18
!!! DEFENSE
* ''HP'' 90
* ''EAC'' 18; ''KAC'' 20
* ''Fort'' +8; ''Ref'' +10; ''Will'' +6
* ''Defensive Abilities'' reflexive rash, [[unflankable]]; ''Resistances'' acid 10
!!! OFFENSE
* ''Speed'' 40 ft., burrow 10 ft.
* ''Melee'' tentacles +16 (1d8+8 B plus inflame)
* ''Offensive Abilities'' ambush, inflame
!!! STATISTICS
* ''Str'' +2; ''Dex'' +5; ''Con'' +3; ''Int'' –4; ''Wis'' +0; ''Cha'' –1
* ''Skills'' [[Acrobatics]] +13, [[Stealth]] +18, [[Survival]] +13
* ''Languages'' Aklo (can't speak)
!!! ECOLOGY
* ''Environment'' any land
* ''Organization'' solitary, pair, or plague (3–15)
!!! SPECIAL ABILITIES
''Ambush ([[Ex]])'' A carrion wheel can adeptly ambush its prey while concealed. A carrion wheel that can act during a surprise round can take its full round of actions. It gains a +2 bonus to any attacks it makes during a surprise round.
''Inflame ([[Su]])'' Toxic enzymes on the carrion wheel's tentacles cause targets' skin to erupt in painful rashes and excruciating, acid-filled boils. A creature hit by a carrion wheel's tentacle attack is [[sickened]] for 1 round and develops boils (Fortitude DC 14 negates both effects). The next time the creature takes bludgeoning, piercing, or slashing damage, the boils explode violently, dealing 2d8 acid damage to the target (no save) and 2d8 acid damage to each creature within 5 feet of the target (Reflex DC 14 for half). If not ruptured, the boils fade naturally after 10 minutes, and they can be removed magically with //[[lesser remove condition]]//. This ability is a disease effect.
''Reflexive Rash ([[Su]])'' A creature that briefly touches a carrion wheel (such as with an unarmed attack or most combat maneuvers) is exposed to the carrion wheel's inflame ability (Reflex DC 14 negates). Actions that involve longer contact, such as [[grapple|Grapple (combat maneuver)]] combat maneuvers, automatically expose the creature to the nflame ability with no Reflex save.
</div>
<<section 'Ichor Wheel'>>
Carrion wheels are furiously writhing masses of tentacles, most often seen rolling in ravenous packs across Aucturn's deserts. These bizarre creatures resemble tumbleweeds at a distance, but their fleshy, pulsating bodies covered in beady black eyes become more apparent up close. They move across land on tentacles that they also use to capture prey— even the slightest touch inflicts a supernatural swelling as carrion wheels can begin digesting their victims even before transferring the flesh into their toothy maws.
Carrion wheels earn their names for their unusual locomotion: rather than walking on their tentacles, which leaves them vulnerable to faster predators, they wind their tentacles into a wheel shape and roll across the terrain. Their meandering paths leave angry sores on Aucturn's landscape, but traveling over rough terrain often tears them up, covering carrion wheels in blood and scars that hardly seem to bother the creatures. During Aucturn's storms, carrion wheels roll with the winds, often gathering into groups of a hundred or more that barrel across the land. Where they find prey, they unravel and feast before embarking once more. For this reason, smaller settlements on Aucturn often include angled berms or concave walls that deflect incoming carrion wheels.
When not on the move, carrion wheels bury themselves so that only their tentacles remain aboveground, resembling desert brush. Unless starving (or if the winds blow just right), the creatures survive as ambush predators, snatching any suitable meals that approach within striking range of their hiding spots. Although fairly unintelligent, carrion wheels can capably mimic a variety of flora by posing, flattening, and wafting their tentacles.
Thanks to the creatures' hostility (and Aucturn's inhospitable conditions), studying carrion wheels poses a challenge. The greatest mystery pertains to their reproduction, as they've never been observed mating. In a few confirmed cases, injured carrion wheels have split apart and survived as separate organisms, yet on Aucturn this method seems an anomaly rather than the norm. Instead, the creatures somehow seed the landscape to trigger mass birthing events on Aucturn in which hundreds of fluid-filled pustules appear on the landscape overnight. Over the course of three days, these blisters balloon from apple-sized welts to throbbing, cow-sized cysts. On the fourth day, they burst in foul geysers, and each release an adolescent carrion wheel that swiftly whirls away in search of prey. In addition to releasing young aberrations, these ruptured boils leave behind strange tunnel networks, suggesting the carrion wheels might even originate belowground and only emerge above at a later life stage. However, the few attempts to explore these fetid tunnels have ended in tragedy. Instead, most explorers are content to listen at the tunnel entrances, from which messages in Aklo and unidentifiable languages periodically waft. These bizarre phenomena don't hold for carrion wheels on other planets, where the creatures seem to reproduce only by fission.
Carrion wheels prove most dangerous after they travel through the black, psychotropic ichor that runs through Aucturn's throbbing veins. Rarely, one of the creatures develops a taste for the substance, after feeding on the ichor directly from the planet or feeding on an [[orocoran]] fat on the fluid. The ichor makes carrion wheels especially powerful, cunning, and aggressive. These so-called "ichor wheels" forgo burrowing for a more mobile lifestyle. As they feast, ichor wheels seem to enjoy collecting souvenirs (sometimes valuable treasures, but more often leftover bones and viscera) that they adhere to their bodies in a macabre expression of individuality. What they can't carry, they arrange into artfully gruesome monuments.
Carrion wheels are native to Aucturn, but are occasionally found on other worlds. Rare specimens crop up on a variety of planets, thriving in colder, drier environments. It remains unclear how the creatures spread, though the leading theory proposes that biological matter from Aucturn can spontaneously develop into carrion wheels if visiting starships fail to properly sterilize. Any number of factors could contribute to their spread, which drives researchers to subdue and collect rogue carrion wheels across the galaxy in search of answers.
name:carrion-missile launcher, heavy
range:long
speed:10
damage:6d10
pcu:15
cost:15
special:[[limited fire]] 5, [[volatile]]
name:carrion-missile launcher, light
range:long
speed:12
damage:3d8
pcu:10
cost:5
special:[[limited fire]] 5, [[volatile]]
name:carrion-missile launcher, mega
range:long
speed:8
damage:3d8 × 10
pcu:15
cost:25
special:[[limited fire]] 5, [[volatile]]
Carrying capacity is based on the bulk of items, which accounts for both their weight and their unwieldiness.
!! Item Bulk
Each item in this chapter has a representation of its bulk, which is a number, the letter "L" if it has light bulk, or a dash ("—") if it has negligible bulk. For example, a gyrojet rifle has 2 bulk, a tactical knife has light bulk, and a //ring of sustenance// has negligible bulk.
Every 10 items that have light bulk count as 1 bulk, and fractions don't count—so 10 items with light bulk have a total of 1 bulk, and 19 such items also have a total of 1 bulk. Items that have negligible bulk count toward your bulk limit only if the GM determines that you are carrying an unreasonable number of them. Add together the numerical bulk values of all items you are wearing and carrying to determine the total amount of bulk you are carrying.
!! Bulk Limits
You can carry an amount of bulk up to half your Strength score without difficulty. If you carry more than that, you gain the [[encumbered]] condition, as described below, until the amount of bulk you carry becomes less than or equal to half your Strength score. You can't voluntarily wear or hold an amount of bulk that is greater than your Strength score. If you are forced to do so (due to changing gravity, for example), you gain the [[overburdened]] condition, as described below, until the bulk you carry becomes less than or equal to your Strength score.
If you are wearing armor, use the worse penalty (from armor or bulk) for speed adjustments and skill checks. The penalties do not stack.
<<section 'Encumbered' 'h3' >>
<<section 'Overburdened' 'h3' >>
!! Estimating Bulk
As a general rule, an item that weighs around 5 to 10 pounds is 1 bulk (and every multiple of 10 is an additional bulk), an item weighing a few ounces is negligible, and anything in between is light. An awkward or unwieldy item might have a higher bulk.
This flanged rod allows you to control gravitational forces around a single object within 100 feet. When you activate the baton, you can move an object of no more than 25 pounds or 2 bulk up to 20 feet per round in any direction (including up or down), but you can't move it farther than 100 feet from you. If you attempt to move an object that another creature is holding, that creature can attempt a DC 15 Reflex save to prevent you from removing the object from its grasp.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|carter's baton | 14 | 65,000 | L | 80 | 8/round |
</div>
These practical boots have integrated sensors that, when activated, track your footsteps and use that data to create a crude, three-dimensional map of where you move while using your land speed. This data is automatically uploaded to a designated comm unit within 30 feet. Periodically reviewing this map provides you a +1 circumstance bonus to checks to find hidden doors, passages, and other concealed architecture in the traversed area, as well as a +2 circumstance bonus to [[Survival]] checks to avoid getting lost.
Variants of these boots exist for other movement types, such as wing-mounted sensors for flight or a lightweight tail harness for swim speeds.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|cartographer boots | 4 | 2,100 | L | 40 | 4/hour |
</div>
You embody a single change in the balance of a system's entropy that cascades into additional, progressively greater changes.
!! Aspect Insight
You gain [[Improved Combat Maneuver]] (sunder) as a bonus feat and also a +2 insight bonus to [[Acrobatics]] checks.
!! Aspect Embodiment
Once per combat, when you hit multiple creatures in a single round with an attack or attacks (or effects that require an attack roll), you can gain 1 Entropy Point without taking any additional action.
!! Aspect Catalyst
Each foe within 10 feet must succeed at a Reflex save or gain the [[blinded]] condition for 1d4 rounds.
''Improved:'' Each foe within 30 feet must succeed at a Reflex saving throw or gain the [[blinded]] condition for 1d4 rounds.
!! Aspect Finale
When you damage a target with your [[entropic strike]], as a reaction you can spend 1 Entropy Point to either apply a –2 penalty to that target's AC, saving throws, or attack rolls (your choice), or halve the value of all [[DR]] and [[energy resistance]] the target has. These penalties do not stack, but you can apply different penalties to a single target with multiple hits. The effect lasts until you apply one of these effects to a new target or until the end of your next turn. If you successfully damage a target that has one of these penalties, the penalty's duration is extended until the end of your next turn.
The vast majority of spells require at least a standard action to cast, and sometimes more. Spells that take more than a round to cast require a full action each round until they are complete.
!! Casting While Threatened
Casting a spell takes a significant amount of concentration, forcing you to lower your defenses briefly. When you cast a spell, it gives targets threatening you in melee a chance to make an [[attack of opportunity]] against you, unless the spell specifies otherwise—normally only the case for a few spells with a range of touch. If this attack of opportunity hits and damages you, you fail to cast the spell and lose the spell slot.
Cathode cannons were originally designed by members of the Android Abolitionist Front, and many varieties made by different races nonetheless are decorated with circuit designs reminiscent of the weapons' android inventors. The tactical cathode cannon is a standard-issue weapon for members of the Front, while advanced, elite, paragon, and shockstorm cathode cannons are often used by mercenaries and assault forces with a variety of goals.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|cathode cannon, tactical | 4 | 2,040 | 1d10 E | 40 ft. | — | 40 charges | 4 | 2 |[[unwieldy]], [[wide line]] |
|cathode cannon, advanced | 8 | 9,300 | 2d12 E | 60 ft. | — | 40 charges | 4 | 2 |[[unwieldy]], [[wide line]] |
|cathode cannon, elite | 12 | 35,300 | 3d12 E | 60 ft. | — | 40 charges | 4 | 2 |[[unwieldy]], [[wide line]] |
|cathode cannon, paragon | 15 | 109,000 | 6d12 E | 100 ft. | — | 40 charges | 4 | 2 |[[unwieldy]], [[wide line]] |
|cathode cannon, shockstorm | 18 | 647,000 | 7d12 E | 120 ft. | — | 80 charges | 4 | 2 |[[unwieldy]], [[wide line]] |
</div>
When you score a critical hit with a weapon from the [[disintegrator]] category, you increase
its [[corrode]] critical hit effect damage by 1d6. If it does not have a corrode critical hit effect, the weapon gains corrode 1d6 as a critical hit effect, which functions even if the weapon already has another critical hit effect.
<div class="statblock">
* <<levels>>
* ''School'' evocation (acid)
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' one creature or object
* ''Duration'' 1 round + 1 round/3 levels
* ''Saving Throw'' none
* ''Spell Resistance'' yes
</div>
You fling magical nanites that convert water vapor around your target into deadly acid. Make a ranged attack roll against your target's EAC. If you hit, the target takes 4d4 acid damage and it takes 5 additional acid damage at the end of its turn each round for the spell's duration.
<div class="statblock">
* <<levels>>
* ''School'' evocation (acid)
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Effect'' fissure of variable dimensions (S)
* ''Duration'' 1 round/level
* ''Saving Throw'' Reflex partial, see text
* ''Spell Resistance'' no
</div>
You tear a thin fissure in reality, releasing a blaze of caustic energy. The fissure must be oriented on a horizontal surface that can fit its length, which depends on the level of the spell; the fissure runs through the center of the affected squares. The height of the blaze of caustic energy released from the fissure and the damage it deals to creatures who pass through it or end their turn in one of the fissure’s squares (no save) also depend on the level of the spell.
If you evoke the fissure so that it appears where creatures are, each creature takes damage as if passing through the blaze and must immediately attempt a Reflex saving throw. On a failure, the creature falls [[prone]].
''1st:'' When you cast //caustic fissure// as a 1st-level spell, the fissure is 10 feet long. The blaze of caustic energy rises to a height of 10 feet above the fissure and deals 2d4 acid damage.
''2nd:'' When you cast //caustic fissure// as a 2nd-level spell, the fissure is 20 feet long. The blaze of caustic energy rises to a height of 10 feet above the fissure and deals 4d4 acid damage.
''3rd:'' When you cast //caustic fissure// as a 3rd-level spell, the fissure is 30 feet long. The blaze of caustic energy rises to a height of 20 feet above the fissure and deals 6d4 acid damage.
''4th:'' When you cast //caustic fissure// as a 4th-level spell, the fissure is 40 feet long. The blaze of caustic energy rises to a height of 25 feet above the fissure and deals 6d6 acid damage.
''5th:'' When you cast //caustic fissure// as a 5th-level spell, the fissure is 60 feet long. The blaze of caustic energy rises to a height of 30 feet above the fissure and deals 8d6 acid damage.
''6th:'' When you cast //caustic fissure// as a 6th-level spell, the fissure is 80 feet long. The blaze of caustic energy rises to a height of 40 feet above the fissure and deals 10d6 acid damage.
Much of the design of this pistol-like weapon is based off the biological systems of the [[disintegration lash]], though a caustoject's more traditional appearance is in stark contrast to its techno-organic inspiration. Caustojects create an injectable field that transforms ordinary matter into an acidic compound, disintegrating their targets from the inside. Syringes can be loaded into these weapons, allowing other materials to be quickly injected instead of an acidic discharge (in which case only the injection effect occurs—no acid damage is dealt).
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|caustoject, liquidator | 1 | 225 | 1d4 A | 30 ft. | [[injection DC +2]] | 20 charges | 2 | L |[[injection]] |
|caustoject, decimator | 6 | 4,000 | 1d8 A | 30 ft. | [[injection DC +2]] | 20 charges | 2 | L |[[injection]] |
|caustoject, executioner | 12 | 32,900 | 4d4 A | 30 ft. | [[injection DC +2]] | 20 charges | 2 | L |[[injection]] |
|caustoject, eradicator | 18 | 242,300 | 6d8 A | 30 ft. | [[injection DC +2]] | 20 charges | 2 | L |[[injection]] |
</div>
Drawing upon the same design and inspirations as the [[caustoject]], this larger weapon is designed to resemble an assault rifle rather than a pistol. As with its smaller cousin, a caustolance uses its battery to generate an acidic field to inject directly into its targets, but it can also handle and discharge other substances that are poured into a special tank that is attached to the weapon's barrel.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|caustolance, liquidator | 1 | 400 | 1d6 A | 60 ft. | [[injection DC +2]] | 20 charges | 1 | 1 |[[injection]] |
|caustolance, decimator | 6 | 4,500 | 2d6 A | 60 ft. | [[injection DC +2]] | 20 charges | 1 | 1 |[[injection]] |
|caustolance, executioner | 12 | 38,000 | 5d6 A | 60 ft. | [[injection DC +2]] | 20 charges | 1 | 1 |[[injection]] |
|caustolance, eradicator | 18 | 400,000 | 12d6 A | 60 ft. | [[injection DC +2]] | 20 charges | 1 | 1 |[[injection]] |
</div>
Choose a skill you have selected with the [[skill expertise]] class feature. When you take 20 with this skill, you can roll your [[expertise]] die twice and take the better result. You can choose this talent up to three times, choosing a different skill selected with the skill expertise class feature each time.
A series of prongs takes the place of this pistol's barrel; firing the weapon causes a small sphere of energy to form at their center and launch forward at speed. If the wielder times the shot perfectly, the plasma sphere pulses just as it hits the target, dealing damage to nearby creatures, but most find the feat difficult to replicate consistently. A vapor cavitation pistol creates a very focused sphere, while the inertial cavitation pistol creates one that implodes on impact. Hydrodynamic and thermodynamic cavitation pistols use more complex reactions that carry significantly more destructive power.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|cavitation pistol, vapor | 3 | 1,430 | 1d6 E & F | 20 ft. | [[pulse]] 1d4 | 20 charges | 4 | L |[[unwieldy]] |
|cavitation pistol, inertial | 8 | 9,700 | 2d6 E & F | 20 ft. | [[pulse]] 1d6 | 40 charges | 5 | L |[[unwieldy]] |
|cavitation pistol, hydrodynamic | 14 | 9,700 | 2d12 E & F | 40 ft. | [[pulse]] 2d6 | 40 charges | 8 | L |[[unwieldy]] |
|cavitation pistol, thermodynamic | 18 | 584,000 | 3d12 E & F | 20 ft. | [[pulse]] 3d6 | 80 charges | 10 | L |[[unwieldy]] |
</div>
<div class="statblock">
* <<levels>>
* ''School'' evocation (sonic)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one creature
* ''Duration'' instantaneous
* ''Saving Throw'' Will negates (harmless) and Reflex half (see text)
* ''Spell Resistance'' no
</div>
You cause a rapid change of pressure in liquid to form vapor-filled cavities, causing damaging localized shock waves.
The target is surrounded by a series of quickly forming and dissipating rings that rotate around it. These rings are harmless to the target, but each creature adjacent to the target (in any direction, including diagonally and above or below) must attempt a Reflex saving throw or take 4d10 sonic damage. A successful save halves this damage.
This spell can be cast on a target that isn't entirely submerged in water, but adjacent creatures that aren't at least partially submerged are unaffected by the spell.
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* N Large magical beast (aquatic)
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +13
!!! DEFENSE
* ''HP'' 90
* ''EAC'' 18; ''KAC'' 20
* ''Fort'' +10; ''Ref'' +10; ''Will'' +5
!!! OFFENSE
* ''Speed'' 40 ft., swim 30 ft.
* ''Melee'' bite +14 (3d4+13 P)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' feeding appendages
!!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' +3; ''Int'' –4; ''Wis'' –1; ''Cha'' –1
* ''Skills'' [[Acrobatics]] +13, [[Athletics]] +13 (+21 when swimming), [[Stealth]] +18
* ''Other Abilities'' amphibious
!!! ECOLOGY
* ''Environment'' any swamp
* ''Organization'' solitary or pair
!!! SPECIAL ABILITIES
''Feeding Appendages ([[Ex]])'' Instead of a lower jaw, a caypin has a mass of writhing eyestalks that grant the creature sight and also chew its food with tiny, lamprey-like mouths. As a move action, a caypin can detach these appendages (or reattach any adjacent appendages), which are capable of ambulating on their own and transmitting visual data back to the caypin. An appendage that moves farther than 100 feet from the caypin's body immediately dies.<br/><br/>
While caypin appendages are harmless individually, they become more formidable in groups. A caypin has enough appendages to form up to two such groups at once. While detached, the appendages share a single set of actions with the caypin and act on the caypin's initiative count. Each group of appendages has the aquatic subtype and is [[amphibious]] as per the universal creature rule; [[darkvision]] to a range of 60 feet and [[low-light vision]]; 18 Hit Points; and a base speed of 20 feet and a swim speed of 15 feet. A group of appendages takes up 5 feet of space and has a 5-foot reach. When applicable, a group of appendages uses the caypin's Armor Class, saving throw bonuses, skill check bonuses, and other qualities.<br/><br/>
As a standard action, a group of appendages can enter an adjacent creature's square without provoking an attack of opportunity from that creature. When in another creature's square, the appendages can attack that creature as a swift action (using the caypin's bite attack bonus and damage). Multiple groups of caypin feeding appendages cannot share a space with the same creature at once. Other than this ability to swarm an opponent, a group of appendages cannot attack. If all of a caypin's appendages are detached, the creature can see only what its detached appendages see. <br/><br/>
If all of a caypin's appendages are destroyed but the caypin still lives, the creature has the [[blinded]] condition for 3 days, after which it grows new appendages that function as normal.
</div>
Caypins are some of the most insidious creatures to inhabit the galaxy's marshes. Although they are hulking beasts, their physiques somewhere between those of wolves and crocodiles, they're best known for the strange, detachable tentacles that contain both their eyes and their mouths. These eyestalks are able to wriggle like eels both on land and in water, and they can travel up to 100 feet from their "host," allowing the caypin to both hunt and keep eyes on its territory—literally—while still lurking safely out of sight, often underwater. While the tentacles are capable of transmitting information back to their caypin via poorly understood psychic phenomena, the tentacles are relatively weak on their own and generally return to their host or gather together in groups before engaging with prey or intruders. In marshy areas where caypins are known to hunt, only the foolish wade into water without first checking to make sure that no fat, vermian tentacles with tiny mouths lurk nearby.
Caypins live on multiple planets throughout the galaxy and are most plentiful on worlds that support extensive swamps or marshes full of meaty prey. Contrary to most people's assumptions, caypins are not naturally evil—their limited intellects are incapable of truly understanding moral questions at all—but they are apex predators singularly driven by an insatiable hunger for huge amounts of raw meat. Caypins tend to eat half of their body weight in meat every few days, chewing away at the corpses of prey with their dozens of tiny mouths, and more than a few planets have seen native populations of slow-moving mammals, flightless birds, or languid amphibians go extinct due to caypins' voracious hunting patterns. Likely for this reason, caypins typically live and hunt alone, although occasionally a mated pair shares a single swamp that both use as a killing field. Caypins typically live several hundred years or longer. However, caypins that cannot regularly feed fall into torpor, sometimes sleeping for years at a time in the muck of a river bottom before awakening with a driving hunger.
Caypin biology is as fascinating as it is terrifying, as scholars from both universities and private industry have all so far failed to identify the mechanism by which its detachable appendages communicate with the main body. The wolf-shaped body of a caypin has no eyes or mouth of its own—rather, it sees and eats only via the contributions of dozens of thick, stalk-like appendages that hang from a jawlike protrusion on the front of their skulls. Each appendage bears a bloodshot eyeball looming over a tiny mouth with multiple rows of razor-sharp teeth. While their stalks are attached to their jaws, caypins feed normally, with the tiny mouth-tentacles passing along nutrients through a receptive socket in the jaw. Yet these tentacles can also detach and hunt independently, swarming over unwitting creatures, stripping the victims of meat, and carrying the masticated nourishment back to the caypin's body. Once reattached, these appendages inject the meat into the feeding sockets to be digested as normal. Caypins can drink without the aid of their feeding appendages, ingesting water directly through the tentacles' attachment sockets. Lacking digestive organs of their own, these tentacles are reliant on the main body to refresh the nutrients in their blood. Whether this strange system is the result of two symbiotic creatures having evolved to rely on each other or a single creature evolving a curious trait remains anyone's guess. While many biologists believe the caypin's control of its tentacles is the result of some unknown (and so far untraceable) form of psychic magic, others posit that the caypin's nervous system relies on quantum entanglement, thus removing any need for physical connection. Either way, many corporations would love to uncover the secret of the caypin's instantaneous, untraceable communication.
Occasionally, a caypin's stalks are destroyed during a difficult hunt. In these cases, the caypin is blind and cannot eat for 3 days while its appendages regrow. A caypin that has lost its feeding appendages typically hides and avoids interacting with other living beings, but if startled or cornered, it may go into a frenzy, attacking anything near it, though its blindness makes it a much less formidable opponent than it would be normally.
Most xenobiologists consider caypins an invasive species that likely originated somewhere in the Veskarium, given the reptilian people's admiration for the beasts. Some powerful vesk have managed to train caypins and keep them as pets, and have been known to intentionally import them to worlds they conquer. However, given caypins' prevalence on planets that have had no known contact with the vesk, it's likely that caypins or variations thereof evolved along parallel routes on several worlds. Caypins' superficial biology supports this theory—caypins on different worlds often have somewhat divergent physiologies, and caypins with dramatically different abilities likely await discovery.
A typical caypin is 14 feet long and weighs 1,500 pounds.
<div class="statblock">
* ''Level'' 12; ''Price'' 38,500
* ''EAC Bonus'' +16; ''KAC Bonus'' +20
* ''Max Dex Bonus'' +5; ''Armor Check Penalty'' –2; ''Speed'' 50 ft.
* ''Strength'' 22 (+6); ''Damage'' 2d6 B
* ''Weapon Slots'' 2; ''Upgrade Slots'' 2
* ''Capacity'' 40; ''Usage'' 1/hour
* ''Size'' Medium; ''Bulk'' 4
</div>
Unlike most other suits of powered armor, which are cumbersome and slow, this armor was designed for magically amplified responsiveness and speed. The armor resembles a humanoid frame of narrow rods, providing you with superior visibility and maneuverability while worn. Instead of heavy plating to absorb blows, //celerity rigging// uses sophisticated planes of magical force to deflect attacks. [[Incorporeal]] creatures' attacks target your KAC rather than your EAC when you are wearing this armor.
<div class="statblock">
* ''Tier'' 15
* LG Medium starship magical beast
* ''Speed'' 10; ''Maneuverability'' good (turn 1)
* ''AC'' 29; ''TL'' 26
* ''HP'' 400; ''DT'' —; ''CT'' 80
* ''Shields'' 375 (forward 175, port 100, starboard 100, aft —)
* ''Attack (Forward)'' gore (2d6 × 10; 1 hex), horn cannons (5d8; 5 hexes)
* ''Attack (Port)'' flanking scattershot (5d8; 10 hexes)
''Attack (Starboard)'' flanking scattershot (5d8; 10 hexes)
* ''Other Abilities'' gore, [[living starship]], speed burst, [[void adaptation]]
!!! CREW ACTIONS
* ''Engineer (1 action)'' [[Engineering]] +26 (15 ranks)
* ''Gunner (3 actions)'' gunnery +22 (15th level)
* ''Pilot (1 action)'' [[Piloting]] +32 (15 ranks)
* ''Science Officer (1 action)''
* ''Computers'' +26 (15 ranks)
!!! ECOLOGY
* ''Environment'' any vacuum
* ''Organization'' solitary
!!! SPECIAL ABILITIES
* ''Gore ([[Ex]])'' The celestaur bull’s gore attack has the [[ramming]] property. If the celestaur succeeds at a Ramming Speed pilot action and hits its target, the celestaur has impaled its target; for as long as the celestaur bull remains adjacent to its impaled target, the bull’s horn cannons ignore the impaled target’s shields.
''Speed Burst ([[Ex]])'' Once every 1d4 rounds, a celestaur can increase its speed by 4 for 1 round during the [[Engineering]] phase.
</div>
Celestaurs are a species of magical beasts the size of small starships, with a temperament that usually ranges from friendly curiosity to outright playfulness. They wander the cosmic wilds in vast herds, feeding on solar flares and cosmic phenomena such as schools of [[paraforans]] and [[time eater]] ganglions. Sometimes, bulls are taken from the herd and reared by [[barachius]] angels to hunt endbringer devils and other evil outsiders large enough to threaten starships.
With their penchant for technology, barachius angels have taken to shearing off the horns of bull celestaurs
and replacing them with starship-scale cannons—in extreme cases, these weapons are so large they double the bull’s natural length. Additional weapons—used to harry foes while the celestaur bull turns around for another charge through space—are affixed to the creature’s flanks by a comfortable but sturdy titanium harness that also generates powerful shields. Once mature, these armed celestaurs are usually released into the wild to seek out and destroy evil, though some angels train them as starfaring mounts or teach them to pull enormous chariots through the void.
When trained in this way, celestaur bulls are single-minded in their aggression against demons, devils, and other evil outsiders. They tend to ignore other space travelers unless provoked. Celestaurs are only slightly smarter than a clever animal, and they can be easily outwitted without an angel to shepherd them.
When its weapons become damaged, a celestaur bull returns to the site where it was raised, seeking repairs from the barachius angels who reared it. Often, these angels have moved on, and it is left to the inhabitants of a local space station or passing freighter to befriend the cosmic beast, providing the necessary repairs while gaining the loyalty of an intimidating guardian.
As a move action, you channel the Positive Energy Plane’s power directly into your solar armor or solar shield, helping you capture and redirect your escaping life energy to bolster your body. As a reaction when you take damage that causes you to lose at least 2 Hit Points, you gain temporary Hit Points equal to half the number of Hit Points you lost from the attack or effect. These temporary Hit Points last 3 rounds.
If you’re attuned or fully attuned, you also gain [[spell resistance]] equal to 11 + your solarian level against necromancy spells, and against spells with the cold, darkness, or death descriptors.
You use a starship's computer to analyze gravity-well data and determine the nature of one or more celestial bodies.
''Activity:'' You spend the day as a starship's science officer, analyzing pinpointed gravity wells to identify the type of astronomical objects at their core. The number of gravity wells you can analyze in one day depends on the number of nodes the starship's computer has: 1 gravity well with a basic computer or mononode, 2 with a duonode, and so on. At the end of the day, attempt a separate DC 30 [[Computers]] or [[Physical Science]] check for each astronomical object you attempt to identify. You gain a +1 bonus to such checks if your starship has a general [[science lab]] or a +2 bonus if it has a physical science lab. You also can apply the bonus normally granted by your starship's computer. You can't take 20 on this check.
''Result:'' On each success, you determine whether the gravity well is caused by a gas giant, a terrestrial world, a large asteroid, or an irregular world (including those science fantasy constructions that stretch the concept of a world, per the GM's discretion). If your result exceeds the DC by 5 or more, you also learn the number of large satellites (such as moons) the astronomical object has, if any.
The rotation of a pulsar is perfectly precise, rivaling that of an atomic clock. You can sense this cosmological clock and time your movements to it, acting with uncanny timing and perfect precision. You gain a +2 bonus to your Armor Class against attacks of opportunity.
You also possess a supernaturally accurate sense of time—you're always aware of the exact date and time wherever (and whenever) you are, accurate to the millisecond, and can precisely measure time as it passes without the need for a clock or other device.
As the scions of angels and other celestial beings, [[aasimars]] can shed an almost holy light. With thousands of photon-producing cells embedded under your dermal layer (or similar system), you can also glow brightly. As a standard action, you can cause light within 20 feet of you to increase two steps (up to bright) and light for 10 more feet beyond that to increase one step (up to normal). This lasts for 1 minute, but you can dismiss it as a swift action. Magical darkness can decrease the light level in this area only if it's from an item or creature of a level or CR higher than your level. You can use this ability once per day, plus a number of additional times equal to half your level.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|celestial radiance graft | 4 | 1,800 | skin |
</div>
This long, thin scarf is usually marked with an alternating pattern of light and dark shapes. While wearing a celestial stole, you gain cold [[resistance]] 5 or fire [[resistance]] 5 (your choice
when you first don the stole); you can alter the type of energy resistance (choosing between cold and fire) once per day after 8 hours of rest. If you have cold or fire resistance from the solarian's solar armor solar manifestation, increase that resistance by 5.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//celestial stole// | 5 | 3,000 | — |
</div>
Celestial creatures are natives of one of the good-aligned Outer Planes.
* ''Alignment:'' alignment changes to good
* ''Traits:''
** [[DR]]/evil with a value equal to creature's CR – 10 (minimum DR 1/evil)
** if the creature already has DR of that value or greater, it instead gains [[resistance]] to electricity with a value equal to creature's CR – 5 (minimum electricity resistance 1)
** when the creature isn't on its home plane, it gains the extraplanar subtype
This fusion causes the target's cells to overheat and rapidly degenerate. The weapon gains the [[degeneration]] critical hit effect, dealing d6 equal to the weapon's level divided by 5 (round down). You can activate or deactivate the //cellular degenerating// fusion as a swift action. If the weapon already has a critical effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the degeneration effect. This fusion can never cause a weapon that normally targets KAC to target EAC.
Cephalumes are native to the Near Space planet Luminar, a gas giant with a thick outer atmosphere of hydrogen and helium and a dense, high-pressure ocean of liquid methane with a frozen icy floor. Cephalumes predominantly live in the middle strata of these methane seas, a lightless expanse with no discernible ground or sky. Cephalumes have cephalopod-like bodies with a prominent head and a large single foot. Their skin is naturally bioluminescent, and cephalumes flicker this light to communicate in Lumos, a visual language comprised of sequential, carefully timed blinks. As a result, most cephalume clothing and armor incorporate transparent force fields to allow light to shine through.
Cephalumes form symbiotic unions with small bioelectric arthropods known as krikiks. These symbiotes can communicate with their hosts in a tactile variant of Lumos that uses soft electrical pulses. Krikiks have significantly longer life spans than cephalumes do, and they are sometimes gifted from cephalume to cephalume as heirlooms. Cephalumes can bond with multiple krikiks as they age, though such a distinction is reserved for respected cephalumes of high station.
Cephalume culture is subtle and traditional, valuing community, curiosity, and exploration. Cephalumes engage in a unique form of ancestor worship, and the buildings in their settlements are actually the calcified remains of their dead, often the only solid structures to be found in the aquatic void they live in. Many cephalumes continue to regard these edifices as the people they once were, and even hold conversations with them to talk out their problems in times of stress.
Like most other civilizations, cephalumes achieved spaceflight at some point during the Gap and now embark on celestial walkabouts across the galaxy. They strive to learn about the technologies and cultures of other civilizations before they return to Luminar, adding their discoveries to the collective knowledge of their people. Cephalume starships, like their buildings, are made from the remains of their dead. Cephalumes consider it to be a great honor to explore the universe with one of your ancestors serving as your vessel.
!! Racial Traits
* ''Ability Adjustments:'' +2 Str, +2 Wis, –2 Con
* ''Hit Points:'' 4
* ''Size and Type:'' Cephalumes are Medium aberrations with the plantlike subtype.
* ''Beguiling Glow:'' As a standard action (as long as their bioluminescence isn't suppressed), a cephalume can create flickering patterns in the light emanating from their skin. Each sighted creature within 20 feet must succeed at a Will saving throw or be [[fascinated]] for as long as the cephalume continues this presentation (a standard action each round). Creature that understand Lumos are unaffected. This is a sense-dependent effect. The DC of the saving throw is equal to 10 + half the cephalume's character level + the cephalume's Wisdom modifier. A cephalume can't use this ability again until they have taken a 10-minute rest to recover Stamina Points.
* ''Bioluminescence:'' A cephalume increases the light level by one step out to a radius of 20 feet. A cephalume can suppress or reactivate this light as a move action, and they receive a +4 racial bonus to [[Stealth]] checks when their light is suppressed. A cephalume also uses this light to communicate with others.
* ''Cephalume Movement:'' Cephalumes have a land speed of 10 feet and a swim speed of 30 feet.
* ''Cold Resistance:'' Cephalumes have [[resistance]] 5 to cold.
* ''Darkvision:'' Cephalumes have [[darkvision]] with a range of 60 feet.
* ''Depth Inured:'' A cephalume is immune to the dangers of extreme depths.
* ''Plantlike:'' A cephalume gains the benefits of the [[plantlike]] ability.
* ''Symbiote Adaption:'' Cephalumes form symbiotic unions with krikiks, a living biological augmentation unique to their race. Most cephalumes have one of the following krikik symbiotes.
** //Airjet Krikik:// An air bladder in the krikik increases the cephalume's land and swim speeds by 10 feet. Once per day as a swift action, the cephalume can double their movement speed for that round.
** //Electrostatic Krikik:// The krikik is covered in thin, electrically charged spines that allow the cephalume to cause any weapon they wield to deal half its damage as electricity damage, becoming lethal and non-[[archaic]] if it is not already. If the weapon already deals two damage types, this effect replaces one with electricity. In addition, this allows the cephalume to grant any weapon they wield the [[stagger]] critical hit effect. If the weapon has any other critical hit effects, the cephalume chooses only one to apply on a critical hit.
** //Sharprock Krikik:// The krikik's hard crust grants the cephalume a +1 racial bonus to AC.
** //Siltsight Krikik:// The krikik has heat-sensitive eyes that allow the cephalume to double the range of their [[darkvision]] and to see through non-magical fog, mist, and clouds without penalty, ignoring any cover or concealment bonuses from those effects.
** //Tentacle Krikik:// The krikik has a prehensile tentacle that increases the cephalume's natural [[reach]] by 5 feet.
!! Beguiling Glow Graft
{{Beguiling Glow}}
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* N Huge animal
* ''Init'' +0; ''Senses'' [[low-light vision]]; ''Perception'' +16
!!! DEFENSE
* ''HP'' 125
* ''EAC'' 20; ''KAC'' 22
* ''Fort'' +13; ''Ref'' +10; ''Will'' +8
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' gore +18 (2d6+14 P; critical [[knockdown]])
* ''Space'' 15 ft.; ''Reach'' 15 ft.
* ''Offensive Abilities'' [[trample]] (2d6+14 B, DC 16)
!!! STATISTICS
* ''Str'' +6; ''Dex'' +0; ''Con'' +3; ''Int'' –4; ''Wis'' +1; ''Cha'' –2
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or herd (3–8)
</div>
A secure implant in your brain stores a copy of your memories and personality, which updates every day at the end of a full night’s rest. This implant can’t be hacked. If, at the end of a full night’s rest, you have any Intelligence, Wisdom, or Charisma damage; points permanently drained from your Intelligence, Wisdom, or Charisma; or any ongoing insanity effects, you can choose to restore your mind to the previous day’s backup (this doesn’t take an action). This heals that damage, restores all permanently drained points, and ends the insanity effect. Once used, you can’t benefit from the cerebral backup’s effects for 1 week.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|cerebral backup | 18 | 375,000 | brain |
</div>
A cerebral countermeasure is a tiny gland that constantly monitors your brainwaves, watching for unexpected spikes in activity that indicate mental assault. As a reaction before you attempt a saving throw against a mind-affecting effect, you can cause the gland to release proteins that deflect and confuse mental attacks by overloading the chemical receptors that would otherwise respond to the mental attack. This grants you a +2 circumstance bonus to your Will saving throws against mind-affecting effects until the end of your next turn. The disruption this defense causes makes it difficult to concentrate, giving you a –2 penalty to Intelligence-, Wisdom-, and Charisma-based skill checks until the end of your next turn.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|cerebral countermeasure | 6 | 4,200 | brain |
</div>
<div class="statblock">
* ''Tier'' 18
* CN Huge starship ooze
* ''Speed'' 4; ''Maneuverability'' perfect (turn 0)
* ''AC'' 30; ''TL'' 27
* ''HP'' 640; ''DT'' 5; ''CT'' 128
* ''Shields'' 400 (forward 100, port 100, starboard 100, aft 100)
* ''Attack (Forward)'' globules (7d8; 10 hexes), tethers (2d10×10; 10 hexes)
* ''Attack (Port)'' globules (7d8; 10 hexes)
* ''Attack (Starboard)'' globules (7d8; 10 hexes)
* ''Attack (Turret)'' globules (7d8; 10 hexes), tethers (2d10×10; 10 hexes)
* ''Other Abilities'' [[biological redundancy]], intelligence drain, living starship, [[void adaptation]]
!!! CREW ACTIONS
* ''Engineer (1 action)'' [[Engineering]] +31 (18 ranks)
* ''Gunner (5 actions)'' gunnery +26 (18th level)
* ''Pilot (1 action)'' [[Piloting]] +28 (18 ranks)
* ''Science Officer (1 action)'' [[Computers]] +36 (18 ranks)
!!! ECOLOGY
* ''Environment'' any vacuum
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Intelligence Drain ([[Su]])'' Once per combat, instead of taking actions during the engineering phase, a cerebrex can force up to five creatures on a starship within 7 hexes of it to each attempt a DC 25 Will saving throw, taking 2 Intelligence damage on a failure. The cerebrex regains 50 Hull Points for every creature that fails this check. This is a mind-affecting effect.
''Living Starship ([[Ex]])'' A cerebrex is a spacefaring ooze so immense it functions as a starship (and thus engages only in starship combat). It has no crew, but it can still take engineer, gunner, pilot, and science officer actions using the bonuses, level, and ranks
listed above. Modifiers for its size, speed, and maneuverability are already factored into its
statistics. Use the following table to determine the effects when a cerebrex takes critical damage.
<div class="table-wrapper">
| d% | System |Effect |h
| 1–30 | weapons array |@@.constrained Randomly determine one arc containing weapons; condition applies to all gunner actions using weapons in that arc. @@ |
| 31–60 | propulsion |@@.constrained Condition applies to all pilot actions.@@ |
| 61–90 | pseudopods |@@.constrained Condition applies to all engineer actions, except when patching or repairing the pseudopods.@@ |
| 91–100 | nucleus† |@@.constrained During the next round, each of the cerebrex's attempted actions has a 25% chance of failure.@@ |
|† A cerebrex's nucleus doesn't gain critical damage conditions. |<|<|f
</div>
</div>
From afar, a cerebrex looks like a distant constellation of stars connected by glowing, fiery tethers—but this immense ooze is no stationary star system. Rather, cerebrexes are sentient, space-dwelling oozes that are relatively intelligent. These gargantuan creatures travel the galaxy in search of clusters of sapient life to feast upon. But sapience is more than just a tantalizing beacon for a cerebrex; this ooze has evolved the strange ability to metabolize both the physical matter of its food and a fragment of its prey's sapience.
After feasting on entire civilizations, a cerebrex briefly takes on an almost-humanoid intelligence—just long enough to plan its next attack and map the way to the next-closest cluster of civilized life. This spark of intelligence is fleeting, though, and as the ooze digests its meal completely, the inherited intelligence also fades. By the time the cerebrex makes it to the next planet, it has only a vague idea of why it traveled there, but its ability to sense intelligence from thousands of miles away means its next spark of sapience is never too far off.
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* N Medium plant
* ''Init'' +0; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +8
* ''Aura'' unsettling appearance (60 ft., DC 14)
!!! DEFENSE
* ''HP'' 26
* ''EAC'' 13; ''KAC'' 14
* ''Fort'' +4; ''Ref'' +2; ''Will'' +6
* ''Defensive Abilities'' [[fast healing]] 2, otherworldly mind (DC 14); ''Immunities'' [[plant immunities]]; ''Resistances'' cold 5
* ''Weaknesses'' [[vulnerable]] to sonic
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' bite +7 (1d4+4 P) or tendril +7 (1d4+4 S plus [[grab]]; critical [[stun]])
* ''Space'' 5 ft.; ''Reach'' 5 ft. (15 ft. with tendrils)
* ''Offensive Abilities'' star shriek (DC 14)
* ''Spell-Like Abilities'' (CL 3rd)
** 3/day—//[[fear]]// (1st level, DC 16), //[[lesser confusion]]// (DC 16)
** At will—//[[daze]]// (DC 15), //[[detect thoughts]]// (DC 16)
!!! STATISTICS
* ''Str'' +1; ''Dex'' +0; ''Con'' +2; ''Int'' +1; ''Wis'' +4; ''Cha'' +1
* ''Skills'' [[Bluff]] +13, [[Diplomacy]] +13, [[Stealth]] +8
* ''Languages'' [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or colony (3–12)
!!! SPECIAL ABILITIES
''Otherworldly Mind ([[Ex]])'' Any non-plant creature attempting to read a cerebric fungus's mind with a [[divination]] spell or similar effect must succeed at the listed Will save or be overwhelmed by its alien thoughts. A creature that fails takes 1d6 damage and is confused for 1d3 rounds, and the divination effect immediately ends.
''Star Shriek ([[Ex]])'' Once per day as a full action, a cerebric fungus can unleash a shrill scream in tones that are difficult for minds to process. Each non-plant creature within 30 feet must succeed at the listed Will save or be [[nauseated]] for 1 round. This is a sonic, mind-affecting effect.
''Unsettling Appearance ([[Su]])'' A cerebric fungus constantly scans the minds of those around it, projecting around itself a confusing collage of images gleaned from their thoughts. Each creature within 60 feet that can see the fungus must succeed at the listed Will save or be [[off-target]] while within the aura's radius. A creature that succeeds at a save against a cerebric fungus's unsettling appearance is immune to this effect for 24 hours. This is a mind-affecting effect.
</div>
<<section 'Cerebric Fungus Voyager'>>
Cerebric fungi are carnivorous plants, but they are also intelligent interstellar explorers with colonies in many star systems, including the Pact Worlds, where they have carved out homes in corners of Castrovel and the Liavaran moon Nchak. Within the colonies of their isolated home system in the Vast, cerebric fungi debate philosophy and mysticism to perfect their shared understanding of the universe and to outshine the intellectual insights of the other colonies.
In an effort to prove esoteric points on behalf of their home colonies—or to spite other colonies—cerebric fungi enjoy studying creatures less intelligent than themselves. The fungi have been pleased to find suitable subjects on other planets.
Cerebric fungi greet strangers they meet with telepathic questions that might seem inane or even senseless. The fungi have difficulty comprehending the needs and concerns of non-fungoid creatures and easily distress others with experiments meant not to harm but rather to test pet theories.
With millennia of starflight and space exploration informing their culture, cerebric fungi can offer information that other civilizations would otherwise have little chance of learning. However, it often takes much time, patience, and psychic fortitude for other creatures to interpret a cerebric fungus's insights, as elements other creatures might consider necessary context, the fungus considers obvious or irrelevant.
The typical cerebric fungus is approximately 4 feet in diameter and weighs 150 pounds.
<<section 'Fungal Computers'>>
<div class="statblock">
* ''CR'' 9; ''XP'' 6,400
* Cerebric fungus mystic
* N Medium plant
* ''Init'' +0; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +22
* ''Aura'' unsettling appearance (60 ft., DC 18)
!!! DEFENSE
* ''HP'' 115
* ''EAC'' 21; ''KAC'' 22
* ''Fort'' +10; ''Ref'' +8; ''Will'' +12
* ''Defensive Abilities'' [[fast healing]] 5, otherworldly mind (DC 18); ''Immunities'' [[plant immunities]], [[walk the void|Star Shaman]]; ''Resistances'' cold 5
* ''Weaknesses'' [[vulnerable]] to sonic
!!! OFFENSE
* ''Speed'' 30 ft. (fly 20 ft. Su, average] in space), [[starflight|Star Shaman]]
* ''Melee'' [[incapacitator]] +17 (3d4+11 B [[nonlethal]]; critical [[stagger]] [DC 18]) or tendril +17 (3d4+11 S plus [[grab]]; critical [[stun]])
* ''Multiattack'' [[incapacitator]] +11 (3d4+11 B [[nonlethal]]; critical [[stagger]] [DC 18]), 2 tendrils +11 (1d10+11 S plus ''grab''; critical ''stun'')
* ''Ranged'' aphelion [[laser pistol]] +15 (3d4+9 F; critical [[burn]] 1d4)
* ''Space'' 5 ft.; ''Reach'' 5 ft. (15 ft. with tendrils)
* ''Offensive Abilities'' star shriek (DC 18)
* ''Cerebric Fungus Spell-Like Abilities'' (CL 9th)
** 3/day—//[[fear]]// (1st level, DC 18), //[[lesser confusion]]// (DC 18)
** At will—//[[daze]]// (DC 17), //[[detect thoughts]]// (DC 18)
* ''Mystic Spell-Like Abilities'' (CL 9th)
** At will—//[[mind link]]//
* ''Mystic Spells Known'' (CL 9th)
** 3rd (3/day)—//[[irradiate]]// (DC 20), //[[suggestion]]// (DC 20)
** 2nd (6/day)—//[[darkvision]]//, //[[force blast]]// (DC 19), //[[mind thrust]]// (DC 19), //[[mystic cure]]//
** 1st (at will)—//[[identify]]//, //shooting stars// (as //[[magic missile]]//)
* ''Connection'' [[star shaman]]
!!! STATISTICS
* ''Str'' +2; ''Dex'' +0; ''Con'' +4; ''Int'' +2; ''Wis'' +6; ''Cha'' +3
* ''Skills'' [[Acrobatics]] +17, [[Bluff]] +17, [[Diplomacy]] +22, [[Mysticism]] +22, [[Piloting]] +17
* ''Languages'' [[telepathy]] 100 ft.
* ''Other Abilities'' [[stargazer|Star Shaman]], [[starlight form|Star Shaman]] (9 minutes, DC 18), [[walk the void|Star Shaman]]
* ''Gear'' [[d-suit]] II, aphelion [[laser pistol]] with 2 high-capacity batteries (40 charges each), [[incapacitator]] with 2 batteries (20 charges each)
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or excursion (1–2 plus 4–10 cerebric fungi)
!!! SPECIAL ABILITIES
''Otherworldly Mind ([[Ex]])'' See above.
''Star Shriek ([[Ex]])'' See above.
''Unsettling Appearance ([[Su]])'' See above.
</div>
While this heavy armor of sculpted metal plates offers good protection to the wearer, its main purpose is to intimidate enemies. Often used for honor guards, military exercises, or parades, ceremonial plate is usually brightly colored or made of shining metal, with elaborate helmets.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br>Bonus | KAC<br>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br>Slots | Bulk |h
|ceremonial plate, troop | 1 | 110 | +1 | +3 | +2 | –3 | –10 ft. | 3 | 3 |
|ceremonial plate, officer | 4 | 2,275 | +6 | +8 | +2 | –2 | –5 ft. | 1 | 2 |
|ceremonial plate, commander | 7 | 7,350 | +10 | +12 | +2 | –3 | –10 ft. | 5 | 3 |
</div>
<div class="statblock">
* ''CR'' 9; ''XP'' 6,400
* Large monstrous humanoid
* ''Init'' +6; ''Senses'' [[blindsense]] (vibration) 30 ft., [[darkvision]] 60 ft.; ''Perception'' +22
!!! DEFENSE
* ''HP'' 120
* ''EAC'' 21; ''KAC'' 22
* ''Fort'' +8; ''Ref'' +10; ''Will'' +14
* ''Defensive Abilities'' [[Swarm mind]]; ''Immunities'' acid, fear effects
!!! OFFENSE
* ''Speed'' 30 ft., fly 30 ft. ([[Ex]], average)
* ''Melee'' claw +15 (3d4+12 S; critical [[bleed]] 2d6) or tentacle +15 (1d8+12 P plus consume; critical [[stagger]] [DC 18])
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive'' Abilities remote pulse
* ''Spell-Like Abilities'' (CL 9th; ranged +17)
** 1/day—//[[ray of exhaustion]]// (DC 20), //[[synaptic pulse]]// (DC 20)
** 3/day—//[[daze monster]]// (DC 19), //[[fear]]// (2nd level, DC 19), //[[force blast]]// (DC 19), //[[hold person]]// (DC 19)
** At will—//[[lesser confusion]]// (DC 18), //[[mind thrust]]// (1st level, DC 18)
!!! STATISTICS
* ''Str'' +3; ''Dex'' +6; ''Con'' +0; ''Int'' +0; ''Wis'' +4; ''Cha'' –1
* ''Skills'' [[Acrobatics]] +17, [[Athletics]] +17, [[Sense Motive]] +22
* ''Languages'' Shirren; [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or purge (3–6)
!!! SPECIAL ABILITIES
''Consume ([[Ex]])'' A creature struck by a Swarm ceretoram's tentacle must succeed at a DC 18 Fortitude save or have some of its biological matter siphoned off by the attack, taking an additional 1d8 piercing damage. The ceretoram then regains Hit Points equal to double this additional damage.
''Remote Pulse ([[Su]])'' As a reaction when a creature fails its save against a ceretoram's //[[mind thrust]]// spell-like ability, the ceretoram can immediately cast its //[[synaptic pulse]]// spell-like ability, centering the effect on the target of the mind thrust. That creature isn't subject to the effects of the //synaptic pulse//.
</div>
Swarm ceretorams employ a vicious set of mental abilities that allow them to quickly overwhelm their opposition through psychic might before closing in and rending with their claws in close combat. They can feed on nearly all forms of matter, including constructs and undead.
You can spend 1 Resolve Point as a reaction to reroll one of your [[specialization]]'s associated skill checks.
This weapon consists of a black leather glove that is mounted with a small, single-round firearm. Unlike most firearms, the weapon is designed to fire when pressure is placed upon its barrel rather than using a hand-based triggering mechanism. As a result, wielders must press a cestus pistol up against whatever they intend to shoot in order to discharge the weapon's round, giving the weapon limited range.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|cestus pistol, tactical | 1 | 250 | 1d4 P | reach | — | 1 round | 1 | — |[[conceal]], [[punch gun]] |
|cestus pistol, advanced | 6 | 4,170 | 1d12 P | reach | [[bleed]] 1d4 | 1 round | 1 | — |[[conceal]], [[punch gun]] |
|cestus pistol, elite | 11 | 24,400 | 3d12 P | reach | [[bleed]] 1d6 | 1 round | 1 | — |[[conceal]], [[punch gun]] |
|cestus pistol, paragon | 16 | 162,000 | 6d12 P | reach | [[bleed]] 1d8 | 1 round | 1 | — |[[conceal]], [[punch gun]] |
</div>
name:chain cannon
range:short
speed:—
damage:6d4
pcu:15
cost:10
special:[[ripper]]
<div class="statblock">
* <<levels>>
* ''School'' evocation (electricity)
* ''Casting Time'' 1 standard action
* ''Range'' long (400 ft. + 40 ft./level)
* ''Targets'' one primary target and up to 10 secondary targets, no two of which can be more than 30 ft. from the primary target
* ''Duration'' instantaneous
* ''Saving Throw'' Reflex half, see text
* ''Spell Resistance'' yes
</div>
Choose a primary target as well as up to 10 secondary targets within 30 feet of the primary target. The primary target must be carrying or wielding some kind of equipment that uses electricity. This spell causes the primary target's electrical equipment to surge with deadly electricity, which arcs out to strike the secondary targets, dealing 13d12 electricity damage to all targets chosen.
If the primary target fails its Reflex save, the spell also shorts out one of that target's electrical items (your choice) for 1 round, meaning the primary target can't use it for that period. If the primary target negates the effect entirely (such as with [[evasion]]), the secondary targets also suffer no effects.
Weapons with the //chained// fusion gain a short chain that dangles from the haft or handle. The chain magically extends to enable the weapon to attack foes beyond the wielder's immediate reach. A chained weapon gains the [[reach]] weapon special property for the first attack made with it each round. After it has been used for an attack, the weapon loses the reach weapon special property until the beginning of your next turn. You can add this fusion only to melee weapons.
<div class="statblock">
* ''Type'' melee; ''Special'' [[analog]], [[reach]], [[trip|Trip (weapon property)]]
* ''Damage'' low; ''Damage Type'' B; ''Critical'' —
* ''Slots'' 1 (upper limb)
* ''Lash (2 PP)'' As a standard action, the mech makes an attack against multiple targets in an area as though the chainwhip had the [[blast]] weapon special property. The length of the cone equals the mech's reach with the chainwhip.
* ''Cost'' 3 × level
</div>
This whip made of heavy chain links can provide devastating melee attacks or creative tactical options.
You can use Disguise to change your appearance with 1d3 × 10 minutes of work with a disguise kit, by casting a spell such as disguise self, or by using a technological device such as a holoskin. The GM rolls the Disguise check in secret, so you're not sure how good your disguise is. This check is opposed by the [[Perception]] check of anyone who might realize that you are not who you appear to be. If you are not drawing attention to yourself, other creatures do not usually get to attempt a Perception check to pierce your disguise. If creatures are being particularly alert for suspicious activity (such as security personnel on a starship or space station), it's assumed that such observers are taking 10 on their Perception checks.
The effectiveness of your disguise depends on how much you're changing your appearance. Without the aid of transformative magic or technology that allows you to do otherwise, you can use Disguise only to appear as a creature that is your size or one size category larger or smaller than you. This does not change your actual size or reach. Disguises are general—you cannot disguise yourself as a specific person.
Certain magic spells, such as //[[disguise self]]//, grant you a +10 bonus to Disguise checks.
The DCs for Disguise checks are adjusted by the type of disguise as well as other circumstances determined by the GM. These modifiers are cumulative; use all that apply.
<div class="table-wrapper">
|Disguise | DC Modifier |h
|Minor details altered only | -5 |
|Major feature altered | +2 to +5 |
|Disguised as a different race of the same creature type | +2 to +8 |
|Disguised as a different creature type | +10 |
|Disguised as a different size category | +10 |
</div>
When you interact socially with another creature, that creature has an initial attitude toward you. Attitudes fall into five categories (from worst to best): hostile, unfriendly, indifferent, friendly, and helpful. You can use Diplomacy to change a creature's initial attitude to a more positive one, but at the risk of angering the creature and worsening its attitude toward you if you fail. This is a language-dependent ability. The creature must have an Intelligence of 3 or higher, and you must spend at least 1 minute interacting and conversing with the creature to change its attitude. The DC of this check is equal to either 10 + your opponent's total Diplomacy skill bonus, or 15 + 1-1/2 × the opponent's CR (or the encounter's CR, if you are trying to change the attitude of a group of creatures), whichever is higher. The DC is modified by the creature's initial attitude and other circumstances, as determined by the GM. If you succeed, the creature's attitude improves by one category (for instance, a hostile creature becomes unfriendly). If you exceed the DC by 5 or more, you can choose to spend 10 more minutes interacting with the creature to improve its attitude by one additional category. If you fail the check by 5 or more, you anger the creature, and the creature's attitude worsens by one category (for instance, a friendly creature becomes indifferent).
Attacking a creature always worsens its attitude by one category for each attack made, and may have other consequences based on the creature's current attitude.
Positively affecting a creature's attitude takes time. You typically can't use Diplomacy to positively change a creature's attitude by more than one category (or two categories if you spend the extra time) within a 24-hour period, unless the GM decides otherwise or you have an ability that allows you to do so.
The five categories of initial attitude are described below, along with the effects of negatively changing each attitude.
* ''Hostile'' — A hostile creature would rather attack you either physically or verbally, than civilly converse with you. Most enemies you meet are hostile. It's often hard to talk diplomatically with hostile creatures, though it can be done remotely (via a communication device) or by avoiding combat with the creatures while persuading them to listen to reason. If you fail the Diplomacy check by 5 or more, you can't attempt to change a hostile creature's attitude again for 24 hours.
* ''Unfriendly'' — Unfriendly creatures are typically wary of you, or afraid you will try to hurt them if they aren't careful or fail to keep you at bay. Unfriendly creatures become hostile when angered or attacked.
* ''Indifferent'' — Indifferent creatures take little notice of you, but hold no ill will against you. They don't care about your plight, but may give you simple advice or directions. Most creatures you meet in everyday life or in settlements are indifferent. Indifferent creatures become unfriendly when angered or attacked.
* ''Friendly'' — Either due to a generally cheerful disposition or a predisposition to like you, friendly creatures treat you with kindness and respect. They may give you more-detailed advice or simple aid, but generally won't go out of their way to be helpful. If angered or attacked, friendly creatures become indifferent and often try to avoid further contact with you if possible.
* ''Helpful'' — Helpful creatures are not only friendly, but desire to help you, within reasonable means. Helpful creatures typically give you more lengthy or difficult aid, or offer small services that are readily available to them. When angered or attacked, helpful creatures become friendly, but somewhat guarded, as they are often confused by such reactions to their generosity.
The DCs for Diplomacy checks to change attitudes are adjusted based on the creature's initial attitude as well as other circumstances determined by the GM.
<div class="table-wrapper">
|Initial Attitude | DC Modifier |h
|Hostile | +10 |
|Unfriendly | +5 |
|Indifferent | +0 |
|Friendly | -5 |
|Helpful | —* |
|* You cannot improve a creature's attitude above helpful.|<|f
!!!
<div class="statblock">
* <<levels>>
* ''School'' enchantment (compulsion, mind-affecting)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./level)
* ''Targets'' one living creature
* ''Duration'' 1 hour/level (D)
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
You alter the target’s emotions and perceptions concerning a particular creature or topic, which can be as specific as “Vindaskayo Swarmripper, the current High Despot of the Veskarium” or as general as “technology.” The target’s attitude toward the chosen topic improves or worsens (your choice); the number of steps the target’s attitude changes is determined by the spell’s level (below). For example, you could use a 1st-level change attitude to improve the attitude of a target that’s normally indifferent toward AbadarCorp to make it friendly instead.
This spell doesn’t enable the target to be controlled as if it were an automaton, nor does it influence the target’s behavior in any way beyond its attitude. The target can discriminate between general creatures, topics, and individuals based on its experiences; for example, a vesk influenced by this spell to have a better attitude toward humans might begin with a friendly attitude toward all humans they meet, but if an individual human gravely insulted the target’s honor, their attitude can (and likely would) adjust to unfriendly or hostile toward that individual—and if the target was attacked by humans, the vesk would fight back.
* ''1st:'' The spell adjusts the target’s attitude by one step.
* ''2nd:'' The spell adjusts the target’s attitude by two steps.
* ''3rd:'' The spell adjusts the target’s attitude by three steps.
* ''4th:'' The spell adjusts the target’s attitude by four steps.
Changing your grip on a weapon, such as going from wielding a two-handed weapon with both hands to holding it in one hand, is a swift action.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one creature
* ''Duration'' 1 round/level
* ''Saving Throw'' Will partial
* ''Spell Resistance'' yes
</div>
You accelerate time for the target, making them experience the concentrated effects of a Triaxian season. This spell imbues a target with [[vulnerability]] (as the universal creature rule) to cold or fire (chosen when cast); if the target has [[resistance]] to that type of damage, it instead reduces a target’s resistance to cold or fire damage by 5. If the target is immune, it’s instead treated as though it had fire or cold resistance 10 for the duration of the spell. A successful Will save reduces the duration to one round.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' one creature
</div>
This spell functions like //[[change of seasons]]// except it causes [[vulnerability]] to fire or cold even if the target has [[resistance]] and reduces immunity to fire or cold resistance 5.
The creature has the ability to assume the appearance of a specific creature or type of creature, but it retains most of its own physical qualities. If the form assumed has any of the following abilities, the creature gains them while in that form: [[blindsight]] (scent), [[darkvision]], [[low-light vision]], and swim 30 feet. The creature can retain its own breathing ability, or it can assume the ability to breathe in any environment the assumed shape can breathe in (including the [[no breath]] ability, which enables it to survive in the vacuum of space). If the ability does not specify what the creature can change shape into, it can assume the form of any creature of the humanoid type, but it can't mimic a specific humanoid. Change shape grants a +10 bonus to [[Disguise]] checks to appear as a creature of the type and subtype of the new form, and the DC of the creature's Disguise check is not modified as a result of altering major features or disguising itself as a different race or creature type.
A creature can assume a form that is one size category smaller or larger than its original form; it becomes that size. Unless otherwise stated, it can remain in an alternate form indefinitely. Some creatures can transform into unique forms with special modifiers and abilities. These creatures adjust their ability scores, as noted in their description.
//Format:// ''Other Abilities'' change shape (humanoid); creatures with a unique form also have an entry in Special Abilities.
As a reaction, you can spend 1 Resolve Point to change the triggering condition for the [[readied action]] of an ally within 60 feet, but you don't change the readied action. Once a creature has been affected by this ability, they become immune to it for 24 hours.
This is a language-dependent, mind-affecting, sense-dependent effect.
You draw strange feelings, instincts, knowledge, and urges from your [[connection]], augmenting your prowess in certain tasks. Each connection has two skills associated with it. You gain a +1 insight bonus to skill checks with your connection's associated skills. This bonus increases by 1 at 5th level and every 3 levels thereafter.
<div class="statblock">
* <<levels>>
* ''School'' conjuration
* ''Casting Time'' 1 round
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' cylinder (30-ft. radius, 100 ft. high)
* ''Duration'' concentration, up to 1 round/level
* ''Saving Throw'' Reflex half, see text
* ''Spell Resistance'' no
</div>
You weaken the border between one of the outer planes and the area, drawing concentrated planar essence down to the battlefield in beams of volatile energy. A beam is a vertical line, 5 feet wide, from the top of the spell’s area to the bottom, and it deals 4d8 damage to each creature in the beam. When you cast this spell and each time you concentrate on it, you can call down a damaging beam within the spell’s area. A creature in the area of a beam can attempt a Reflex saving throw to halve the damage dealt by this spell. Creatures that fail this saving throw can suffer further ill effects, as noted.
When you cast this spell, select one of the following planes. You can only select a plane within one alignment step of your own. The beams gain additional effects based on the plane selected.
* ''Heaven (LG):'' When you choose Heaven, //channel the outer sphere// deals fire damage that has the lawful and good descriptors. Good creatures are immune to all damage dealt by this spell. Creatures that fail their Reflex saving throw are [[blinded]] 1 round.
* ''Nirvana (NG):'' When you choose Nirvana, //channel the outer sphere// deals nonlethal bludgeoning damage that has the good descriptor. Good creatures in the area of a beam are immune to all damage dealt by this spell and have 4d8 Hit Points restored.
* ''Elysium (CG):'' When you choose Elysium, //channel the outer sphere// deals sonic damage that has the chaotic and good descriptors. Good creatures in the area of a beam are immune to all damage dealt by this spell and escape from unwelcome bonds, immediately removing the [[entangled]] and [[grappled]] conditions.
* ''Axis (LN):'' When you choose Axis, //channel the outer sphere// deals electricity damage that has the lawful descriptor. Creatures that fail their Reflex saving throw are [[entangled]] for 1 round.
* ''Boneyard (N):'' When you choose the Boneyard, //channel the outer sphere// deals damage with the force descriptor. Undead in the area of a beam are dealt an additional 2d8 damage, for a total of 6d8 damage.
* ''Maelstrom (CN):'' When you choose the Maelstrom, the damage dealt by //channel the outer sphere// has the chaotic descriptor and an additional damage type determined randomly each round from among the following: acid, cold, electricity, fire. Creatures that fail their Reflex saving throw are [[confused]] for 1 round.
* ''Hell (LE):'' When you choose Hell, //channel the outer sphere// deals fire damage that has the lawful and evil descriptors. Creatures that fail their Reflex saving throw gain the [[burning]] condition (1d8).
* ''Abaddon (NE):'' When you choose Abaddon, //channel the outer sphere// deals acid damage that has the evil descriptor. Creatures that fail their Reflex saving throw are [[sickened]] for 1 round.
* ''Abyss (CE):'' When you choose the Abyss, //channel the outer sphere// deals slashing damage that has the chaotic and evil descriptors. Creatures that fail their Reflex saving throw are [[bleeding]] (1d8).
//Chaos sails// are engines powered by the churning evolutionary forces of change and possibility. Much like traditional sails bend the unpredictable wind to their advantage, //chaos sails// tap into the volatile energies of the roiling Maelstrom, enabling starships to travel through that plane to bypass interstellar distances. But raw chaos is difficult to harness, and chaos sails carry unpredictable risks—anything from the ships’ interior layouts rearranging, cargoes morphing into other goods, and even the laws of physics changing while in transit. Crews and passengers can be impacted as well, with pilots finding their flight controls now monitor power-core performance instead, or captains discovering that they must encourage or cajole their ship’s weapons to fire in combat.
Besmara is said to have created the first //chaos sails// for her ship, the //Starwraith//, driving it through the Maelstrom’s Cerulean Void and into other planes. Before the introduction of Drift travel, her pirate-priests were the primary users of //chaos sails//, and the especially devout continue to do so, trusting in Besmara’s favor to keep them safe from the hazards of the Maelstrom.
<div class= "table-wrapper">
|Drive | Engine Rating | Minimum<br/>PCU | Maximum<br/>Size | Cost (in BP) |h
|//chaos sails// | 1 | 75 | — | 4 × size category |
</div>
As player characters overcome challenges, they gain experience points (also called "XP") as a quantification of everything they've learned and practiced. As the PCs attain more experience points, they advance in character level, gaining new and improved abilities at each level. Characters advance in character level (or "level up") when they earn specific amounts of experience points—the Experience Point Total column of [[Table: Character Advancement]] shows the experience points needed to reach each level.
{{Table: Character Advancement}}
* ''Step 1: Apply any Ability Increases'' Every 5 levels, you get to increase and customize your character's ability scores. Each time he reaches one of these level thresholds (5th, 10th, 15th, and 20th), choose four of his ability scores to increase. If a chosen score is 17 or higher (excluding ability increases from personal upgrades, it increases permanently by 1. If it's 16 or lower, it increases by 2. You can't apply more than one of these increases to the same ability score for a given level. Unlike during character creation, ability score increases gained from leveling up can push your character's ability scores above 18. If an ability score increase results in a change to an ability modifier, any statistics that rely on that modifier, such as attack bonuses, saving throws, total skill bonuses, Resolve Points, Stamina Points, and the DCs of class features and spells, should be adjusted accordingly. Ability score increases are effective retroactively; when your character's ability score increases, it increases his total number of ability-based statistics—things like Resolve Points, Stamina Points, or skill ranks—as if he had the higher value at previous levels as well.
* ''Step 2: Add New Class Features'' Your character's can either advance to the next level of his current class or take a level in a different class (see Multiclassing below). Increase your character's Hit Points by the number that his class grants him, increase his Stamina Points by the amount specified in the class plus his Constitution modifier, adjust his saving throw and attack bonuses, and integrate the class features he gains at that level (including choosing any new spells he has gained if he's a spellcaster). In addition any new class features he gains, some class features he received at lower levels may improve at higher levels, so be sure to check whether his existing class features have gotten better.
* ''Step 3: Add New Feats or Theme Benefits'' Your character gets a new feat at every odd-numbered level. This is in addition to any bonus feats he might get from his class. When choosing a new feat, be sure to check the prerequisites to make sure your character qualifies for it. Your character gains a new benefit from his theme at 6th level, 12th level, and 18th level.
* ''Step 4: Invest Skill Ranks'' Whenever your character levels up, he gains a number of new skill ranks based on his class and his Intelligence modifier; as noted in Step 1, he may also gain skill ranks as a result of his Intelligence modifier increasing. Invest these new skill ranks in skills (he can invest in existing skills or new skills), keeping in mind that his ranks in any one skill can't exceed his character level. If any of his ability score modifiers increased in Step 1, don't forget to adjust those bonuses to his skill checks.
!! Multiclassing
Most characters continue to advance in their chosen classes for their entire careers, gaining ever more impressive abilities. Sometimes, however, you might want your character to cross-train and pick up some of the abilities of a different class. When such a character levels up, instead of gaining the next level of his existing class, he can add a level of a new class, adding all the 1st-level class features of that class to his existing class features. This is referred to as "multiclassing."
For example, let's say a 5th-level soldier decides to dabble in the magical arts and adds 1 level of technomancer when he next advances in level (such a combination of levels is commonly written "soldier 5/technomancer 1"). Such a character retains the class features and abilities of a 5th-level soldier—his bonus feats, style techniques, armor and weapon proficiencies, and other class features—but also gains the class features and abilities of a 1st-level technomancer, such as the ability to cast 1st-level technomancer spells and the technomancer's spell cache class feature. He adds all of the Hit Points, Stamina Points, base attack bonuses, and saving throw bonuses from the 1st-level technomancer on top of those gained from being a 5th-level soldier, and is still considered a 6thlevel character (his character level is 6th.)
It's important to keep track of which effects and prerequisites rely on a character level versus class level. For example, feats might require a minimum class level or character level, while almost all class features are based on the character's level in the class that grants that feature. Casting spells is an exception—when determining caster level, a character adds together his levels from different spellcasting classes (such as mystic and technomancer).
A multiclassed character can have more than one key ability score. For each class, your key ability score remains the same as normal for that class (and for the class features that rely on that score). For any key ability score calculation not tied to class, such as determining your maximum Resolve Points, use whichever key ability score has the highest value (and therefore the highest modifier).
You can take as many levels of as many different classes as you want, but while it might seem tempting to be a dilettante, spreading yourself thin comes with a cost. Since you always start at the ground floor with a new class, it's easy to end up with a bunch of low-level abilities that can't compete with the higher-level abilities of a single-class character of the same level. For instance, an envoy 3/soldier 4/technomancer 3 may be well-rounded, but she's going to get stomped into pudding by a 10th-level soldier, and she will be consistently outperformed by the other 10th-level characters in her party.
<<list-links '[all[current]listed[source]]' class:index>>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Character Rules'>>
</div>
Charging is a full action that allows you to move up to double your speed and make a melee attack at the end of the movement. You can draw a weapon during a charge attack if your base attack bonus is at least +1.
Charging carries tight restrictions on how you can move. You must move at least 10 feet (2 squares), and all movement must be directly toward the designated opponent, though diagonal movement is allowed. You must have a clear path toward the opponent, and you must move to the space closest to your starting square from which you can attack the opponent. If this space is occupied or blocked, you can't charge. If any line from your starting space to the ending space passes through a square that blocks movement, slows movement (such as difficult terrain), or contains a creature (even an ally), you can't charge. You can still move through helpless creatures during a charge. If you don't have line of sight to the opponent at the start of your turn, you can't charge that opponent.
!! Attacking on a Charge
After moving, you can make a single melee attack. You take a –2 penalty to the attack roll and a –2 penalty to your AC until the start of your next turn. You can't move any farther after the attack. Some classes, including solarian and soldier, grant abilities that modify attacks made on charges.
A //charge cloak// can power devices that depend on electrical charges as if it were a battery. The cloak produces 4 charges each day, but they must be used as a single unit. Thus you could power a single attack from a yellow star [[plasma sword]], which has a usage of 4, but you could also make only a single attack with a [[zero pistol]], which has a usage of 1. The item must be one which uses charges or a battery, rather than petrol, rockets, rounds, or other forms of ammunition or power. You must be wearing or touching the item to be charged. You cannot use this item to recharge a battery or item; it can only be used to directly power an item for a single usage.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//charge cloak// | 1 | 200 | L |
</div>
A weapon with the [[charge disrupting]] fusion disrupts power sources. When you score a critical hit using a weapon with the [[charge disrupting]] fusion, either the target or a single visible object carried by the target is subject to //[[discharge]]//, as the spell. The target creature (or its bearer, in the case of an object) can attempt a Fortitude save to negate the effect, as normal. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the charge disrupting effect.
This series of insulating reinforced-glass rings can be installed into armor upgrade slots and focuses an electrical charge into a targeted bolt. The sheer power necessary to project a bolt of electricity means that even an impulse charge emitter is a substantial weapon, and jolt charge emitters and surge charge emitters are significantly more powerful. Their relatively slim profile makes them popular for a number of users, from androids and others who benefit from a racial armor upgrade slot, to starship-repair crews in hostile space who want to keep their hands free for their work without leaving themselves totally undefended.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|charge emitter, impulse | 8 | 10,900 | 3d4 E | 20 ft. | [[stagger]] | 20 charges | 2 | 1 |[[integrated]] (1 slot), [[stun]] |
|charge emitter, jolt | 13 | 57,000 | 3d10 E | 30 ft. | [[stagger]] | 20 charges | 2 | 1 |[[integrated]] (1 slot), [[stun]] |
|charge emitter, surge | 18 | 435,000 | 5d10 E | 40 ft. | [[stagger]] | 80 charges | 5 | 1 |[[integrated]] (1 slot), [[stun]] |
</div>
A nanoscopic battery attached to a miniature generator is implanted in the palm of your hand. A charge palm produces 4 charges each day and can hold a maximum of 10 charges. If the charge palm holds its maximum number of charges at the beginning of the day, it doesn’t produce any additional charges that day. As a move action, you can transfer any number of charges from the charge palm to any battery in your possession or vice versa, up to that item’s maximum number of charges.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|charge palm | 1 | 350 | one hand |
</div>
When making a ranged attack with a weapon that uses charges for ammunition, you can spend Entropy Points in place of battery charges at a rate of 1 Entropy Point per 2 charges the attack would normally consume (minimum 1 EP). When you use this revelation, all damage dealt by the attack becomes acid damage, though this ability never causes a weapon that normally targets KAC to target EAC.
When you damage a creature in your [[nanite cloud]] or when you damage a creature within 30 feet using a weapon formed with your [[gear array]], you can drain power from the target's technological devices as a reaction. Choose one item in the target's possession that uses charges or select a qualifying item at random. That item loses a number of charges equal to 1d10 plus your Constitution modifier (Fortitude half), and a battery in your possession gains an equal number of charges (to a maximum of the battery's capacity). You can use this ability a number of times per day equal to your Constitution modifier.
Your skin slowly generates electricity that can be used to power devices that require power measured in charges from a battery to function, such as a [[powered]] weapon. You must be touching the item to use it. Your charged skin holds 10 such charges, which are replenished each day after a full night's rest. You can't charge a battery or item with your //charged skin//; you can spend charges directly from it only to power held devices.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|//charged skin// | 5 | 3,075 | skin |
</div>
<div class="statblock">
* Huge mech (phase)
* ''Base HP'' 10; ''HP Advancement'' 8; ''Hardness'' 0
* ''EAC'' +2; ''KAC'' +2; ''Fort'' +0; ''Ref'' +1
* ''Speed'' 60 ft.; ''Strength'' +3
* ''Frame Slots'' 2; ''Aux Slots'' 3
* ''Operators'' 1–2
* ''Cost'' 2.5 × tier
</div>
As a move action, you can expend an unused spell slot to refill charges in a weapon's power cell. This requires you to touch the weapon or its power cell. The power cell regains 10 charges per spell level, up to its capacity. You can also use this ability to jump-start or short out an electronic device, allowing you to attempt an [[Engineering]] check to disable a device with a bonus equal to double the level of the spell you expended.
//Healthy—Weakened—Impaired—Pliable—Catatonic—Dead//
//Weakened:// The victim takes a –2 penalty to Charisma-based ability checks and skill checks, and the DCs of her spells and special abilities decrease by 2. If she has 1 or more levels in a spellcasting class whose key ability score is Charisma, she can't cast her highest level of spells from that class.
//Impaired:// The victim takes an additional –2 penalty to the affected checks and DCs. If she has 1 or more levels in a spellcasting class whose key ability score is Charisma, she can't cast her 2 highest levels of spells from that class.
//Pliable:// The victim has little sense of self and goes along with nearly any order or suggestion. Creatures attempting [[Bluff]], [[Diplomacy]], or [[Intimidate]] checks against her automatically succeed, though Diplomacy checks to improve her attitude still have the normal DC.
//Catatonic:// The victim loses agency and can't interact with anything.
//Dead:// The victim loses autonomic functions and dies.
<div class="statblock">
* <<levels>>
* ''School'' enchantment (charm, mind-affecting)
* ''Targets'' one living creature
* ''Duration'' 1 day/level
</div>
This spell functions like //[[charm person]]//, except the effect is not restricted by creature type.
<div class="statblock">
* <<levels>>
* ''School'' enchantment (charm, mind-affecting)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one humanoid creature
* ''Duration'' 1 hour/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
This charm makes a humanoid creature regard you as its trusted friend and ally (treat the target's attitude as friendly). If the creature is currently being threatened or attacked by you or your allies, however, it receives a +5 bonus to its saving throw.The spell does not enable you to control the charmed creature as if it were an automaton. It is unlikely to attempt to harm you, but it is also unlikely to attack any of its true friends or allies. You can try to give the target suggestions, but you must succeed at an opposed Charisma check to convince it to do anything it wouldn't ordinarily do. (Retries of this check are not allowed.) An affected creature never obeys suicidal or obviously harmful suggestions. Any act by you or your apparent allies that threatens the charmed creature breaks the spell. You must speak the creature's language to communicate your suggestions, or else be good at pantomiming.
<div class="statblock">
* <<levels>>
* ''School'' illusion
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' one creature
* ''Duration'' 10 minutes
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You pull gossamer threads from other, more genteel realities and wrap the target in them, smoothing the edges of their personality and accentuating their charms. The target gains a +1 circumstance bonus to Charisma checks and Charisma-based skill checks. Additionally, a creature affected by this spell can attempt a [[Diplomacy]] check to [[gather information]] in only 10 minutes. Once any individual under the effects of a //charming veneer// spell you cast has used this benefit to gather information in a specific settlement or local region, no target of a //charming veneer// spell you cast can do so again for 24 hours.
These are the actions available to a starship's crew during each round of a starship chase, after the GM has presented an obstacle. No chase action can be taken two rounds in a row. Characters also can't attempt an obstacle check and take a chase action in the same round.
Each action notes the crew members that can attempt the action; those crew members use one of the skills listed in the table below to attempt a skill check. Each action includes any consequences for success or failure. GMs can also create their own chase actions tailored to a particular setting or chase, selecting crew roles appropriate for those actions.
<<list-links "[tag[Chase Actions]sort[title]]" class:index>>
<div class="table-wrapper">
|Starship Role |Skills |h
|Captain |[[Bluff]], [[Diplomacy]], [[Intimidate]] |
|Chief Mate |[[Acrobatics]], [[Athletics]] |
|Engineer |[[Engineering]] |
|Gunner |[[Piloting]] |
|Magic Officer |[[Mysticism]] |
|Pilot |[[Piloting]] |
|Science Officer |[[Computers]] |
</div>
{{Table: Chase Skill Check DCs}}
Where a chase occurs can dramatically influence how it plays out. Heavy traffic, obstacles, and winding paths could all impede a chase or add strategic options for the vehicles involved. The GM decides the environment's effects on the chase. The environment might affect the entire chase or only some zones—whatever makes the most sense for the scene.
!! Designating Environmental Zones
For environmental effects that affect only part of the chase, the GM should designate one or more zones as environmental zones that contain hazards. The GM should reveal an environmental zone once it comes into view of the foremost vehicle in the chase.
!! Types of Environments
Environments can affect vehicles in a chase in five main ways.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> head="h3" />
</$list>
Each round, the GM can present one of the obstacles below. GMs can also create their own obstacles tailored to a particular setting or chase, selecting crew roles appropriate for those actions. Each obstacle lists the crew members who can attempt a skill check to overcome it. Those crew members can use one of the [[skills listed|Chase Actions]] to attempt to overcome the obstacle. Succeeding at skill checks to overcome obstacles doesn't count toward the PCs' total number of successes when determining the success or failure of the starship chase.
<<list-links '[tag[Chase Obstacles]]' class:index>>
Chases happen in rounds with three phases, which are described in more detail below. At the start of a chase, roll initiative checks (or use the same initiative order if a grid-based vehicle combat transitioned into a chase).
# ''Pilot Actions:'' Each vehicle's pilot selects her pilot actions and attempts any needed checks outside the normal character initiative count.
# ''Chase Progress:'' The GM moves the vehicles to their new zones, based on the actions the pilots chose and whether they were successful. The GM also determines whether anyone is out of range of other vehicles, and therefore out of the chase.
# ''Combat:'' Pilots (if they have any remaining actions) and passengers take their actions in initiative order as they normally would in a combat. Passengers and pilots can fire on other vehicles, depending on their range, and pilots might be able to slam their vehicles into those of their enemies.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
In the chase progress phase, the GM advances vehicles (based on their pilots' chosen actions and whether they succeeded at the required checks), then determines whether any participants have escaped or been left behind and whether the chase is over.
!! Advance Vehicles
The GM moves forward by one zone all vehicles whose pilots succeeded at a minimum of one required check. If a vehicle's pilot deliberately slowed down or she failed all the [[Piloting]] checks attempted, her vehicle doesn't move forward. If a pilot attempted to keep pace and failed, her vehicle instead moves back one zone. If a pilot attempted to speed up and failed by less than 5, her vehicle still moves forward one zone now. Because a pilot has to fail all checks to stay put, a pilot who tried to speed up twice would stay put only if she failed both checks by 5 or more. The slow down action supersedes the forward movement from other successful Piloting checks, so if the pilot succeeded at the evade and slow down actions, she'd get the bonus to her vehicle's AC but wouldn't move forward. Treat [[uncontrolled]] vehicles as if their pilots had failed all Piloting checks.
If a vehicle is engaged with another and fails all its checks, it still moves forward along with another engaged vehicle, provided that vehicle would be advanced by the GM. However, the opposing vehicle gains all bonuses from being a zone ahead (even though it's in the same zone). If all the vehicles in an engagement fail all their checks, none move.
Hazards and other effects of moving into a zone trigger immediately.
!! Escaping and Getting Left Behind
You leave a chase if you escape or get left behind. During the chase progress phase, you escape if you end up two zones ahead of all adversaries, and you get left behind if you end up two zones behind.
If you would escape from a chase but don't want to do so, you can voluntarily move back to being only one zone ahead in the chase progress phase.
It's possible for you to rejoin a chase if you've been left behind (or if you already escaped and want to later support allies with an ambush), but it requires extraordinary circumstances and happens at the GM's discretion.
As an example, suppose the PCs are in an exploration buggy fleeing from a police cruiser, and are one zone ahead of the pursuing police cruiser. During the pilot actions phase, the PC pilot succeeds at a Piloting check to speed up, immediately moving the buggy an additional zone ahead, which brings it two zones ahead of the police cruiser. The officer piloting the police cruiser tries to speed up and catch the PCs, but he fails his Piloting check, so the police cruiser remains in its zone. During the chase progress phase, both vehicles move forward one zone, but because the PCs are still two zones ahead, they escape and leave the chase.
In this example, the PCS escaping and the police getting left behind have the same end result. But what if there were two police cruisers, and one succeeded at its check to speed up but the other didn't? The cruiser that succeeded would end up one zone behind the PCs, and the one that failed would be two zones behind. The second cruiser would leave the chase, but the PCs wouldn't escape because their buggy isn't two zones ahead of all pursuers.
!! Ending a Chase
If either all enemies or you and your allies have escaped or been left behind, the chase is over. It's possible for one group to escape by dropping back until it's left behind, but it's easy for the other chase participants to circle back and pick off the group while it's a sitting duck.
At the beginning of each round of a starship chase, each character
can switch to a different starship role (or assume a role if they
didn't already have one). A character can switch to the captain
or pilot role only if that role would otherwise be vacant (or if the
character currently in that role is unable to take actions).
Once every character has chosen a starship role, the GM can
present an obstacle. The PCs then decide together which chase
action the starship will take this round and which characters
will attempt the skill checks associated with both the obstacle
(if present) and the chase action, in that order. Chase actions are
presented starting on page 45.
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 round
* ''Range'' personal
* ''Duration'' instantaneous
</div>
You unfetter yourself in time, rapidly performing a variety of actions in the blink of an eye. You can perform up to six actions from the following options, in a combination and order of your choice, though some actions end the spell immediately.
* ''Attack:'' You can perform an attack with any weapon you’re wielding. After you perform this action, //cheat time// immediately ends, eliminating any unused actions.
* ''Combat Maneuver:'' You can perform a [[bull rush]], [[dirty trick]], [[disarm|Disarm (combat maneuver)]], or [[trip|Trip (combat maneuver)]] combat maneuver. When you attempt these combat maneuvers, you can use your key ability modifier instead of your Strength modifier if it’s higher.
* ''Manipulate Object:'' You can manipulate an object within reach.
* ''Move:'' You can move up to your speed. This movement doesn’t provoke attacks of opportunity.
* ''Spell:'' You can cast a spell with a casting time of 1 standard action. After you perform this action, if the spell you cast is offensive, //cheat time// immediately ends, eliminating any unused actions.
[[Ysoki]]'s cheeks are remarkably stretchy, and they use this to their advantage. Durable skin implanted in your own cheeks affords you the same benefit. You can store up to 1 cubic foot of items weighing up to 1 bulk in total in your new cheek pouches, and you can transfer a single object between hand and cheek as a swift action. You can disgorge the entire contents of your pouches onto the ground in your square as a move action that doesn't provoke attacks of opportunity.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|cheek pouches graft | 6 | 3,900 | throat |
</div>
This handheld unit includes an extendable wand tipped with a sampling nozzle, and can be easily operated with a single hand. It grants a +4 circumstance bonus to [[Engineering]], [[Mysticism]], and [[Physical Science]] checks to identify an unknown drug, medicinal, poison, or other chemical substance.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|chemalyzer | 1 | 150 | L | 20 | 2/use |
</div>
When shaken and crushed as a full action, this single-use pack's contents create a cooling endothermic reaction for 1 hour. While held against the body, an activated cold pack grants you a +2 circumstance bonus to Fortitude saves against hot environments. Once per day after being in contact with an activated cold pack for an hour, you also recover 1d4 Hit Points or Stamina Points lost due to hot environments or fire damage. Finally, if you have at least half of your maximum Stamina Points remaining and apply an active cold pack to your body while spending a Resolve Point to recover Stamina Points, you can recover the Stamina Points with 5 minutes of rest rather than 10 minutes.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|chemical cold pack | 1 | 5 | – |
</div>
When shaken and crushed as a full action, this single-use pack's contents create an endothermic reaction that creates a heating effect for 1 hour. A heat pack functions in all ways as a [[chemical cold pack]], except that it protects against cold environments and recovers damage dealt by cold environments and cold damage.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|chemical heat pack | 1 | 5 | – |
</div>
You can imprint and interpret scent-related messages.
''Prerequisites:'' [[Blindsense]] (scent), [[blindsight]] (scent), or [[Survival]] 5 ranks
''Benefit:'' As a full action, you can mark a 5-foot square with specialized pheromones that encode a message you devise and, at your option, a direction. The message has a maximum number of words equal to your Charisma modifier or half your level, whichever is higher, and it can’t contain proper nouns. For example, you could convey “danger this way” with a direction, but not “Ask for Luwazi Elsebo.” To notice your pheromone markings, a creature within 15 feet must succeed at a [[Perception]] check with a DC equal to 20 + your level, and a creature interprets the message only if they exceed the check DC by 10 or more. A creature with [[blindsense]] (scent) or [[blindsight]] (scent) gains a +10 or +20 circumstance bonus respectively to detect and interpret your pheromone markings and can do so within the range of their sense if it’s greater than 15 feet.
<div class="statblock">
* ''CR'' 1; ''XP'' 400
* LG Small outsider (angel, extraplanar, good, lawful)
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +5
!!! DEFENSE
* ''HP'' 20
* ''EAC'' 11; ''KAC'' 13
* ''Fort'' +5; ''Ref'' +3; ''Will'' +1; +4 vs. poison
* ''Defensive Abilities'' constructed shell; ''Immunities'' electricity, petrification
!!! OFFENSE
* ''Speed'' 30 ft., fly 20 ft. ([[Su]], average)
* ''Melee'' tactical [[dueling sword]] +6 (1d6+2 S)
* ''Ranged'' [[pulsecaster pistol]] +9 (1d4+1 E [[nonlethal]])
!!! STATISTICS
* ''Str'' +1; ''Dex'' +4; ''Con'' +2; ''Int'' +0; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +5, [[Piloting]] +10, [[Sense Motive]] +5
* ''Languages'' Celestial, Draconic, Infernal; [[truespeech]]
* ''Gear'' [[pulsecaster pistol]] with 1 battery (20 charges), tactical [[dueling sword]]
!!! ECOLOGY
* ''Environment'' any good-aligned planes (Heaven)
* ''Organization'' solitary, pair, or host (3–4)
!!! SPECIAL ABILITIES
''Constructed Shell ([[Ex]])'' As creatures of planar essence inside of a robotic frame, cherubic squires have dual natures. For effects targeting creatures by type, a cherubic squire counts as both a construct and as an outsider (whichever type allows an ability to affect them for abilities that affect only one type, and whichever is worse for abilities that affect both types).
''Retractable Weapons ([[Ex]])'' When not in use, each of a cherubic squire’s weapons is folded inside the squire’s shell and hidden from sight. A creature unaware of the cherubic squire’s hidden weapons must succeed at a DC 15 [[Perception]] check to notice one. A cherubic squire can deploy any or all of their weapons as a swift action or as part of making an attack or full attack. The cherubic squire can’t be disarmed of the weapons. As a swift action, the squire can retract any or all of their weapons.
</div>
To keep unrestrained technological advances out of evil hands, barachius angels created robotic shells capable of housing angelic petitioners, the souls of good mortal beings that haven’t yet been judged for their eternal reward, to act as footsoldiers in their ongoing crusade. These seemingly simplistic robots are often mistaken for holy automatons, but are in actuality constructed shells to protect and empower the vulnerable, good-aligned quintessence—the substance that forms a petitioner’s body on the Outer Planes—that is installed within. A petitioner’s quintessence can be harmed and even destroyed similar to a mortal body’s flesh, but a petitioner can never be resurrected if it is “killed”; when this happens, the surrounding plane absorbs that essential energy. As such, cherubic squires hold their lives very dear and aren’t averse to fleeing in the face of superior odds unless spurred into action by more powerful celestials. When a cherubic squire is defeated and the angelic spark within dissolves, a useless metal husk is left behind to corrode and disintegrate.
To the unknowing, cherubic squires are simple, if beautiful, machines with large ocular cameras that add to their seeming innocence; in war, this childlike guise quickly becomes a terrifying visage as the camera turns an angry red color. Cherubic squires are usually deployed to the field in hosts under the command of other angels or, in rare cases, alone or in pairs to facilitate surgical strikes. Whenever barachiuses march to battle, they surround themselves with masses of these creations, using them as part of the front line of their armies against the minions of evil—clearing a swath with blade and electricity—or piloting ships and celestial chariots across both the field of battle and the skies above.
You and your crew oversee the mystical rites of your fleet.
* ''Associated Skill:'' [[Mysticism]]
* ''Officer Bonus:'' AC against enemy gunnery checks
!! Conjure (Engineering Phase)
Choose 1 hex and attempt a DC 10 flat check. If you succeed, your mystical crew conjures cosmic debris in that hex and all adjacent hexes that lasts until the end of the round. Any fleet that ends its turn in that area takes an amount of damage equal to your officer bonus, and any fleet attacks that pass through the affected area take a –1 penalty to gunnery checks.
!! Enchant (Engineering Phase)
You lead your mystics in enchanting a fleet's weapons. Choose a fleet and attempt a check against that fleet's AC. If you succeed, that fleet's range increases by 2, and its gunnery checks can deal critical damage on a 19 or 20. These effects last until the end of the round.
!! Precognition (Engineering Phase)
You and your crew predict enemy movements. Attempt a DC 10 flat check. If you succeed, your admiral rolls 1d4 and adds the result to their next check to determine the order in which fleets move during the helm phase.
You command your fleet's engineering corps, oversee repairs, and make crucial calls on when to exceed starships' recommended performance limits.
* ''Associated Skill:'' [[Engineering]]
* ''Officer Bonus:'' starting and maximum Shield Points.
!! Boost (Engineering Phase)
Choose a fleet and attempt a check against its AC. You direct the engineers aboard that fleet to augment a key system. If you succeed, you either increase the fleet's speed by 1d2 until the end of the round, decrease the fleet's turn distance by 1 (minimum 0) until the end of the round, add your officer bonus to the SP that fleet recovers during this phase, or add your officer bonus to the fleet's damage rolls until the end of the turn.
!! Repair (Engineering Phase)
Choose a fleet and attempt a check against the fleet's AC. If you succeed, choose one of the fleet's critical damage conditions; you direct the onboard engineers' repairs, and the fleet ignores that critical damage condition for 1 round, plus 1 additional round for every 5 by which your check exceeded the fleet's AC.
Despite the advanced technology that is ubiquitous on most starships, there's always a use on board for someone who knows the ship's various systems well enough to manually push them to achieve levels of performance their manufacturers never intended. A starship's chief mate knows every circuit and conduit within their starship's mechanical and electronic systems, and is bold enough to take risks with these levers, valves, and other intricacies that can help their crew escape from or win dire combat scenarios.
Being a chief mate is hardly easy, however, and the role is not for the faint of heart. Accomplishing the off-the-books feats that are so valuable in starship combat often requires a strong and hardy individual to physically haul around equipment, force levers past their built-in safety points, or reconnect systems in ways they weren't designed for—or else requires someone nimble enough to accomplish the same tasks via finesse without resorting to brute force, as the chief mate slides finicky controls into nonstandard positions or temporarily bypasses a system's physical safety valves.
The chief mate assists characters in all other roles on the ship, making the other characters' jobs easier and allowing them to accomplish more in their primary duties since they no longer need to focus on physically manipulating machinery or equipment. A chief mate acts during the same phase as the crew member she wishes to assist that round. Despite the role's name, a ship can have any number of chief mates (though on a military ship, only one is generally referred to as the chief mate, and all others are considered deck officers).
!! Actions
<<list-links "[tag[Chief Mate Actions]sort[title]]" class:index>>
As a chief mate, you can take any of the following actions, some depending on your number of ranks in the [[Acrobatics]] or [[Athletics]] skill, whichever you favor. (Note that the [[Targeting Aid]] and [[Maximize Speed]] actions both require a minimum number of ranks in Acrobatics or Athletics to perform.) Each of these actions can be taken only during a particular phase, as noted in parentheses next to the action's name. You must decide at the start of each round which phase you will act in, usually by deciding which other role you're supporting that round. Unless otherwise noted, each action can be performed only once per round, no matter how many chief mates are on a starship.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
You oversee your fleet's computers and scientists as they direct scanners and hack enemy systems.
* ''Associated Skill:'' [[Computers]]
* ''Officer Bonus:'' gunnery checks
!! Scan (Helm Phase)
You direct the fleet's sensors to scan another fleet. Attempt a check with a +5 untyped bonus against the fleet's AC. If you succeed, you learn the first unknown category of information from the following list. For every 5 by which you exceed the check, you learn an additional unknown category of information.
# ''Basic Statistics:'' Fleet type, size, speed, maneuverability, tier, damage, total and current HP and SP.
# ''Special Abilities:'' Special abilities, as well as the fleets against which the target fleet is strong or weak.
# ''Officers:'' The names and roles of the fleet's officers.
!! Scramble (Gunnery Phase)
You scramble communications within a fleet. Select an enemy fleet, optionally selecting one of that fleet's officers, and then attempt a check against the fleet's AC. During the next round, the fleet's chosen officer grants no passive benefit to their fleet and can't perform any officer actions. In addition, any other fleets' officer actions can't affect the targeted fleet. If you don't select an officer, scramble affects one of the fleet's officers, selected at random.
!! Target (Helm Phase)
Choose an allied fleet and an enemy fleet within range, then attempt a check against the enemy fleet's AC. If you succeed, until the end of the round, the allied fleet gains a +1 untyped bonus to gunnery checks against the enemy fleet, and the allied fleet's gunnery checks against the target deal critical damage on a 19 or 20.
This imposing rifle, made of red scales and horn, emits an impressive gout of bright flame. Designed by Iratha Incorporated and first released as an augmentation, it proved cumbersome and was redesigned as an armor-integrated weapon.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|chimera graft, growl-class | 7 | 6,250 | 1d12 F | 40 ft. | [[burn]] 1d6 | 20 petrol | 1 | 1 |[[automatic]], [[integrated]] (1 slot), [[harrying]], [[living]], [[regrowth]] |
|chimera graft, snarl-class | 11 | 24,000 | 2d12 F | 40 ft. | [[burn]] 1d6 | 20 petrol | 1 | 1 |[[automatic]], [[integrated]] (1 slot), [[harrying]], [[living]], [[regrowth]] |
|chimera graft, roar-class | 17 | 218,000 | 4d12 F | 40 ft. | [[burn]] 1d6 | 20 petrol | 1 | 1 |[[automatic]], [[integrated]] (1 slot), [[harrying]], [[living]], [[regrowth]] |
</div>
<div class="statblock">
* ''CR'' 16; ''XP'' 76,800
* N Gargantuan outsider (kami, native)
* ''Init'' +2; ''Senses'' [[blindsight]] (life) 60 ft., [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +28
!!! DEFENSE
* ''HP'' 255;
* ''EAC'' 29; ''KAC'' 30
* ''Fort'' +16; ''Ref'' +14; ''Will'' +19
* ''Defensive Abilities'' [[fast healing]] 10, revitalization contingency; ''Immunities'' [[bleed]], mind-affecting effects, petrification, [[polymorph]]; ''Resistances'' acid 10, electricity 10, fire 10
!!! OFFENSE
* ''Speed'' 50 ft., fly 50 ft. ([[Su]], perfect)
* ''Melee'' biomechanical staff +27 (6d8+27 B or P; critical [[bind]] or [[bleed]] [see text])
* ''Space'' 20 ft.; ''Reach'' 20 ft. (25 ft. with biomechanical staff)
* ''Spell-Like Abilities'' (CL 16th)
** 1/day—//[[chain surge]]// (DC 26), //[[divination]]//, //[[terraform]]//
** 3/day—//[[creation]]//, //[[greater dispel magic]]//, //[[mystic cure]]// (5th level), //[[greater remove condition]]//, //[[summon creature]]// (5th level; three 4th-level kami)
** At will—//[[cosmic eddy]]// (DC 24), //[[life bubble]]//
!!! STATISTICS
* ''Str'' +10; ''Dex'' +2; ''Con'' +5; ''Int'' +4; ''Wis'' +7; ''Cha'' +4
* ''Skills'' [[Acrobatics]] +28 (+36 to fly), [[Engineering]] +28, [[Mysticism]] +33
* ''Languages'' Common; [[telepathy]] 100 ft.
* ''Other Abilities'' merge with ward (space station park), [[no breath]]
!!! ECOLOGY
''Environment'' any
''Organization'' solitary
!!! SPECIAL ABILITIES
''Biomechanical Staff ([[Su]])'' As a swift action or as part of a full attack, a chinjugami can manifest a staff in its grasp. The staff's effective item level is equal to the chinjugami's CR. The staff has the [[reach]] weapon special property and can deal either bludgeoning or piercing damage with each attack. On a critical hit, the chinjugami chooses one of two effects—the staff either sprouts entangling vines, applying the [[bind]] critical hit effect, or disrupts the target's body, applying the [[bleed]] critical hit effect. A chinjugami can manifest only one staff at a time. If the kami loses hold of the staff, the weapon disintegrates.
''Merge with Ward ([[Su]])'' See [[kami subtype graft]]; a chinjugami claims a massive fabricated ecosystem as its ward.
''Revitalization Contingency ([[Su]])'' A chinjugami that is reduced to 0 Hit Points disperses into light that merges with the chinjugami's ward. For 7 days, the chinjugami is unconscious as it regenerates its body and mind. After that time, the chinjugami regains consciousness and can reemerge from its ward. A chinjugami can be completely destroyed only if its ward is destroyed.
</div>
A chinjugami is much larger than a [[tsukumogami]] and often selects a constructed ecosystem, especially one separated from a planet, as its ward. Although a chinjugami prefers to stay merged with its ward, it can manifest as a titan of metal and greenery. A chinjugami might claim a park on a space station as its host. When a kami claims an occupied ecosystem, it intervenes only in subtle ways, such as removing rust from pipes. It is when such constructed ecosystems are abandoned that chinjugami fully embrace their roles as protectors and stewards of their wards, patrolling relevant areas, performing upkeep, maintaining ecological balance, and ensuring enough resources exist for sustainability. Those chinjugami that guard abandoned spaces are suspicious of strangers, often believing them to be interlopers that might try to reclaim the area only to forsake it again. A typical chinjugami is about 40 feet tall.
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* N Huge outsider (extraplanar)
* ''Init'' +2; ''Senses'' all-around vision, [[darkvision]] 60 ft.; ''Perception'' +13
* ''Aura'' technological disruption (60 ft.)
DEFENSE
* ''HP'' 90; ''RP'' 4
* ''EAC'' 18; ''KAC'' 20
* ''Fort'' +10; ''Ref'' +8; ''Will'' +5
* ''Defensive Abilities'' [[ferocity]]
* ''Weaknesses'' [[vulnerable]] to electricity
!!! OFFENSE
* ''Speed'' 40 ft., fly 60 ft. ([[Ex]], average)
* ''Melee'' bite +17 (1d8+11 S; critical [[bleed]] 1d6) or tentacle +17 (1d8+11 B plus [[grab]])
* ''Space'' 15 ft.; ''Reach'' 15 ft.
!!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' +3; ''Int'' –3; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +13, [[Stealth]] +13, [[Survival]] +18
* ''Other Abilities'' phase through, [[spaceflight]], [[void adaptation]]
!!! ECOLOGY
* ''Environment'' any vacuum
* ''Organization'' solitary or audience (2–6)
!!! SPECIAL ABILITIES
''All-Around Vision ([[Ex]])'' A chirosepia sees in all directions at once and can’t be flanked.
''Phase Through ([[Su]])'' A chirosepia can momentarily shift out of phase with reality. As a full action, a chirosepia can spend 1 Resolve Point to move through up to 15 feet of solid matter. If it attempts to phase through something that’s too thick, the attempt fails, but its Resolve Points are still expended. A chirosepia can’t phase through force effects such as force fields.
''Technological Disruption ([[Su]])'' Chirosepias constantly emit a silent pulse that disrupts technology. While a creature is inside the aura, attacks made using weapons without the [[analog]] trait take a –1 penalty to attack and damage rolls. Armor with environmental protections expends 1 hour of that protection for every round a creature remains in the aura. [[Computers]] and [[Engineering]] checks to operate technology take a –1 penalty, and the bonus granted by any technological item to skill checks decreases by 1. In addition, the Hit Points provided by technological shields and force fields are reduced by 5 (to a minimum of 0). The effects of multiple technological disruption auras don’t stack.
</div>
Looking out their starship’s viewports during a jaunt through the Drift, a crew member or passenger might catch a glimpse of a passing chirosepia—an oblong creature half as large as a tiny starship, with 20 writhing appendages unfurling from a tri-paneled beak. Dozens of bulbous, unblinking visual sensors line its powerful tentacles. Veteran travelers call these creatures drift krakens, a term generally hated among the scientific community for its luridness and imprecision.
Through dissection and study, xenobiologists discovered that chirosepias were modified at a genetic level through exposure to the ambient energies existing in pockets of the Drift. Their closest genetic relative is the [[ksarik]]. In order to store breathable air for long periods in the vacuum of the Drift, chirosepias inflate specialized organs with oxygen, which they then process with their unique respiratory systems.
Some adventurers hunt chirosepias for sport, but the enormous creatures make difficult prey. Technological malfunctions occur frequently around them, and their prehensile appendages and serrated beaks can wreak havoc on a hull. Most chirosepias, though, flee when attacked, phasing though their assailants to confuse them.
The serrated, sweeping blade of a chitinblade is based on technology recovered from encounters with the Swarm. The source material can come from a natural part of a creature's body, but the final weapon is detached and wielded with two hands. A tactical chitinblade is modeled on an animal counterpart with little modification, but high-tech materials and manufacturing improve on nature in the microserrated, nanoserrated, and ultraserrated models.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|chitinblade, tactical | 4 | 1,890 | 1d6 S | [[bleed]] 1d6 | 1 |[[analog]] |
|chitinblade, microserrated | 9 | 12,400 | 4d4 S | [[bleed]] 2d4 | 1 |[[analog]] |
|chitinblade, nanoserrated | 13 | 46,400 | 4d8 S | [[bleed]] 2d8 | 1 |[[analog]] |
|chitinblade, ultraserrated | 17 | 219,000 | 8d8 S | [[bleed]] 3d8 | 1 |[[analog]] |
</div>
Your protective plates can better shield nearby allies.
''Prerequisites:'' [[Bulwark]] species trait
''Benefit:'' When you use your [[bulwark]] species trait to grant an ally a bonus to AC, you grant a +5 bonus to AC against ranged attacks and a +1 bonus to Reflex saving throws when providing soft cover to allies until the beginning of your next turn.
''Normal:'' Soft cover provides a +4 bonus to AC against ranged attacks and no bonus to Reflex saves.
The //Choir Stone// is a unique solarian weapon crystal: a small, unobtrusive lump of rock that resembles a faceted sphere of smoky quartz. In truth, the //Choir Stone// is one of the deadliest weapons a solarian can use and an insidious trap for inexperienced practitioners.
The //Choir Stone// was first used thousands of years ago by the Kasathan warrior-sage Mirseli Vozhariska Kiari of House Polsian on Kasath. Many legends have arisen about Mirseli's life that today manifest in scholarly analyses, pop-history biographies, and a moderately successful holo series. Mirseli was an advisor to doyens and generals, a duelist who defeated a thousand foes, and a teacher who founded the Cosmonastery of the Silent Chorus on Kasath. When she died, Mirseli's chosen student took the crystal as a sign of their master's favor, taking over Mirseli's cosmonastery and preaching the Cycle their entire life before eventually bequeathing the crystal to a disciple. The crystal passed from hand to hand for centuries while the Cosmonastery of the Silent Chorus developed a reputation for both wisdom and ruthless politics. Following the assassination of its twelfth master, the cosmonastery lost the //Choir Stone//, fell under siege, and disbanded entirely shortly thereafter.
The reason for the cosmonastery's collapse was tied to the //Choir Stone// itself, for the crystal was no mere symbol of office. Mirseli refused to let go of her life and watched over her student as a ghost haunting the smoky crystal. When her student died, they joined their teacher in the stone, so the abbots who led the cosmonastery had a cadre of skilled advisors, powerful even in death. When they lost the crystal, the survivors were unable to fend off the cosmonastery's many enemies.
Each new owner of the //Choir Stone// realized that they had acquired not just a weapon, but a chorus of ghostly mentors. Mirseli (N female ghost kasatha solarian) is the dominant personality within the crystal, quick to offer ruthlessly pragmatic advice on any situation, backed up by her supernatural powers. But Mirseli's views and values come from an earlier, bloodier era of Kasathan history, and she has the ego of one enshrined in legend. Properly motivated, she's a ferocious ally; balked, she is an insidious enemy. The other ghosts in the [[Choir Stone]] aren't quite as forceful, but they have their own skills, specialties, and obsessions. A successful wielder must learn to deal with them all.
Should the //Choir Stone's// wielder die while using the stone, the ghostly vortex inside the crystal draws them in, turning them into one more ghost in the choir unless the dying character succeeds at a DC 35 Will save. The //Choir Stone// follows all the rules for a solarian weapon crystal; it increases damage by +10d4 sonic and has the [[demoralize|Demoralize (critical)]] critical hit effect and the variant [[boost]] (10d4) weapon special property, with a usage of 5/day. If used in a solar manifestation, faint wisps of chill mist surround the //Choir Stone's// wielder and their weapon. On a critical hit, or when using the stone's variant [[boost]] property, the mists take on the faces of the ghosts within: screaming, cursing, or howling in fury and triumph.
If Mirseli's ghost is ever laid to rest, the //Choir Stone// releases all of the spirits trapped within it and shatters forever. However, Mirseli will pass on only if she acknowledges the wielder of the stone as a worthy successor.
''Required Feat:'' [[Improved Combat Maneuver]] (grapple)
Whenever you have an opponent [[pinned]], that foe can't speak or perform actions that involve speaking or uttering sound using their voice (such as roaring, singing, and so on). Normally this prevents the target from using language-dependent abilities unless they have [[limited telepathy]] or a similar ability.
<div class="statblock">
* ''CR'' 8; XP 4,800
* N Large magical beast
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +16
!!! DEFENSE
* ''HP'' 130
* ''EAC'' 19; ''KAC'' 23
* ''Fort'' +12; ''Ref'' +12; ''Will'' +7
* ''Defensive Abilities'' [[void adaptation]]; ''Immunities'' cold, fire
!!! OFFENSE
* ''Speed'' 30 ft., climb 30 ft.; biothruster 200 ft.
* ''Melee'' bite +20 (3d4+14 P)
* ''Ranged'' flame jet +17 (2d6+8 F; critical [[knockdown]])
* ''Space'' 10 ft.; ''Reach'' 10 ft.
!!! STATISTICS
* ''Str'' +6; ''Dex'' +2; ''Con'' +4; ''Int'' –3; ''Wis'' –1; ''Cha'' +1
* ''Skills'' [[Athletics]] +21, [[Physical Science]] +16, [[Piloting]] +16
* ''Other Abilities'' move worlds, [[spaceflight]]
!!! ECOLOGY
* ''Environment'' vacuum
* ''Organization'' solitary, pair, or hive (12–64)
SPECIAL ABILITIES
''Biothruster ([[Ex]])'' A chomurk can fly as a full action at the listed speed. It must move in a straight line while flying in this way, and it can use the [[Piloting]] skill instead of [[Acrobatics]] to fly in difficult or dangerous conditions.
''Flame Jet ([[Ex]])'' A chomurk can use its biothruster as a ranged weapon with the [[line]] and [[unwieldy]] weapon special properties and a total range of 40 feet. Though the jet of flame deals fire damage, it is also treated as having the [[force]] descriptor.
''Move Worlds ([[Su]])'' A hive of at least 32 chomurks can meld their bodies together in a unique metamorphosis that amplifies their natural thruster abilities. Chomurks combined in this manner dissolve and merge their limbs in a process that takes 1 hour, creating a pyramidal mound of bodies that acts as a single huge thruster capable of altering the orbit of the asteroid, space station, ship, or similarly sized astronomical body upon which it resides. Chomurks combined in this manner become a single entity, but are otherwise [[helpless]] and rely on nonmerged chomurks to defend them.
</div>
Sometimes called "sunchasers," chomurks are known for their unique, dangerous life cycle. When a chomurk first lands on an asteroid, space station, or similarly small astronomical body, it immediately begins devouring anything it can find, preferring organic matter but eating metals or stone if necessary. If provided with sufficient material, it can reproduce asexually in a matter of hours, giving birth to a clone that grows to adult size in a day. The hive continues to mindlessly eat and reproduce, at which point some individuals begin melding their bodies together to create a "thruster-mound." Guarded by nonmerged chomurks, the thruster-mound begins pushing the celestial object into a decaying orbit toward the nearest sun at exceptional speeds. As they approach the star, the nonmerged chomurks absorb solar radiation that both empowers and mutates them, creating genetic diversity. At the last minute, those chomurks launch themselves off their temporary home, scattering back out into space, where they hibernate until running across a new object and beginning the process again. Those chomurks incorporated into the thruster-mound are willingly sacrificed in the fires of the sun—along with any remaining residents of the hijacked celestial body.
Chomurks resemble 8-foot-long, 2,000-pound isopods, with colorful articulated shells and two sets of mandibles arranged in a cross shape. A ridge running down their back ends at a cylindrical protrusion with a rear-facing orifice—this is their biothruster, capable of releasing astonishingly powerful blasts of focused flame and force. With little intelligence, chomurks instinctively organize toward a collective goal, willingly sacrificing themselves for the good of the hive.
The first step in casting a spell is to choose which spell to cast. Your class's Spells section describes which class's spell list you can choose from, how to determine the number of spells you know, and at which levels you can learn new spells. You also might know spells from a different source, in which case that source provides the details you need to know.
When you cast a spell, you can select any spell you know, provided you are capable of casting spells of that level or higher. Casting a spell counts against your daily limit for spells you cast of that spell level (your "spell slots"), but you can cast the same spell again if you haven't reached your limit. For more information on how to choose which spells your character can access, see your class's information on spells.
Resembling an electric guitar or other technological stringed instrument, a chordpocalypse is a fully functional musical instrument designed to channel destructively musical blasts. A musician who attacks by building up to a devastating power chord can be just as deadly if they launch a nonstop acoustic barrage that overwhelms the target.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|chordpocalypse, thunderstrike | 2 | 765 | 1d6 So | 30 ft. | [[deafen]] | 20 charges | 1 | 1 |[[boost]] (1d4), [[polarize]] (1d4), [[professional]] (musician) |
|chordpocalypse, shattering | 6 | 4,280 | 1d8 So | 30 ft. | [[deafen]] | 20 charges | 1 | 1 |[[boost]] (1d6), [[polarize]] (1d6), [[professional]] (musician) |
|chordpocalypse, psychedelic | 10 | 18,400 | 2d8 So | 30 ft. | [[deafen]] | 40 charges | 2 | 1 |[[boost]] (1d8), [[polarize]] (1d8), [[professional]] (musician) |
|chordpocalypse, banshee | 14 | 72,000 | 4d8 So | 30 ft. | [[deafen]] | 40 charges | 2 | 1 |[[boost]] (2d6), [[polarize]] (2d6), [[professional]] (musician) |
|chordpocalypse, transcendent | 18 | 372,000 | 7d8 So | 40 ft. | [[deafen]] | 80 charges | 2 | 1 |[[boost]] (2d8), [[polarize]] (2d8), [[professional]] (musician) |
</div>
A chorister is a wireless microphone that, when activated, channels a singer’s voice into a powerful weapon. Before the Gap, Desna gifted magical choristers to five of her most talented and devout followers. The glamorous group of starsingers used Desna’s gifts to defend their home worlds. The original chorister artifacts were lost long ago, but today’s imitations amplify the voices of daring performers who want to be part of the action.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|chorister, warbler | 2 | 895 | 1d4 So | 40 ft. | [[knockdown]] | 20 charges | 1 | L |[[boost]] 1d4, [[professional]] (musician) |
|chorister, harmonist | 6 | 4,400 | 1d8 So | 40 ft. | [[knockdown]] | 20 charges | 1 | L |[[boost]] 1d6, [[professional]] (musician) |
|chorister, chanteuse | 10 | 18,200 | 2d8 So | 40 ft. | [[knockdown]] | 40 charges | 2 | L |[[boost]] 1d8, [[professional]] (musician) |
|chorister, intoner | 14 | 76,500 | 4d8 So | 60 ft. | [[knockdown]] | 80 charges | 2 | L |[[boost]] 2d6, [[professional]] (musician) |
|chorister, diva | 18 | 380,000 | 6d8 So | 60 ft. | [[knockdown]] | 80 charges | 4 | L |[[boost]] 2d8, [[professional]] (musician) |
</div>
<div class="statblock">
* ''Level'' 4–20
* Large undead
* ''Senses'' [[darkvision]] 60 ft.
* ''Good Save'' Will; ''Poor Saves'' Fort, Ref
* ''Speed'' 35 ft.
* ''Defensive Abilities'' [[undead immunities]]
* ''Melee Attack'' bite (P) or tail (B)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Ability Modifiers'' Str, Cha
!!! SPECIAL ABILITIES
''Crumbling Embrace ([[Ex]])'' When reduced to 0 Hit Points by a melee attack, a chostolichi entangles the attacker until the end of the attacker's next turn unless it succeeds at a Reflex saving throw (DC = 10 + 1-1/2 × the chostolichi's level).
''Draining Bite ([[Su]])'' Once per hour when it damages a living significant enemy with its bite attack, a chostolichi can absorb part of the target's vital essence, restoring a number of Hit Points equal to one-tenth the chostolichi's maximum HP.
</div>
Reanimated from several smaller bodies and fused into a vaguely saurian shape, chostolichi servitors develop a pack mentality that desperately seeks a leader.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
<<section 'Young Adult Blue Dragon'>>
Chromatic dragons are often evil, indulging in machinations that benefit themselves or destroy their enemies.
Dragons in the Drakelands of Triaxus enjoy positions of rulership (often as CEOs) over the second-class humanoid citizens. Inveterate schemers, Triaxian dragons are always thinking ahead, and the risks involved in working for these dragons are matched only by the potential for lavish rewards.
<$list filter="[tag[Chromatic Dragon Template Grafts]]">
<$macrocall $name="collapse" tiddler={{!!title}}/>
</$list>
This set of loosely fitted bands worn across the torso sparkles faintly with crystallized matter from the Dimension of Time. The harness counts as a worn magic item unless you install it in light armor, taking up one upgrade slot. You can spend 1 Resolve Point to reroll your initiative check after seeing the result and use whichever of the two results is higher. Each time you activate the harness per day, the Resolve Point cost increases by 1, cumulatively.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//chronal harness// | 6 | 4,650 | L |
</div>
Once per day you can spend 2 Entropy Points as a full action to take a 10-minute rest to recover Stamina Points, gaining all the normal benefits and following the normal restrictions for such a rest (including the ability to spend 1 Resolve Point to recover Stamina Points) except for the time expended. This rest does not decrease the duration of ongoing effects. For each additional 2 Entropy Points you spend when activating this ability, you can grant its effects to one additional willing creature within 15 feet of you.
This fitted white and silver carbon fiber suit houses a crystalline network of energy conduits that can displace the wearer forward in time. When you activate the suit as a standard action, choose a number of rounds between 1 and 10. You disappear completely for that many rounds, after which you reappear in the same place and position as if no time had passed at all. The suit does its best to account for movement and relativity, so even if you were riding in a moving vehicle when you disappeared, the suit tries to return you to your seat rather than depositing you in the empty space the vehicle occupied when you activated the device. If your space is occupied when you return, the suit shunts you to the nearest open space that can accommodate you, dealing 1d6 damage to you for every 5 feet it has to shift your destination.
While disappeared, you cannot be harmed or detected by mundane or magical means, as if you had ceased to exist.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|chrono jumper suit | 13 | 53,500 | 1 | 40 | 40 |
</div>
<div class="statblock">
* <<levels>>
* ''School'' conjuration
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' one creature
* ''Area'' see text
* ''Duration'' instantaneous
* ''Saving Throw'' Reflex half, see text
* ''Spell Resistance'' yes
</div>
You rocket the target forward through time, sending them careening across the battlefield. You move the target up to 60 feet in a straight line. This movement doesn’t provoke attacks of opportunity. The target can attempt a Reflex saving throw to prevent this movement and negate the additional effect below. At the end of this movement, the creature reenters the flow of time with a burst of temporal energy. Creatures adjacent to the target take 4d6 bludgeoning damage and are knocked [[prone]]. A creature in this area that succeeds at a Reflex saving throw takes only half damage and isn’t knocked prone.
Powers with a vested interest in the flow of time have given some of their influence to you. Perhaps the fey Eldest Shyka has empowered you to avert some unknowable future timeline. Maybe, sometime in the distant past, a servant of Pharasma seeded such potency in the bloodline of one of your ancestors. You might have discovered some ineffable insight into space-time that allows you to perform supernatural feats. Whatever your connection with time, it is something granted by another power, and that power fuels you with magical energy that grants you greater control over time.
''Focal Paradox:'' Caster level checks and one class skill (chosen at 1st level).
''Improved Anchor:'' Once per day as a swift action, you can slow time immediately around yourself until the end of your turn. For the duration, adjacent enemies that attempt reactions must succeed at a Reflex saving throw or lose the action.
''Greater Anchor:'' Once per day, you can cast any spell you know that has a casting time of a standard action or less as a full action instead. After you successfully cast this spell, you can cast a second spell without taking an action (though it still uses a spell slot). The second spell must have a casting time of a standard action or less and be of a level no greater than the level of the first spell you cast minus 2. If you cast the second spell, you lose your standard action on your next turn.
You can execute precisely timed moves that help you and others dodge incoming attacks. As a reaction when an attack is declared but before the result is known, you can use a paradox to grant an ally an insight bonus to AC until the end of your next turn. This bonus is equal to the paradox result or a maximum bonus of +2, whichever is lower. The maximum bonus increases to +3 at 7th level, +4 at 13th level, and +5 at 18th level.
Through your knowledge of time’s flow, you can cast your spells with the exact timing necessary for maximum effect. As a swift action, you can use a paradox to increase the save DC on a spell you cast during your turn. This increase is equal to the paradox result or a maximum bonus of 1, whichever is. lower. The maximum bonus increases to 2 at 16th level and 3 at 19th level.
<div class="statblock">
* <<levels>>
* ''School'' conjuration
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Effect'' change the chemical composition of up to 1 bulk of fluid/level; see text
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You merge a tiny corner of parallel realities with this one, subtly or dramatically shifting the chemical composition of a fluid. You can target any type of fluid, and you need not know its current composition. You must be able to see the liquid or the receptacle that holds it, or this spell fails and is lost. You must also target an entire body of fluid, rather than only part of it. If you target an amount of fluid that is too large for you to change entirely, the spell fails and is lost.
When you target fluid in this way, you can turn it into potable water, salt water, mildly corrosive acid or base, blood, or any other nontoxic, non-damaging fluid with no other game effects. After 1 day, if unused in its changed state, the fluid reverts to its original state. In so doing, the reverting fluid cannot cause harm.
Designed for the fighting elite of Sarenrae, cinder rifles are similar to most jacketed rifles, but within the framework of the gun, the ammunition becomes superheated. The result is a bullet exiting the gun while white hot, tracing its path through the air with a bright trail.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|cinder rifle, truth-sequence | 2 | 700 | 1d8 P | 60 ft. | [[burn]] 1d6 | 10 rounds | 1 | 2 |— |
|cinder rifle, salvation-sequence | 7 | 6,000 | 2d8 P | 60 ft. | [[burn]] 1d6 | 14 rounds | 1 | 2 |— |
|cinder rifle, valor-sequence | 11 | 23,700 | 3d8 P | 80 ft. | [[burn]] 2d6 | 20 rounds | 1 | 2 |— |
|cinder rifle, glory-sequence | 15 | 102,200 | 6d8 P | 80 ft. | [[burn]] 2d6 | 24 rounds | 1 | 2 |— |
</div>
<div class="statblock">
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 19
* ''Track'' [[Strength|Strength Poison Track]]
* ''Frequency'' 1/round for 6 rounds
* ''Effect'' This acidic poison is specifically formulated to also be effective against constructs.
* ''Cure'' 2 consecutive saves
</div>
<div class="table-wrapper">
|Substance | Level | Price |h
|circuit melter | 12 | 8,000 |
</div>
<div class="statblock">
* ''Tier'' 19
* Supercolossal base ship
* ''Speed'' 6; ''Maneuverability'' clumsy (turn 4); ''Drift'' 1
* ''AC'' 26; ''TL'' 30
* ''HP'' 750; ''DT ''15; ''CT'' 150
* ''Shields'' superior 600 (forward 150, port 150, starboard 150, aft 150)
* ''Attack (Forward)'' antimatter mega-missile launcher (4d10×10; 0 hexes), maser (6d10; 20 hexes)
* ''Attack (Port)'' maser (6d10; 20 hexes)
* ''Attack (Starboard)'' maser (6d10; 20 hexes)
* ''Attack (Aft)'' maser (6d10; 20 hexes)
* ''Attack (Turret)'' heavy laser net (5d6; 5 hexes), shadow bolt array (1d10×10; 10 hexes), supermaser (2d8×10; 20 hexes)
* ''Power Core'' Titan Ultra (1,200 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' advanced long-range sensors, crew quarters (good), mk 6 armor, mk 10 defenses, mk 5 mononode computer with 3 mk 5 network nodes; ''Expansion Bays'' [[brigs]] (4), [[cargo holds]] (25), [[Drift shadow projector]], general [[science lab]], [[guest quarters]] (luxurious), [[hangar bays]] (3), [[life boats]] (3), [[medical bay]], [[recreation suite]] (gym), [[sealed environment chambers]] (2)
* ''Modifiers'' +2 to any 4 checks per round, +4 [[Computers]] (sensors only), –1 [[Piloting]]
* ''Complement'' 11,660 (minimum 4,000, maximum 100,000)
!!! CREW
* ''Captain'' [[Bluff]] +32 (19 ranks), [[Diplomacy]] +32 (19 ranks), [[Intimidate]] +37 (19 ranks), [[Piloting]] +32 (19 ranks)
* ''Engineers (4 officers, 2,250 crew each)'' [[Engineering]] +32 (19 ranks)
* ''Gunners (6 officers, 120 crew each)'' gunnery +28 (19th level)
* ''Pilot (1 officer, 425 crew)'' [[Piloting]] +32 (19 ranks)
* ''Science Officers (3 officers, 500 crew each)'' [[Computers]] +32 (19 ranks)
!!! SPECIAL EQUIPMENT
''Orbital EMP'' Citadel Zirval maintains an extraordinary EMP weapon that can blast a 3-mile radius from high orbit as though it were a capital-class orbital weapon. This disables lights, non-analog technological equipment, and computers that are tier 4 and lower, though not larger defenses or starships. The effect also dampens communications infrastructure, limiting their maximum range to 3 miles. The effect lasts for 1d3 hours.
</div>
Those who broadcast propaganda that incites rebellion attract the Hellknight Order of the Eclipse, which has dedicated itself to quashing destabilizing messages in an environment of limitless communication. Hellknights aboard smaller vessels can, when orbiting over a communications center, scramble the Drift correspondence of satellites and even large settlements. But when a metropolis, space station, or entire nation is complicit in spreading chaos, //Citadel Zirval// itself might arrive, blocking out the system's star- and radio-waves alike with its miles-wide bulk.
//Citadel Zirval// was designed in the haunting aesthetic of an ancient Hellknight fortress, with thousands of rooms, hallways, training facilities, interrogation chambers, and more. At any time, it sustains 5,000 or more armigers in training, plus unknown thousands of Hellknights ready to deploy across the galaxy.
The current //Citadel Zirval// is new, rebuilt after the Swarm destroyed it during the Battle of Stalendre-2. The Hellknight operation disrupted the Swarm's telepathic coordination, allowing a Veskarium fleet to devastate that force, but the citadel fell to a counterattack. This second //Citadel Zirval// has operated for 12 years since, and thanks to its predecessor's sacrifice and the Hellknights' ongoing assistance in quashing dissent, the Order of the Eclipse enjoys impunity and outright welcome in much of Veskarium space.
<div class="statblock">
* <<levels>>
* ''School'' divination (scrying)
* ''Casting Time'' 10 minutes
* ''Range'' long (400 ft. + 40 ft./level)
* ''Effect'' magical sensor
* ''Duration'' 1 minute/level (D)
* ''Saving Throw'' none;
* ''Spell Resistance'' no
</div>
You create an invisible magical sensor at a specific location that enables you to hear or see (your choice) almost as if you were there. You don't need line of sight or line of effect to create this sensor in a specific spot within range, but the locale must be either a place that's familiar to you or an obvious location, such as inside a cave whose entrance you can see.
The sensor doesn't move, but you can rotate it in all directions to view the area as desired. This spell functions only on the plane of existence you are currently occupying.
A class graft begins with a brief description of the class and then moves on to the following sections.
* ''Special Rules:'' If the graft requires some tinkering beyond the normal rules for class grafts, the graft has a special rules entry describing it.
* ''Required Array:'' This entry lists which array an NPC has to use to receive the class graft.
* ''Adjustments:'' These adjustments change some of the statistics provided by the array.
* ''Skills:'' The class graft might also list skills, categorized as master or good, that count toward the skills granted by the NPC's array.
* ''Ability Score Modifiers:'' This lists the ability score modifiers that are usually highest for this class. They're in order from highest to lowest, but you can mix them up as you see fit.
* ''Gear:'' Most NPCs with class grafts use gear rather than relying on natural attacks. This entry gives guidelines for assigning weapons, armor, and other significant equipment to members of the class, listing the level of the gear. Gear has a minimum level of 1 and a maximum level of 20. For example, if a creature's CR is 1/2 or if the creature's CR is 1 and the graft suggests an item of "CR – 1," you would give it level 1 gear. You can skew the creature's gear by a few levels, though you might need to make other adjustments to its statistics if you do so.
* ''Abilities by CR:'' Depending on the NPC's CR, it gains a certain number of class features from the chosen class and potentially some special abilities of your choosing; these replace the special abilities the creature receives from the array. The NPC's CR corresponds to its effective class level, so a CR 3 creature would be a 3rd-level mechanic.
Apply the abilities from the entry that matches your NPC's CR or the next-lowest CR. For instance, if you are creating a CR 4 NPC and the class graft lists abilities for only CR 3 and CR 5, use the CR 3 entry. Apply only one CR entry. Class features that have a DC use the ability DC from the NPC's array, or you can use the base spell DC if you prefer.
Usually, a class graft gives an NPC more options than it would normally get from the array. Still, if there are special abilities your NPC absolutely needs, you can add them in. Just be careful not to make your NPC too powerful for the CR you chose.
When you pick a class feature that improves another class feature, the NPC is assumed to also have all the prerequisites. For example, if you took quick inspiring boost for a CR 4 envoy, the NPC would be considered to have inspiring boost as well. If a class feature option has a level requirement, you can pick one from the lower-level set of options if you so choose. For instance, if a class graft grants a 6th-level operative exploit, you can choose a 2nd-level operative exploit instead.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
<<tabs "[contains:tab[Classes]sortby{Classes!!list}]" "$:/state/tabIndex" "Index Template">>
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* NG Medium outsider (agathion, extraplanar, good)
* ''Init'' +3; ''Senses'' [[low-light vision]]; ''Perception'' +13
* ''Aura'' conservation aura (20 ft.)
!!! DEFENSE
* ''HP'' 90; ''RP'' 4
* ''EAC'' 18; ''KAC'' 20
* ''Fort'' +8; ''Ref'' +8; ''Will'' +5; +4 vs poison
* ''Immunities'' electricity, petrification; ''Resistances'' cold 10, sonic 10
!!! OFFENSE
* ''Speed'' 30 ft., climb 20 ft.
* ''Melee'' //[[holy]] enforcement-class [[capture pole]]// +17 (1d8+10 P; critical [[injection DC +2]]) or bite +17 (1d8+10 P)
* ''Space'' 5 ft.; ''Reach'' 5 ft. (10 ft. with capture pole)
* ''Offensive Abilities'' preserver's patience
!!! STATISTICS
* ''Str'' +4; ''Dex'' +3; ''Con'' +3; ''Int'' +0; ''Wis'' +2; ''Cha'' +1
* ''Skills'' [[Athletics]] +18, [[Culture]] +13, [[Survival]] +18
* ''Languages'' Celestial, Common; speak with animals, [[truespeech]]
* ''Other Abilities'' [[healing channel|Healer]] (6d8)
* ''Gear'' //[[holy]] enforcement-class [[capture pole]]//, //mk 2 [[healing serum]]//
!!! ECOLOGY
* ''Environment'' any urban (Nirvana)
* ''Organization'' solitary or patrol (2–5)
!!! SPECIAL ABILITIES
''Conservation Aura ([[Su]])'' A claustral's aura preserves imperiled natural creatures. Creatures with the animal or plant type within this aura gain [[fast healing]] 2. This fast healing doubles for affected creatures that are below half their maximum Hit Points or that are in an urban environment. If an affected creature would be reduced to 0 Hit Points by an effect the claustral can see, the claustral can spend 1 Resolve Point as a reaction to reduce the damage dealt to that creature by the effect by 6d6. A claustral can suppress the aura's effects for any number of those animals and plants as a free action.
''Preserver's Patience ([[Ex]])'' A claustral can choose to deal nonlethal damage with any of its attacks against animals and plants without taking a penalty. A claustral gains a +2 bonus to attack rolls to resolve [[grapple|Grapple (combat maneuver)]] and [[trip|Trip (combat maneuver)]] combat maneuvers, and this bonus doubles against animals and plants.
''Speak with Animals ([[Su]])'' can communicate with animals and use language-dependent effects on them.
</div>
Maned claustrals resemble the predatory [[eohis]] of the Nejeor system, expressing much of eohis' love of pursuing and hounding their targets. However, claustrals almost never hunt to kill, instead patrolling cityscapes to protect their adopted fauna or neutralize deadly beasts. Although they take pains to warn negligent urbanites who inadvertently harm animals, claustrals often respond with violence to subdue or even kill serial abusers, such as those who run beast-fighting circuits. To claustrals' chagrin, these brief rampages can spur rumors of an escaped beast, attracting bounty hunters who hope to slay the mysterious creature.
Wearing white clothes means keeping them clean. This circuitry blends into your clothing and works to ensure that your outfit looks pristine even when it isn't and cleans itself as fast as possible. //Cleanliness circuits// work by breaking up any substance that has attached to the clothing. If there's more material than can be cleaned immediately, then a secondary feature removes the pigment from the material so that it at least blends in with the white clothing.
//Cleanliness circuits// can be combined with //[[defensive threads]]// and //[[sense silk]]// in a single outfit (paying each cost separately), and such an outfit counts as only one worn hybrid item.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//cleanliness circuits// | 1 | 50 | — |
</div>
Organic sacs implanted within your lungs cause you to exhale airborne antibodies and antitoxins. You and creatures breathing the same air within 30 feet of you can roll twice on saving throws against diseases and poisons and take the higher result.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|cleansing breath | 18 | 342,000 | lungs |
</div>
This //aeon stone// sustains you by negating the need for food or water.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//clear spindle// | 1 | 245 | — |
</div>
Those who explore environments obscured by fog, foliage, smoke, and other vision-impairing elements value clearsight goggles, a set of tight-fitting eyewear that can be worn under a helmet or even other eyewear. While you wear the goggles, fog, smoke, and similar gases don't grant targets concealment from you, and vegetation doesn't either. The trinket provides no benefit against a target with total concealment.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|clearsight goggles | 5 | 2,750 | — | 40 | 1/hour |
</div>
The formfitting fabric of clearweave light armor is completely transparent to better display the fashion choices beneath it. Discrete force field generators along each side resemble intricate tattoos as much as they resemble circuitry. Clearweave darkens automatically when exposed to harmful solar radiation or laser fire.
Clearweave II contains built-in microprojectors that allow the wearer to display glowing patterns, simple art, and even icons and logos through the armor's fabric. These displays can be controlled via a personal comm unit or a more advanced computer. The glow emitted by the suit when displaying such patterns isn't bright enough to provide useful illumination, but it does reveal the wearer's position in darkness or dim light.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br>Bonus | KAC<br>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br>Slots | Bulk |h
|clearweave I | 3 | 1,350 | +3 | +3 | +5 | — | — | 0 | L |
|clearweave II | 9 | 13,150 | +12 | +12 | +5 | — | — | 2 | L |
</div>
You can strike two adjacent foes with a single swing.
''Prerequisites:'' Str 13, base attack bonus +1.
''Benefit:'' As a standard action, you can make a single melee attack against a foe within reach. If you hit, you deal damage normally and can make an additional melee attack (using your full base attack bonus) against a foe that is adjacent to the first and also within reach. You can make only one additional attack per round with this feat. When you use this feat, you take a –2 penalty to your Armor Class until your next turn.
When you [[divert]] power to your starship's weapons, the weapons trigger secondary flares and explosions. The first time an affected weapon hits an enemy starship this turn, the gunner can also damage a second target in a hex adjacent to the primary target. This secondary damage equals the weapon's minimum damage.
You can make an attack that throws your enemy off-balance. As a standard action, you can make a single attack against a target within 60 feet and gain the benefits of [[clever feint]] (attempting a [[Bluff]] check against the target as normal). Apply the effects of clever feint before resolving your attack. You must have the clever feint envoy improvisation to choose
this improvisation.
As a standard action, you can fake out an enemy within 60 feet, making that enemy open to your attacks. Attempt a [[Bluff]] check with the same DC as a check to feint against that enemy (though this isn't a standard check to feint, so [[Improved Feint]] and [[Greater Feint]] don't apply). Even if you fail, that enemy is [[flat-footed]] against your attacks until the end of your next turn. If you succeed, the enemy is also flat-footed against your allies' attacks until the end of your next turn. You can't use clever feint against a creature that lacks an Intelligence score.
At 6th level, you can spend 1 Resolve Point to treat a failed Bluff check for clever feint as if it were a success.
This is a sense-dependent effect.
The first time you would spend Resolve Points on one of your envoy improvisations, reduce the cost by 1 Resolve Point (minimum 0). This ability refreshes whenever you take a 10-minute rest to recover Stamina Points and after an 8-hour rest to recover Resolve Points, reducing the Resolve Point cost of your next envoy improvisation after the rest.
You always have a witty remark or comeback ready at your adversaries’ expense.
''Prerequisites:'' Int 13, [[Quick Quip]], [[Diplomacy]] 5 ranks
''Benefit:'' You can use [[Quick Quip]] as a reaction whenever one of the following occurs:
* an opponent within 30 feet attempts an attack roll and misses
* an opponent within 30 feet attempts a skill check and fails
* you or an ally within 30 feet succeed at a saving throw against an opponent’s effect.
You must use your Quick Quip against the opponent who triggered your use of this ability or whose ability you successfully saved against.
You can use stunt and strike to withdraw rather than press the offensive. You can move up to twice your speed, and your actions don't trigger reactions until the start of your next turn. When using stunt and strike in this way, you can't attack as part of the action, nor can you cause foes to become [[flat-footed]].
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one creature
* ''Duration'' 1 hour
* ''Saving Throw'' Will negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
You tweak a creature’s genetic code, altering its environmental adaptations to better suit the surrounding climate. For the duration, the target reduces the severity of dangerous temperatures by one step. For example, cold is reduced to comfortable, while extreme heat is reduced to severe heat. //Climate adaptation// can protect the target from either cold or heat but not both simultaneously.
This upgrade is used primarily on long expeditions into hostile environments. You treat your armor as 3 levels higher for the purposes of determining the duration of its environmental protections and resisting radiation.
<div class= "table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk | Capacity | Usage |h
|climate control unit | 4 | 1,950 | 1 | light, heavy | L | — | — |
</div>
As part of a move action, you can use Athletics to climb up, down, or across a slope, a wall, or another steep incline. You can even climb on a ceiling, provided it has handholds, but you cannot climb on a perfectly smooth surface. On a successful check, you move at half your land speedSpeed across such a surface. If you fail the check by 4 or less, you make no progress. If you fail by 5 or more, you fall. You can't take 20 on an Athletics check to climb. You need at least two hands to climb, but you can cling to a wall with one hand while you cast a spell, shoot a small arm, or take some other action that takes only one hand. While climbing or clinging to a wall, you are flat-footed. If you have a climb speed, you receive a +8 bonus to Athletics checks to climb and don't need to attempt Athletics checks to climb except in hazardous circumstances.
The DCs for Athletics checks to climb are based on the object being climbed, but can also be adjusted based on environmental circumstances such as gravity, winds, and surface conditions. Such modifiers are cumulative; use all that apply.
<div class="table-wrapper">
|Object Being Climbed | DC |h
|@@.constrained A slope of more than 45 degrees, a ladder, or a knotted rope with a wall to brace against@@ | 5 |
|@@.constrained An unknotted cable or rope with a wall to brace against, or a knotted rope without a wall to brace against@@ | 10 |
|@@.constrained A rough surface or a wall with adequate handholds, like a natural rock surface, a cavern wall, or an artificial wall with cabling@@<div>An unknotted cable or rope without a wall to brace against</div><div>A ledge from which you are dangling by your hands</div> | 15 |
|An uneven surface with narrow handholds, like a stone or 20 brick wall | 20 |
|@@.constrained A relatively smooth surface with occasional handholds, like a space station wall or an ice wall@@ | 25 |
|An overhang or a ceiling with handholds only | 30 |
|A perfectly smooth surface | — |
|Circumstance | DC Modifier |h
|Bracing against two opposite walls | -10 |
|Climbing a corner or bracing against perpendicular walls | -5 |
|Climbing in zero or low gravity | -5 |
|Climbing in heavy gravity* | +5 |
|Wet or slightly slippery walls | +2 |
|Icy or severely slippery walls* | +5 |
|Climbing in strong wind (21-30 mph)* | +2 |
|Climbing in severe wind (31-50 mph)* | +5 |
|Climbing in a windstorm (51-74 mph)* | +10 |
|Climbing in hurricane-force wind (75-174 mph)* | +20 |
|Climbing in tornado-force wind (175+ mph)* | +30 |
|* Hazardous circumstance; creatures with a climb speed must attempt a check in these conditions.|<|f
</div>
The //climbing// weapon fusion allows a weapon to grip onto most surfaces, allowing its wielder to climb while holding the weapon. For the purposes of [[Athletics]] checks to [[climb]], a hand wielding a climbing weapon counts toward the two hands needed to climb.
This weapon fusion can be installed only in weapons that require only one hand to wield.
Your drone gains a climb speed equal to half its land speed.
This mod can be applied to only combat and stealth drones.
You can climb as well as a monkey or a spider.
''Prerequisites:'' [[Athletics]] 5 ranks.
''Benefit:'' You gain a climb speed equal to your land speed.
You're able to scramble between stations with incredible speed. When you successfully perform a chief mate action, you can perform a second minor crew action that round.
The soles of your feet become covered in fleshy slats you can open and close, providing you a climb speed of 20 feet. You don't need to attempt [[Athletics]] checks to traverse a vertical or horizontal surface (even upside down). You don't benefit from climbing suckers unless you're barefoot or wearing custom clothing, and you can not be wearing more than light armor. Climbing suckers integrate into your natural feet and do not require you to replace your feet and legs. Climbing suckers can be installed into the feet of [[prosthetic legs|prosthetic limb]].
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|climbing suckers | 3 | 1,200 | all feet |
</div>
A combination of electromagnets, graspers, grav emitters, high-friction grips, or other mechanisms allows this vehicle to climb as though affected by the //[[spider climb]]// spell. This gives the vehicle a climb speed equal to its base speed according to its [[Custom Vehicle Array]].
A vehicle must have a [[type graft|Vehicle Type Grafts]] that grants it a land speed in order to use this modification.
<div class= "table-wrapper">
|Modification | Level | Price |h
|clingers | 10 | 19,000 |
</div>
Your hands are covered with tiny fibers like those on a gecko's toes. You gain a +2 circumstance bonus to your KAC against disarm combat maneuvers and to attacks to perform disarm and grapple combat maneuvers. You can ignore any increase to the DCs of [[Athletics]] checks to climb due to slipperiness, iciness, or heavy gravity. You can't benefit from clinging hands if you are wearing armor or gloves that have not been either tailored or adjusted for you.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|clinging hands | 3 | 1,350 | all hands |
</div>
''Prerequisite:'' The mech must have a recon frame.
Consisting of light-warping and sound-dampening technomagical mechanisms installed just beneath the armor, a cloaker system enhances a mech's ability to avoid notice. The mech gains the ability to attempt [[Stealth]] checks.
''Fade (0 PP)'' As a full action, the mech initiates active camouflage, granting it [[concealment]] until it makes an attack or performs other harmful actions, at which point the effect ends. If the mech begins combat while this ability is active, it begins the encounter with 1 less PP (minimum 1).
''Cloak (4 PP)'' As a standard action, the mech fades from view as per //[[invisibility]]//. The effect lasts for 1 round, though the mech can extend the duration each round by expending 1 PP. The effect ends if the mech makes an attack or performs other harmful actions.
Cloaking technology is not widely available in Near Space, but scientists have developed several systems that enable starships to avoid detection by other starships. Activating a cloaking device takes one action by an engineer while the starship is neither in motion nor engaged in combat. The ship vanishes from view, and based on the cloaking device's level, another ship must have sensors of a minimum level to detect it.
Cloaking technology is named for the maximum quality of sensors that can't detect the cloaked ship. Cut-rate cloaking technology fools only cut-rate sensors; budget cloaking technology fools only cut-rate and budget sensors, and so on. Sensors capable of detecting a cloaked starship can do so only when the cloaked starship has entered the sensor's first range increment. Engaging a Drift engine or thrusters or beginning starship combat immediately negates the cloaking ability, whereupon the ship reappears and can be detected normally.
<div class= "table-wrapper">
|Cloaking Device | PCU | Cost (in BP) |h
|cut-rate | 15 | 10 |
|budget | 25 | 15 |
|basic | 40 | 25 |
|advanced | 75 | 40 |
</div>
<<section 'Gray Cloaking Device' >>
You can bend light around yourself and muffle any minor sounds you make, allowing you to nearly vanish when not moving. Even when you move, you appear only as an outline with blurry features. This cloaking field doesn't make you invisible, but it does make it easier to sneak around. Activating the cloaking field is a move action. While the cloaking field is active, you can use [[Stealth]] to hide, even while being directly observed and with no place to hide. Attacking doesn't end the cloaking field, but it does end that particular attempt to hide. If you remain perfectly still for at least 1 round, you gain a +10 bonus to Stealth checks (which doesn't stack with [[invisibility]]) until you move.
Your cloaking field lasts for up to 10 rounds before it becomes inactive. While inactive, the cloaking field recharges automatically at the rate of 1 round of cloaking per minute.
Many of your pores are replaced with magically regulated and directed holographic projectors that work together to automatically match your surrounding environment, rendering you [[invisible]] per //[[invisibility]]//. Once per day, you can enable your //cloaking skin// as a standard action, turning you invisible for 10 minutes. A //greater cloaking skin// functions as //[[greater invisibility]]//, but the effect lasts for only 10 rounds. You can disable either model of //cloaking skin// as a move action.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|//cloaking skin, standard// | 10 | 18,000 | skin |
|//cloaking skin, greater// | 17 | 270,000 | skin |
</div>
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* N Medium construct (technological)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +13
!!! DEFENSE
* ''HP'' 90
* ''EAC'' 18; ''KAC'' 20
* ''Fort'' +6; ''Ref'' +6; ''Will'' +3
* ''Defensive Abilities'' [[integrated weapons]], overwind; ''DR'' 5/—; ''Immunities'' [[construct immunities]]
* ''Weaknesses'' [[vulnerable]] to sonic
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' slam +14 (1d8+9 B)
* ''Ranged'' [[AG accelerator rifle]] +17 (3d4+6 P)
* ''Offensive Abilities'' clockwork reload
!!! STATISTICS
* ''Str'' +3; ''Dex'' +5; ''Con'' —; ''Int'' —; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +18, [[Athletics]] +13, [[Stealth]] +13
* ''Languages'' Azlanti (can’t speak)
* ''Other Abilities'' [[mindless]], [[unliving]]
* ''Gear'' integrated [[AG accelerator rifle]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, squad (3–8), or troop (10–100)
!!! SPECIAL ABILITIES
''Clockwork Reload ([[Ex]])'' The clockwork guardian reloads its weapons with an integrated system powered by its own movement. When using a move action to move up to its speed, the clockwork guard can also reload its accelerator rifle.
''Overwind ([[Ex]])'' When the clockwork guardian is struck by a critical hit, its interior springs overwind, imposing excessive tension and energy on its system. As a full action before the end of its next turn, the clockwork guardian can wildly spin its torso and limbs, striking all adjacent creatures. This attack deals 1d6+9 bludgeoning damage to each creature (DC 14 Reflex half).
</div>
After leaving the Golarion system and founding New Thespera, the Azlanti who would become the cruel and infamous Star Empire expanded rapidly from their new home world—to quickly supply sufficient personnel to every additional military installation across their solar system. To supplement ground forces, Azlanti engineers built clockwork guardians from precision-cut steel; the designs of these humanoid constructs included keen detection systems and powerful weapons. Just a few human Azlanti troops could hold a new base with the help of a team of clockwork guardians. The conquered people of the Aristia system quickly grew to recognize and fear the distinct sounds of clockwork guardians: an ever-present ticking that grows louder, but never faster, as they prepare for battle.
Powered by Azlanti clockwork, these constructs wind their own springs while moving, making them exceptionally energy-efficient. While nothing can self-power indefinitely, clockwork guardians can remain functional for an extremely long time without external winding. These constructs have visible clockworks and cogs over their entire forms, though with enough resiliency built in so that a single pebble or loose nut doesn’t seize up the entire unit. Clockwork guardians intended for particularly harsh terrains sometimes have shells to protect their inner workings, but many military leaders of the Empire liked the aesthetic of the visible gears and requested such coverings to be made of clear crystal or plastic.
The Azlanti had several advanced models of clockwork guardians, outfitting them with wings, fins, or alternate weapons, depending on the terrain at their areas of deployment. These constructs have uses beyond combat, too. While not intelligent, clockwork guardians can be programmed by Azlanti engineers to carry out simple commands to help construct military bases, weapons, and starships. Such tasks usually included repetitive button-pushing or carrying heavy cargo from one place to another. It’s little surprise that many of the Azlanti Star Empire’s first flights with its early and dangerous faster-than-light drives included many of these expendable guardians as extra crew.
You have a practiced ease with smuggling weapons. You gain a +2 bonus to [[Disguise]] checks to hide the fact that you are wearing armor and to [[Sleight of Hand]] checks to conceal weapons on your body. You can draw a concealed weapon as a move action or, if you have the [[Quick Draw]] feat, as a swift action.
When you are attacking a foe in melee, you know how to maneuver to make it more difficult for other foes to target you.
''Prerequisites:'' Base attack bonus +1.
''Benefit:'' When you hit an adjacent foe with a melee attack, as long as you are adjacent to that target, you gain a +2 circumstance bonus to your AC against attacks from other creatures that are not adjacent to you until the beginning of your next turn.
A //close-quarters serum// provides heightened awareness in combat, so the fluorescent-green concoction is a favorite among mercenaries and other warriors. It's also minty. For 10 minutes after you drink this serum, enemies gain no benefit from flanking you.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//serum, close-quarters// | 7 | 950 | — |
</div>
When a foe provokes an attack of opportunity from you, rather than make a normal melee attack, you can attempt a trip combat maneuver. If you succeed, the enemy ends all its movement for the round and is knocked [[prone]].
Clothing is mass produced throughout the Pact Worlds, and the residents of the system are never wanting for clothes. Clothing is often worn both under and over armor, and its benefits apply in nearly all situations. Clothing comes in several varieties based upon its intended purpose, as described below.
!! Athletic
Athletic wear is usually designed for a specific athletic activity, such as a sport or other physical pursuit. Wearing athletic clothing grants you a +1 circumstance bonus to [[Athletics]] checks to perform the activity that the clothes are designed for.
!! Ceremonial
Ceremonial clothes are worn for both religious and nonreligious ceremonies. Religious ceremonial clothing includes vestments worn by priests while performing their ecclesiastical duties and garments for laypeople involved in religious rites. These vestments are usually decorated with colors and embellishments corresponding to a specific faith or religion and are often worn with a [[religious symbol]]. Nonreligious groups, such as the adata of the //Idari's// Sholar Adat, wear ceremonial clothing for their rituals, with their own unique looks and ornamentations.
!! Couture
Couture clothing is typically one-of-a-kind clothing designed and crafted for a single specific client. Couture style is often ambitious and avant-garde, designed to make the wearer stand out. While wearing couture clothing, you gain a +2 bonus on [[Bluff]], [[Diplomacy]], and [[Intimidate]] checks when interacting with individuals who recognize the value of the garments, as determined by the GM. You also take a –4 penalty on [[Stealth]] checks to blend into a crowd while wearing couture clothing unless the crowd is also wearing similar garb. The listed price is for the cheapest couture clothing. Depending on the talent and reputation of the designer and the clothing materials, the price could be in the tens or even hundreds of thousands of credits.
!! Designer
Designer clothing is associated with a specific designer and tends to be of a higher quality than generic clothing. You can get designer versions of other outfits. This listed price modification is for the cheapest designer clothing, though depending on the brand, the price can rocket into thousands of credits. Wearing a designer version of an outfit confers the same benefit of the base outfit, except any circumstance bonuses to skill checks given by the base outfit are increased by 1 due to the increased quality. Designer clothing has the same bulk as the base outfit.
!! Environmental
Each environmental outfit is designed with a specific climate in mind, and wearing such an outfit in an extreme environmental condition it is tailored for grants a benefit as follows:
* cold climates (+2 circumstance bonus to Fortitude saves against environmental cold dangers)
* dust storms (reduce damage from dust storms with windstorm-magnitude winds by 1)
* extreme gravity (reduce damage from extreme gravity environments by 1)
* heat climates (+2 circumstance bonus to Fortitude saves against environmental heat dangers)
* radiation (+1 circumstance bonus to saving throws against radiation effects)
* zero gravity (+2 circumstance bonus to [[Acrobatics]] or [[Athletics]] checks to stop movement or climb along handholds in zero-g).
The benefit of an environmental outfit can be added to another type of clothing (including a different environmental outfit) by doubling and adding together the price of both types of clothing.
!! Everyday
Clothes designed for everyday wear come in a dazzling array of colors and styles, many of which are tailored to specific cultures or planets. Most characters choose their everyday wear based on their personal preferences.
!! Formal
Formal wear is designed for a specific social function, such as a wedding or funeral, and commonly differs from planet to planet and even from culture to culture. Lacking the proper formal wear at a social event can cause you to take a penalty of up to –4 to [[Bluff]], [[Diplomacy]], and [[Disguise]] checks at the function, as determined by the GM.
!! Party
Party clothes are usually designed for occasions where everyday or professional wear won't do but where formal wear is too fancy. Usually, party wear takes the form of special costumes or unusual dress that one must wear to avoid looking out of place at the engagement. Lacking the proper party wear at a social event can cause you to take a penalty of up to –4 to [[Bluff]], [[Diplomacy]], and [[Disguise]] checks at the function, as determined by the GM.
!! Professional
Each set of professional wear is tailored to the tasks of a specific [[Profession]] skill and accommodates the needs of its wearer while also conveying an air of expertise and professionalism. You gain a +1 circumstance bonus to Profession checks to earn a living while wearing an appropriate professional outfit.
!! Reconfigurable
Reconfigurable clothing is constructed of specialized nanofibers that allow the clothing to shift between one or more outfits at your signal, such as clicking your heels together, speaking a command word, or twirling in place. As a move action, you can change your clothing from its current configuration to another outfit incorporated into the clothes. When you purchase reconfigurable clothing, choose one or more outfits to incorporate into your clothes. A single outfit of reconfigurable clothing can hold up to five other outfits of clothing. The cost for an outfit of reconfigurable clothing is 100 credits plus the cost of all outfits incorporated into the clothing.
!! Travel
A travel outfit offers additional comfort and support during overland travel. You add 2 miles per 8-hour day of overland movement while wearing a traveling outfit. You also gain a +1 circumstance bonus to Constitution checks to avoid taking nonlethal damage resulting from a forced march.
!! Uniform
Uniforms are clothes worn by members of a specific group. They come in a wide variety of styles, each unique to the group or organization that uses them. Examples include uniforms for corporate employees, emergency-service workers, health-care practitioners, maintenance workers, military or security personnel, prisoners, public-transit employees, students, and more. Wearing the proper uniform grants you a +1 circumstance bonus to [[Disguise]] checks to appear as a member of the group that the uniform represents. Some uniforms, especially for government-funded organizations such as the military or security forces, are tightly controlled and may not be available for purchase by non-members (or cost considerably more on the black market).
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|clothing, athletic | 1 | 5 | L |
|clothing, ceremonial | 1 | 5 | L |
|clothing, couture | 8 | 5,000 | L |
|clothing, designer | 4 | 600 + cost of basic outfit | L |
|clothing, environmental | 1 | 10 | L |
|clothing, everyday | 1 | 1 | L |
|clothing, formal | 1 | 5 | 1 |
|clothing, party | 1 | 5 | L |
|clothing, professional | 1 | 5 | L |
|clothing, reconfigurable | 2 | 100 + cost of component outfits | L |
|clothing, travel | 1 | 10 | L |
|clothing, uniform | 1 | 5 | L |
</div>
Your nanites spread out into a faintly visible cloud that fills a number of contiguous 5-foot squares. The maximum number of squares you can fill this way equals 1 plus your Constitution bonus, and at least one of those squares must be adjacent to you. The cloud is stationary once formed, though you can reconfigure its space as a move action; if you do so, at least one square of the cloud must remain unchanged. When you take a [[guarded step]], you can move 10 feet as long as you begin and end this movement adjacent to or within your cloud array.
When you form a cloud array, you can use a [[nanite surge]] to increase the cloud's density. This causes the array's space to provide [[concealment]], but it provides only a 10% miss chance. It doesn't provide enough concealment to hide, and your attacks ignore any miss chance provided by your cloud. This concealment doesn't stack with existing concealment.
At 3rd level, whenever you form a cloud array, it can fill an additional 5-foot square, and any miss chance the cloud provides increases to 15%. At 7th level, it can fill an additional 5-foot square, and any miss chance the cloud provides increases to 20%. At 11th level, the cloud fills up to a number of contiguous squares equal to 1 plus twice your Constitution modifier. At 15th level, when you use a [[nanite surge]] while forming the cloud array, any miss chance the cloud provides increases to 25% (though your attacks still ignore any miss chance). At 19th level, the cloud instead fills up to a number of contiguous squares equal to 1 plus four times your Constitution modifier.
Cloud giants live on floating citadels in the swirling atmospheres of gas planets.
* ''Required Creature Type and Subtype:'' humanoid (giant)
* ''Suggested Alignment:'' neutral good or neutral evil
* ''Traits:''
** Huge
** [[blindsense]] (scent) 60 ft., [[low-light vision]], [[sense through]] (vision [clouds only])
** [[resistance]] to cold 5 (CR 3+; increase to 10 at CR 7, 20 at CR 11, 30 at CR 15)
** fly speed 40 ft. (CR 5+; Su, average; normal, thick, and toxic atmospheres only)
** deals damage as a creature 1 CR higher;
** [[crush]]
** [[hurl debris]]
** knockback (see below)
** spell-like abilities (CR 11+)
* //Knockback ([[Ex]]):// Whenever a cloud giant successfully deals damage to a creature with a melee attack or thrown projectile, the giant can immediately initiate a bull rush combat maneuver against that target (this takes no action and does not provoke attacks of opportunity).
<div class="statblock">
* ''CR'' 13; ''XP'' 25,600
* N Gargantuan animal
* ''Init'' +6; ''Senses'' [[low-light vision]]; ''Perception'' +23
!!! DEFENSE
* ''HP'' 225
* ''EAC'' 27; ''KAC'' 29
* ''Fort'' +17; ''Ref'' +17; ''Will'' +12
* ''Defensive Abilities'' explosive death (9d8 F, 30 ft., Reflex DC 19); ''Resistances'' electricity 15
* ''Weaknesses'' [[vulnerable]] to fire
!!! OFFENSE
* ''Speed'' 5 ft., fly 70 ft. ([[Ex]], perfect)
* ''Melee'' tail lash +26 (2d12+15 S plus 2d6 E; critical [[stun|Stun (critical)]])
* ''Multiattack'' 3 tail lashes +21 (2d12+15 E plus 2d6 E; critical [[stun|Stun (critical)]])
* ''Space'' 20 ft.; ''Reach'' 25 ft.
* ''Offensive Abilities'' natural thruster
!!! STATISTICS
* ''Str'' +8; ''Dex'' +6; ''Con'' +3; ''Int'' –5; ''Wis'' +4; ''Cha'' –1
* ''Skills'' [[Acrobatics]] +23 (+31 to fly), [[Athletics]] +28, [[Stealth]] +23
!!! ECOLOGY
* ''Environment'' any sky (Bretheda, Liavara)
* ''Organization'' solitary, pair or eclipse (3–12)
!!! SPECIAL ABILITIES
''Explosive Death ([[Ex]])'' If a cloud ray is reduced to 0 Hit Points by fire or electricity damage, its internal reservoirs of explosive gases and combustible fluids detonate, dealing the listed fire damage to all targets in a 20-foot burst centered on itself (Reflex DC 14 half).
''Natural Thruster ([[Ex]])'' Three times per day as a swift action, a cloud ray can gain a burst of speed until the beginning of its next turn. During this time, it doubles its fly speed, gains [[Spring Attack]] as a bonus feat, and deals an additional 1d12 damage with its tail lash attack.
</div>
<<section 'Cloud Skate' >>
Gliding dreamily through the cloudy ecosystems of Bretheda, Liavara, and other gas giants, cloud rays move with fluid grace and terrifying speed. Their wide bodies consist of a single broad wing and three trailing tails, with two rows of yellow-green eyes and a wide maw set forward, roughly denoting a "head." Mottled patterns of orange, red, and purple line their backs; their coloration grows brighter and more distinct as they age. Schools of these majestic predators periodically flock in the dozens, grazing on clouds of drift algae in the upper atmosphere for months before descending into the thick, lower atmosphere to actively hunt larger prey. Because of this cyclical behavior, many assume cloud rays are gentle giants emblematic of the Pact Worlds' unspoiled wilds before getting caught by surprise and attacked during the rays' aggressive cycle.
Like many Brethedan creatures, a cloud ray almost constantly filter feeds. It ingests organic compounds from the gas giant's atmosphere before breaking them down for bladders to maintain its buoyancy at rest. When in distress or in pursuit, a cloud ray ejects a portion of this gas into its blast siphons, specialized organs located on either side of its body. A cloud ray's body has evolved to withstand these blasts and high-G maneuvers—with its flexible cartilaginous skeleton, cushioned nervous system, and sharp tails that gain lethal momentum from the burst—yet the ray isn't equipped to withstand explosive forces outside the blast siphon. Deadly heat can accidentally trigger the volatile gases, causing a cloud ray to detonate in a dangerous fireball.
Smaller and more social cousins to cloud rays, cloud skates remain together in small hunting packs when they enter their aggression cycle. Cloud skates tend to act more skittish, however, and keep their distance from settlements.
Though cloud rays travel in small groups during their passive cycles and when breeding, they hunt alone once they enter their aggression cycle. Mature males typically maintain their active cycles for longer periods, lurking in the soupy lower atmosphere, and they periodically jostle each other in finslapping dominance displays that echo hauntingly for miles. Like most Brethedan creatures, cloud rays can easily shift their sex to adapt to their social surroundings, but once an adult shifts to male, it generally remains too aggressive and isolated to shift to another sex. After rising to the upper atmosphere to mate, a female deposits her eggs in delicate wisps kept aloft by the wind. These eggs hatch several weeks later, and the tiny rays shelter within drifting plant habitats for a few months before growing large enough to set off in search of richer nutrition. Reaching adulthood takes roughly 15 years for a cloud ray or 9 years for a cloud skate, after which either species can live as long as a century—if not killed for food before then.
Despite their fish-like appearance, the predominantly warmblooded cloud rays supplement their warmth by basking in sunlight and adjusting their coloration to absorb or reflect more solar energy. Their movements generate electrical charges that they store in an organic capacitor at the base of their tails and can discharge into prey. However, the smaller cloud skates possess only a rudimentary version of this organ that merely absorbs minor charges and gradually releases them as an underdeveloped form of electroreception.
!! Cloud Ray Companions
{{Cloud Ray (creature companion)}}
<div class="statblock">
* ''Levels'' 6-20
* Huge animal
* ''Senses'' [[low-light vision]]
* ''Good Save'' Ref; ''Poor Saves'' Fort, Will
* ''Resistances'' electricity 10
* ''Weakness'' [[vulnerable]] to fire
* ''Speed'' 5 ft.; fly 70 ft. ([[Ex]], perfect)
* ''Melee Attack'' tail lash (S)
* ''Space'' 15 ft. ''Reach'' 15 ft.
* ''Ability Modifiers'' Str, Dex
!!! SPECIAL ABILITIES
''Natural Thruster ([[Ex]])'' Three times per day as a swift action, a cloud ray companion can gain a burst of speed until the beginning of its next turn. During this time, it doubles its fly speed, gains [[Spring Attack]] as a bonus feat, and deals additional damage with its tail lash
equal to half its level.
''Tail Taser ([[Ex]])'' A cloud ray companion's tail lash attacks gain the [[stun|Stun (critical)]] critical hit effect.
</div>
[[Cloud rays]] can be tamed with patience and food, making them favorite mounts for gas prospectors and naturalists on gas giants. Raised to smaller sizes than their wild counterparts, they serve as ideal companions for groups or industrial use in aerial environments. Their ability to survive by grazing on floating algae and lichen makes them more reliable than many vehicles in isolated frontiers. Careful control over what and how much the beast eats helps keep them in their docile grazing cycle and suppresses their combustible death throes as well. Most cloud rays bond to a single master, becoming notoriously difficult with new riders. Cloud rays can flourish on almost any gas giant, and domesticated rays can even survive in the skies above terrestrial worlds with proper supplements.
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* N Large animal
* ''Init'' +5; ''Senses'' [[low-light vision]]; ''Perception'' +13
!!! DEFENSE
* ''HP'' 90
* ''EAC'' 18; ''KAC'' 20
* ''Fort'' +10; ''Ref'' +10; ''Will'' +5
* ''Defensive Abilities'' explosive death (5d8 F, 20 ft., Reflex DC 14); ''Resistances'' electricity 5
* ''Weaknesses'' [[vulnerable]] to fire
!!! OFFENSE
* ''Speed'' 5 ft., fly 80 ft. ([[Ex]], perfect)
* ''Melee'' tail lash +16 (1d8+9 S)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' natural thruster
!!! STATISTICS
* ''Str'' +3; ''Dex'' +5; ''Con'' +1; ''Int'' –5; ''Wis'' +2; ''Cha'' –1
* ''Skills'' [[Acrobatics]] +13 (+21 to fly), [[Athletics]] +18, [[Stealth]] +13
!!! ECOLOGY
* ''Environment'' any sky (Bretheda, Liavara)
* ''Organization'' solitary, pair, or school (3–24)
!!! SPECIAL ABILITIES
''Explosive Death ([[Ex]])'' See [[cloud ray]].
''Natural Thruster ([[Ex]])'' See [[cloud ray]]; the bonus damage to its tail lash attack is 1d8.
</div>
While this //aeon stone// orbits you, as a reaction while falling, you can cast //[[flight]]// (1st level), targeting only yourself (caster level 3rd). This //aeon stone// can be activated once per day.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//cloudy blue rhomboid// | 3 | 1,300 | — |
</div>
A club is any sort of blunt, oblong instrument with a haft suitable for gripping. Clubs can be made of stone, wood, or similar materials. Metal clubs exist as well, and they are usually hollow to keep them from being too heavy. Some Free Captains refer to clubs as belaying pins, though those archaic items are not required on starships.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|club | 0 | — | 1d6 B | — | L |[[analog]], [[archaic]], [[thrown]] (10 ft.) |
</div>
A cluster weapon is a form of grenade launcher that can fire a single grenade or (if loaded with appropriate grenades) can expend two identical grenades as a single attack. In the latter case, the grenades act as a single grenade of the same type (with a single attack roll, dealing damage only once, and so on), except its radius is increased by the listed amount listed and the save DC of any effects created by the grenade is calculated using the cluster weapon's item level if it is higher than the grenade's item level. Attempting to fire two nonidentical grenades results in an error code and the weapon does not fire.
The cluster launcher fires multiple grenades as a single shot, granting those grenades increased range and a larger blast radius. Each of the models—tactical, advanced, elite, and paragon—features an increase in range, capacity, and overall explosive power.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|cluster launcher, tactical | 6 | 4,150 | by grenade | 60 ft. | — | 8 grenades | 1 | 2 |[[cluster]] (5 ft.) |
|cluster launcher, advanced | 12 | 35,800 | by grenade | 70 ft. | — | 10 grenades | 1 | 3 |[[cluster]] (10 ft.) |
|cluster launcher, elite | 15 | 105,000 | by grenade | 80 ft. | — | 12 grenades | 1 | 3 |[[cluster]] (10 ft.) |
|cluster launcher, paragon | 18 | 360,000 | by grenade | 100 ft. | — | 16 grenades | 1 | 3 |[[cluster]] (15 ft.) |
</div>
A coagulant thickens the blood, serving as an emergency stopgap to prevent someone from bleeding out before receiving medical attention. When you take or are injected with a coagulant, you gain immunity to the [[bleeding]] condition for 1 minute per tier of the medicinal, but you also take a penalty equal to the medicinal's tier to [[Acrobatics]] and [[Athletics]] checks and to Reflex saves for that duration.
//Code grenades// are technomagical weapons designed to attack technology with an incessant worm program and garbage coding, using the same port technology necessary for the targets to interface with living beings. This is not unlike a localized distributed denial-of-service attack on the targets in range.
Only constructs with the technological subtype are damaged by a //code grenade’s// electrical blast, and if they fail their Reflex saving throws, they’re also [[staggered]] for the listed duration. In addition, if any creature wielding or wearing at least one piece of non-[[analog]] gear in the grenade’s explosion radius fails their Reflex save, the malicious code affects their equipment, rendering them [[off-target]] for the listed duration. Constructs with the technological subtype are ever only staggered and not rendered off-target.
<div class= "table-wrapper">
|Weapon | Level | Price | Capacity | Usage | Bulk |Special |h
|//code grenade I// | 6 | 675 | 20 ft. | drawn | L |[[explode]] (2d6 E, special 1 round, 15 ft.) |
|//code grenade II// | 10 | 2,800 | 20 ft. | drawn | L |[[explode]] (6d6 E, special 1d4 rounds, 15 ft.) |
|//code grenade III// | 16 | 26,000 | 20 ft. | drawn | L |[[explode]] (12d6 E, special 1d4+1 rounds, 15 ft.) |
</div>
A coil rifle is a long, slender firearm surrounded by a coil that generates carefully aligned magnetic fields that accelerate a single round with impressive power and accuracy. Precision coil rifles are the most affordable of these weapons, while specialist coil rifles have greater range and efficacy. Rangefinder, saboteur, and assassin coil rifles are especially deadly weapons that are appreciated by true connoisseurs, veteran mercenaries, and experienced firearm specialists.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|coil rifle, precision | 1 | 390 | 1d6 P | 60 ft. | — | 4 rounds | 1 | 2 |[[sniper]] (250 ft.) |
|coil rifle, specialist | 5 | 3,120 | 2d6 P | 70 ft. | [[bleed]] 1d6 | 6 rounds | 1 | 2 |[[sniper]] (250 ft.) |
|coil rifle, rangefinder | 10 | 18,600 | 3d6 P | 70 ft. | [[bleed]] 2d6 | 8 rounds | 1 | 2 |[[sniper]] (500 ft.) |
|coil rifle, saboteur | 14 | 76,700 | 7d6 P | 80 ft. | [[bleed]] 3d6 | 12 rounds | 1 | 2 |[[sniper]] (750 ft.) |
|coil rifle, assassin | 19 | 590,000 | 12d6 P | 90 ft. | [[bleed]] 4d6 | 16 rounds | 1 | 2 |[[sniper]] (750 ft.) |
</div>
name:coilgun
range:long
speed:—
damage:4d4
pcu:10
cost:10
special:—
Cold and exposure deal nonlethal damage to the victim. A character can't recover from the damage dealt by a cold environment until she gets out of the cold and warms up again. An unprotected character in cold weather (below 40° F) must succeed at a Fortitude save each hour (DC = 15 + 1 per previous check) or take 1d6 nonlethal cold damage. A character can attempt [[Survival]] skill checks to gain a bonus to this saving throw and might be able to apply this bonus to other characters as well.
In conditions of severe cold (below 0° F), an unprotected character must succeed at a Fortitude save every 10 minutes (DC = 15 + 1 per previous check) or take 1d6 nonlethal cold damage. A character can attempt Survival skill checks to gain a bonus to this saving throw and might be able to apply this bonus to other characters as well.
Extreme cold (below –20° F) deals 1d6 lethal cold damage per minute (no saving throw). In addition, a character must succeed at a Fortitude save (DC = 15 + 1 per previous check) each minute or take 1d4 nonlethal cold damage. Colder environments can deal more damage at the GM's discretion.
A character who takes any damage from cold or exposure is beset by frostbite or hypothermia (same as [[fatigued]]). These penalties end when the character recovers the nonlethal damage she took from the cold and exposure.
!! Ice
Icy surfaces count as difficult terrain, and the DCs for [[Acrobatics]] checks attempted on ice increase by 5. Characters in prolonged contact with ice might run the risk of taking damage from severe cold.
[[Esprakas]]' home world is a small, frigid planetoid. Chemical warmers embedded within your skin allow you to be comfortable in similar environments. You treat severe cold as cold and extreme cold as severe cold.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|cold inured graft | 1 | 150 | skin |
</div>
Cold iron is mined from deep underground and forged at a lower temperature to preserve its delicate properties. Weapons or ammunition fashioned from cold iron overcome the [[damage reduction]] of creatures with DR/cold iron, such as demons and fey. Weapons or ammunition without metal parts can't be made from cold iron.
<div class="table-wrapper">
|Form | Cost |h
|Ammunition (1 piece) | +9 credits |
|Weapon | +450 credits |
|Raw material (1 bulk) | 115 credits |
</div>
Creatures with this subtype are usually native to frigid environments.
* ''Traits:''
** [[immunity]] to cold
** [[vulnerable]] to fire
The chill of the deep shadows has inured you to cold.
''Gift:'' You gain cold [[resistance]] 5. If you have three or more manifestations, this resistance increases to 10.
''Stain'': Your appearance becomes disturbing. Reduce your Charisma score by 1.
Your touch is infused with the life-sapping gloom of the Shadow Plane.
''Prerequisites:'' [[Coldblooded]], one other manifestation.
''Gift:'' As a standard action, you can make a melee attack against EAC that deals 2d4 cold damage for each manifestation you have. If you deal damage with this manifestation, the target must succeed at a Will saving throw or become unable to benefit from morale bonuses for 1 minute. You can use this manifestation a number of times per day equal to the number of manifestations you have.
''Stain:'' Your body withers. Reduce your Strength, Dexterity, and Constitution scores by 1 point each.
Whenever you successfully aid an ally’s skill check using one of your specialization’s associated skills, you can give that ally a bonus to their skill check equal to your [[operative's edge]] bonus rather than +2.
Some melee weapons can be made to collapse for easy and inconspicuous storage. A weapon must be purchased or crafted with this accessory integrated. As a move action, you can fold or close a collapsing weapon into a much smaller size, allowing you to use the [[Sleight of Hand]] skill to hide a collapsed weapon of 1 or 2 bulk as if it were a light weapon, or granting a collapsed weapon of light bulk the [[conceal]] special property. As a move action, you can re-extend a collapsed weapon.
<div class="table-wrapper">
|Accessory | Level | Price | Bulk | Capacity | Usage |Weapon Type |h
|collapsing weapon | 3 | 1,250 | — | — | — |melee weapon |
</div>
<div class="statblock">
* ''CR'' 6; ''XP'' 3,900
* N Large animal
* ''Init'' +2; ''Senses'' [[low-light vision]], [[blindsense]] (ore) 60 ft.; ''Perception'' +18
* ''Aura'' [[radiation]] (30 ft., DC 14)
!!! DEFENSE
* ''HP'' 90
* ''EAC'' 18; ''KAC'' 20
* ''Fort'' +10; ''Ref'' +10; ''Will'' +5
* ''DR'' 10/—; ''Immunities'' critical hits
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' slam +16 (1d8+11 B) or claw +16 (1d8+11 S)
* ''Space'' 10 ft.; ''Reach'' 10 ft. (15 ft. with claw)
* ''Offensive Abilities'' meteor collection
!!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' +3; ''Int'' –4; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +18, [[Survival]] +13
!!! ECOLOGY
* ''Environment'' any (Weydana-7)
* ''Organization'' solitary or herd (2–8)
!!! SPECIAL ABILITIES
''Meteor Collection ([[Ex]])'' The meteors a collector crab collects for its shell grant it unusual properties. Its natural weapons are a conglomeration of different types of ore. Each time the collector crab attacks, roll randomly to determine which mineral affects the collector crab’s natural attacks.
<div class= "table-wrapper">
| d6 |Ore |h
| 1–2 |''Abysium:'' @@.constrained The collector crab’s attacks inflict radiation burns. The target must succeed at a DC 14 Fortitude save or be [[sickened]] for 1d4 rounds. On a critical hit, the target must succeed at a DC 14 Fortitude save or contract [[radiation sickness]].@@ |
| 3–4 |''Horacalcum:'' @@.constrained The crab’s attacks warp time around the target, who must succeed at a DC 14 Fortitude save or be [[staggered]] for 1 round. On a critical hit, the target is [[stunned]] for 1 round.@@ |
| 5–6 |''Voidglass:'' @@.constrained The crab’s shell is infused with hostile psychic emotions. Half the damage dealt by the crab is cold damage. The target of a collector crab’s attacks must succeed at a DC 14 Will save or be [[shaken]] for 1d4 rounds. On a critical hit, the target is [[panicked]] for 1 round.@@ |
</div>
</div>
Perhaps the strangest tale passed between explorers of Weydana-7 speaks of outcroppings of rock and metal that move. Most of these mobile boulders are the size of small vehicles, though stories tell of some as big as starships. These hulking heaps of ore, crystals, and rock dot the planet’s landscape, seeking unusual starmetals and defending themselves when anything approaches.
Nicknamed collector crabs, these reclusive, slow-moving animals live in unoccupied ore fields, collecting minerals from meteorites that pummel the surface. No one is entirely sure what the creature looks like within its starmetal shell, as it extends only a single large claw from its shell to claim its prizes; the rest of the creature’s body shrivels to dust when exposed to an atmosphere, and scientists have been unable to capture a live specimen for study.
Collector crab shells are quite valuable, thanks to the starmetals the creature stores there. Some explorers hunt them to harvest the minerals in their shells. The most enterprising among these explorers employ baited traps and explosives to neutralize their prey from a safe distance, though the practice can be quite destructive to the local ecosystem. Currently, explorers are divided on the issue of hunting collector crabs. Overzealous hunting threatens to eradicate the species entirely, though there’s no denying that the beasts pose a danger in the remote wilds of Weydana-7, and the lucrative profits of crab hunting have proven too much for poachers to resist.
This modification utilizes gravitational and magnetic fields to reduce the damage taken by a vehicle in a collision. When the vehicle damages an enemy with a ram action, this vehicle deals only one quarter its collision damage to itself (rather than one half its collision damage). When the vehicle takes collision damage from any other effect, such as when crashing or being rammed, reduce the collision damage the vehicle takes by 1 per die of collision damage.
<div class= "table-wrapper">
|Modification | Level | Price |h
|collision dampeners | 8 | 9,100 |
</div>
You have an unquenchable trailblazer's spirit, matched with the training and fortitude you'll need to carve out a new life for yourself and others in the wilderness. Although you might be the sort to go it alone on the frontier, you're more likely part of a small group of settlers. You might be preparing for your first voyage, or you might be a grizzled veteran who has already helped found several successful colonies.
!! Theme Knowledge (1st)
You have amassed a vast knowledge of past colonization efforts, including those that have failed due to ignorance or carelessness. You know that basic knowledge about a new, uncharted world is the most valuable resource any colonist can have. Reduce the DC to [[identify|Identify Creature]] average creatures using [[Life Science]] by 5. [[Survival]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to Survival checks. In addition, you gain an ability adjustment of +1 to Constitution at character creation.
!! Providing For Others (6th)
You know that a colony's survival means that each colonist look out for everyone else in times of hardship or privation. When you successfully use the [[Survival]] skill to [[endure severe weather]] or [[live off the land]], increase the number of other creatures you can grant saving throw bonuses or sustenance to by an amount equal to half your level. You can give another creature any benefit that you would gain from a Survival check to endure severe weather or live off the land (such as a bonus to Fortitude saves or sustenance you would gain), but if you do, you don't gain it for yourself.
!! Pioneer's Resilience (12th)
You are more resistant to effects that would overwhelm a less experienced settler. Once per day, you can reroll a Fortitude saving throw to resist the effects of a disease, poison, or severe weather.
!! An Eye to the Future (18th)
Up to twice per day when you successfully use the [[Survival]] skill to predict the weather, you can spend 10 minutes contemplating what the future holds to regain 1 Resolve Point; this doesn't count as resting to regain Stamina Points. You must spend 1 minute observing the surrounding area and its weather patterns to use this ability, even if you have another ability that allows you to predict the weather in a shorter amount of time.
Combining the habitability of a space station with the mobility of a starship, colony ships are designed to transport large populations of people across vast distances. In many ways they are mobile cities, able to provide long-term sustainability for a population as it travels across space. Most colony ships transport populations that intend to settle elsewhere (hence the name), although some can remain active as mobile settlements even after reaching their destination.
The colony ship framework must be purchased at the same time as a Large or larger starship base frame. Applying the colony ship framework to a base frame costs an amount of BP equal to one-quarter the base frame's BP cost. For example, the heavy freighter base frame has a BP cost of 40, so constructing a colony ship from a heavy freighter costs 50 BP (40 BP + 10 BP). A starship with a colony ship framework has the following abilities.
''Habitable:'' The primary purpose of a colony ship is to serve as a long-term habitat for its occupants. As a result, colony ships are optimized for communal living. A colony ship can house a total number of occupants equal to 10 × its base frame's maximum crew size, though its maximum crew size doesn't change. A colony ship multiplies its base frame's total number of available expansion bays by three. These additional expansion bays can be used only for cargo holds, escape pods, guest quarters, life boats, recreation suites, or other expansion bays intended primarily for civilians, as determined by the GM.
''Orbital Weaponry:'' Colony ships can support exceptionally powerful weaponry. A colony ship can install up to one weapon with the [[orbital]] weapon special property onto one of its weapon mounts for one-third the usual price.
<div class="table-wrapper">
|System | PCU | Cost (in BP) |h
|colony ship framework | 0 | 1/4 × base frame cost |
</div>
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* N Colossal animal
* ''Init'' +0; ''Senses'' [[low-light vision]]; ''Perception'' +16
!!! DEFENSE
* ''HP'' 125
* ''EAC'' 20; ''KAC'' 22
* ''Fort'' +13; ''Ref'' +10; ''Will'' +8
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' natural weapon +18 (3d4+16 B)
* ''Space'' 30 ft.; ''Reach'' 30 ft.
!!! STATISTICS
* ''Str'' +8; ''Dex'' +0; ''Con'' +4; ''Int'' –4; ''Wis'' +1; ''Cha'' –2
* ''Skills'' [[Athletics]] +21
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or herd (3–12)
</div>
<div class="statblock">
* ''CR'' 13; ''XP'' 25,600
* N Colossal animal
* ''Init'' +0; ''Senses'' [[low-light vision]]; ''Perception'' +23
!!! DEFENSE
* ''HP'' 225
* ''EAC'' 27; ''KAC'' 29
* ''Fort'' +17; ''Ref'' +12; ''Will'' +13
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' natural weapon +25 (3d12+21 P or S)
* ''Space'' 30 ft.; ''Reach'' 30 ft.
!!! STATISTICS
* ''Str'' +8; ''Dex'' +0; ''Con'' +5; ''Int'' –4; ''Wis'' +1; ''Cha'' –2
* ''Skills'' [[Athletics]] +23
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or pack (3–4)
</div>
Only the most massive vehicles are colossal in scope, such as enormous trains and aircraft carriers.
* ''Adjustments:'' Increase price by 20%, increase Hit Points by 20%, increase collision damage by 3 dice, decrease collision DC by 3, decrease Piloting and attack modifiers by 2, increase passenger limit by 400%.
Where massive creatures roam, those who fight against them for survival develop colossal weapons. Such is the case with the colossus coil, a weapon said to have been developed to hunt colossi on the planet Daimalko. It has since spread to many systems, including the Pact Worlds. This heavy firearm has a barrel sporting a series of toroidal high-voltage generators that collectively produce powerful arcs of electricity, and it can be overcharged to deliver even more destructive blasts. The electric blast sometimes overwhelms its target, branching off to hit another. The corona colossus coil produces a ring of electricity, while a brush colossus coil produces a more diffuse field. A streamer arc colossus coil produces a traditional arc of electricity, while the multistream colossus coil generates multiple such streams for a devastating blast.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|colossus coil, corona | 3 | 1,450 | 1d8 E | 80 ft. | [[arc]] 1d6 | 20 charges | 4 | 3 |[[boost]] 1d8 |
|colossus coil, brush | 9 | 13,800 | 3d8 E | 100 ft. | [[arc]] 2d6 | 40 charges | 8 | 3 |[[boost]] 1d8 |
|colossus coil, streamer arc | 14 | 76,400 | 5d8 E | 100 ft. | [[arc]] 3d6 | 40 charges | 8 | 3 |[[boost]] 2d8 |
|colossus coil, multistream | 19 | 888,000 | 10d8 E | 120 ft. | [[arc]] 4d6 | 80 charges | 10 | 3 |[[boost]] 3d8 |
</div>
<div class="statblock">
* ''CR'' 10; ''XP'' 9,600
* CN Huge ooze (incorporeal)
* ''Init'' +8; ''Senses'' [[blindsight]] (vibration) 120 ft.; ''Perception'' +24
* ''Aura'' lassitude (300 ft., DC 19)
!!! DEFENSE
* ''HP'' 140
* ''EAC'' 23; ''KAC'' 24
* ''Fort'' +11; ''Ref'' +11; ''Will'' +7
* ''Defensive Abilities'' [[incorporeal]], [[void adaptation]]; ''Immunities'' acid, cold, fire, mind-affecting effects, [[ooze immunities]], [[radiation]], sonic; ''SR'' 21
* ''Weaknesses'' susceptible to force effects
!!! OFFENSE
* ''Speed'' fly 60 ft. ([[Su]], perfect)
* ''Melee'' disintegrating touch +20 (1d10+10)
* ''Space'' 15 ft.; ''Reach'' 15 ft.
* ''Offensive Abilities'' feed
!!! STATISTICS
* ''Str'' +0; ''Dex'' +8; ''Con'' +3; ''Int'' +2; ''Wis'' +3; ''Cha'' +5
* ''Skills'' [[Acrobatics]] +24 (+32 to fly), [[Life Science]] +19, [[Physical Science]] +19, [[Stealth]] +24, [[Survival]] +24
* ''Languages'' Aklo (can't speak any language)
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Aura of Lassitude ([[Su]])'' A creature within 300 feet of a colour out of space (even when the colour is hiding within a solid object) must succeed at a DC 19 Will save or become overwhelmed with listlessness and ennui. While under this effect, the creature takes a –4 penalty to Will saving throws and doesn't willingly travel farther than 1 mile from the area where it failed its saving throw against that colour's aura of lassitude. If the victim failed the saving throw while on a starship, it instead doesn't willingly travel farther than 1 mile from the starship, nor does it willingly pilot that starship. A //[[break enchantment]]// spell (DC 19) ends the effect, as does moving the victim more than 1 mile from where it failed its save (or from the starship where it failed its save). Every 24 hours, a creature affected by an aura of lassitude can attempt a new DC 19 Will save to cast off the effects of the aura. A creature that succeeds at this saving throw is immune to that colour's aura of lassitude for 24 hours. A creature under the effects of an aura of lassitude from a colour out of space can't be further affected by this ability from other colours. This is a mind-affecting effect.
''Disintegrating Touch ([[Su]])'' A colour's touch can disintegrate matter. This attack targets EAC and deals untyped damage; a creature that succeeds at a DC 19 Fortitude save takes half damage. A creature reduced to 0 Hit Points by this attack must succeed at a DC 19 Fortitude save or be immediately slain and reduced to a pile of fine ash.
''Feed ([[Su]])'' As a full action, a colour can attempt to feed on a living creature, a natural region of plant and animal life, or a Drift engine. If it feeds on a creature or a Drift engine, the colour must have line of sight to and be within 300 feet of the target. If it feeds on a region of plant and animal life, it needs only to be within that region. It can feed on a region once per week, a specific Drift engine once per day, and a specific living creature once per day. Feeding on a region or a Drift engine is automatically successful. When the colour feeds on a region, it causes plant life there to grow brittle and sickly; undergrowth in a blighted region doesn't provide concealment or function as difficult terrain, and small animals grow larger and deformed. When the colour feeds on a Drift engine, the ship becomes sluggish and awkward; all checks to maneuver the starship (including pilot actions during starship combat) take a –4 penalty, and the duration of travel through the Drift is doubled. A colour never completely consumes a region or a Drift engine. A region of nature recovers from these effects 1 year after the colour leaves the area, while a Drift engine recovers 24 hours after the colour's feeding. A creature can resist being fed upon by a colour out of space by succeeding at a DC 19 Will save, in which case the colour can't attempt to feed on that creature again for 24 hours. If the victim fails this saving throw, it takes 1d4 Constitution drain and 1d4 Charisma drain. A creature whose Constitution score is drained to 0 this way immediately dies, crumbling into a mass of desiccated tissue. A creature whose Charisma score is drained to 0 this way gains the colour-blighted graft (see below).
''Susceptible to Force Effects ([[Ex]])'' A colour out of space takes half again as much damage (+50%) from force effects, and it takes a –4 penalty to saving throws to resist force effects. A colour out of space can't damage targets protected by force effects with its disintegrating touch, and the aura of lassitude and feed abilities of a colour that is completely entrapped by force effects have no effect.
</div>
The deepest reaches of space hold truly bizarre terrors, and few among them are more feared than the colour out of space. This entity is composed only of a malevolent hue that defies classification and eludes identification by most sensors. A colour's presence manifests as an unsettling shifting of colors as it moves through an area. This distortion is enough to allow for targeting of a colour out of space, but the creature's natural defenses and immunities still make it a high-risk target to engage.
A colour out of space arrives on a planet or other celestial body in embryonic form, infusing the inside of a dense meteorite. After the meteor lands, it crumbles, and the colour seeps out and begins to feed. Once it has fed sufficiently, often over many months, it launches into space again and seeks new feeding grounds. Sometimes, it leaves enough of itself behind to form a new embryonic colour, and the bizarre life cycle continues.
The energies Drift engines exude can nourish a colour out of space. Scholars are only starting to explore what this feeding implies about the nature of the Drift itself.
!! Colour-Blighted Template Graft
A creature that has the colour-blighted graft is hideously deformed and glows with the disturbing color of the creature that blighted it.
A colour-blighted creature is immune to the feed attack of a colour out of space. Its Charisma score is raised to 1. , but until then, the blighted creature is aggressive toward all nonblighted creatures. It gains a +1 bonus to attack rolls and weapon damage rolls against such creatures. Every 24 hours, a colour-blighted creature must succeed at a DC 12 Fortitude save or crumble into fine white ash. Such a doom means instant death and, for most colour-blighted creatures, the only chance at escape from a life filled with pain.
<div class="statblock">
* ''CR'' 7; ''XP'' 3,200
* N Medium fey
* ''Init'' +2; ''Senses'' [[low-light vision]]; ''Perception'' +14
* ''Aura'' icy crown (30 ft., DC 17)
!!! DEFENSES
* ''HP'' 90
* ''EAC'' 18; ''KAC'' 19
* ''Fort'' +8; ''Ref'' +8; ''Will'' +10
* ''Defensive Abilities'' [[void adaptation]]; ''Immunities'' cold
!!! OFFENSE
* ''Speed'' 30 ft., fly 60 ft. ([[Su]], average)
* ''Melee'' claw +14 (1d8+7 C & S; critical [[bleed]] 1d8)
* ''Offensive Abilities'' comet form
* ''Spell-Like Abilities'' (CL 7th; melee +14)
** 1/day—//[[bestow curse]]// (DC 20), //[[probability prediction]]//
** 3/day—//[[augury]]//, //[[fog cloud]]//
** At will—//[[mind thrust]]// (DC 18), //[[telepathic message]]// (system-wide)
!!! STATISTICS
* ''Str'' +0; ''Dex'' +2; ''Con'' +0; ''Int'' +4; ''Wis'' +5; ''Cha'' +2
* ''Skills'' [[Acrobatics]] +14, [[Culture]] +19, [[Mysticism]] +19
* ''Other Abilities'' spaceflight
* ''Languages'' Common; [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or group (3–5)
!!! SPECIAL ABILITIES
''Comet Form ([[Su]])'' As a full action, a comanide can fly up to 240 feet in a straight line, trailing a dazzling jet of plasma. This movement doesn't provoke attacks of opportunity, and the comanide can make one claw attack against each creature it can reach during this movement, taking a –4 penalty to each attack roll. A creature within 30 feet of the comanide
that can see it during this movement must succeed at a DC 17 Will saving throw or become [[fascinated]] for 1 round. Once the comanide uses this ability, it can't use it again until after it rests for 10 minutes.
''Icy Crown ([[Su]])'' While a comanide wears its icy crown, the fey emanates a glowing cloud of
frigid plasma in a spherical radius of 30 feet. This aura casts normal light in a 30-foot radius, and dim light for an additional 30 feet. While within the aura, the comanide has fire [[resistance]] 10. Creatures other than comanides that end their turns in the aura take 3d6 cold damage (Fortitude DC 17 half). A comanide can apply or remove its crown as a move action. The crown can be sundered (hardness 2, HP 35), and it can be taken from the comanide with a successful disarm combat maneuver or when a foe successfully renews a grapple. A non-comanide wearing the crown emits light and gains cold [[resistance]] 10 so long as the comanide lives.
</div>
Comanides are fey born from comets. A comanide can outlive its parent comet, and over the span of wakeful centuries, these fey notice mystical patterns in the movements of astronomical bodies and mortal affairs. Comanides have been known to telepathically contact people or visit planets to caution that a current course of action is likely to lead to chaos or severe imbalance, and so they appear in historical annals on numerous worlds. In some cases, a comanide's advice has raised a person to prophet status or shaped long-term cultural beliefs. In others, proof of a comanide's counsel exists only in records buried deep within the ruins left by a society that didn't heed a comanide's advice.
As retiring fey, comanides avoid violence. They can become angry when they or their warnings are disrespected. A comanide's full fury is reserved for those who dare to touch its icy crown.
You wield your [[adaptive strike]] intuitively, raining blows upon your enemies.
''Basic:'' When making a full attack you take a –3 penalty to attacks made with your adaptive strike instead of the normal –4 penalty.
''Advanced (13th Level):'' When making a full attack entirely with your adaptive strike, you can make three attacks instead of two attacks. You take a –5 penalty to these attacks instead of a –3 penalty.
''Ultimate (19th Level):'' Once per round when you make a full attack and hit the same target at least twice with your adaptive strike, you can exaggerate the target’s wounds (such as by rending them, creating a deadly current, or triggering secondary explosions), dealing 5d10 additional damage (Fortitude half).
The final phase of each round is combat. This happens in initiative order, and characters can take the usual actions they can in combat, with the following adjustments. Pilots can also act during the combat phase, as long as they have any actions remaining to spend. Because of the motion involved in a chase, all attacks take the penalty listed in the vehicle's Modifiers entry. However, because the vehicles are all moving at high speed, the differences in speed cancel out somewhat, so combatants take the normal penalty instead of the higher penalty for full speed.
!! Ranged Attacks
Passengers on and pilots of vehicles can attempt ranged attacks against other vehicles or their passengers in the same zone or one zone away. Unless otherwise specified, these ranged attacks follow the normal rules for attacking from vehicles. To determine the range between two vehicles, see [[Relative Positioning]].
As a passenger, you can attack with your ranged weapons or abilities. If you're a gunner, you can attack with the vehicle's mounted weapons, as described in Firing Vehicle Weapons. As a pilot, you can attack only if you have a standard action left and can make a full attack only if you left the vehicle uncontrolled in the pilot actions phase.
Passengers can attack an enemy vehicle directly, but targeting riders or pilots can be difficult. Vehicles (except for entirely open vehicles) usually grant their passengers some degree of cover.
Due to high speeds, wind, and other factors that may or may not be part of the environment, some weapons might not work effectively during a chase. For example, it's nearly impossible to throw a grenade from one vehicle to another while moving at high speeds. The GM has final say on what can and can't be used during a chase and the penalties incurred for difficult attacks.
!! Melee Attacks
Anyone in a vehicle can make melee attacks against those on an enemy vehicle with which their own vehicle is engaged. You can make melee attacks against those in an enemy vehicle only with reach weapons, and such targets typically have some cover provided by their vehicle. Even when your vehicles are engaged and you're using a reach weapon, you do not threaten any squares of the other vehicle.
!! Boarding
If two vehicles are engaged and you are a passenger, you can attempt to move from one vehicle to the other as a move action that provokes attacks of opportunity. This is like boarding a vehicle in normal combat, but it also requires a successful [[Acrobatics]] or [[Athletics]] check with a DC equal to 5 + the KAC of the vehicle you're boarding. Failure by less than 5 means that you are unable to board the other vehicle and remain on your vehicle. If you fail by 5 or more, you fall from the vehicle and land [[prone]]. You take double the normal falling damage for the distance of your fall or 1d6 falling damage if you fall less than 10 feet. Once you have boarded an enemy vehicle, you take the attack penalty from that vehicle, not your former one.
!! Collisions
When piloting a vehicle, you can attempt a [[Piloting]] check (DC = the enemy vehicle's KAC) as a standard action to smash into another vehicle you're engaged with. If you're successful, your vehicle deals its collision damage to the enemy vehicle, and takes half that much damage itself. A vehicle's collision damage is listed in the Attack (Collision) entry of its statistics.
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Actions'>>
</div>
While actually trying to convince someone using a skill takes actions, banter and quips are a hallmark of science fantasy stories, and the game wouldn't flow naturally if you could only talk in initiative order. Thus, you can speak an amount that makes sense, at the GM's discretion, without spending any of your actions, even if it isn't your turn.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
You leave fewer openings when casting a spell.
''Prerequisites:'' Ability to cast 2nd-level spells.
''Benefit:'' You gain a +2 bonus to your Armor Class and saving throws against attacks of opportunity you provoked by casting a spell and against readied actions triggered by your spellcasting.
When you use the [[eldritch shot]] magic officer action, you can also expend an unused spell slot or spell-like ability of 1st level or higher to grant a +1 enhancement bonus to gunnery checks and damage rolls using the affected weapon. This bonus lasts until the end of the combat or until the weapon has been fired a number of times equal to the expended spell slot's level, whichever comes first.
This highly adaptive two-handed device mimics the form and function of the latest state-of-the-art gaming console controllers. While you're operating the combat controller, you can use any longarms and heavy weapons that have the [[integrated]] special property and are installed into your armor as though those weapons had the [[professional]] (vidgamer) weapon special property.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|combat controller | 5 | 3,100 | 1 | 20 | 1/hour |
</div>
Bigger than other chassis options, the combat drone moves along the ground and is outfitted with wheels, tracks, legs, or a similar form of propulsion. This drone is designed specifically for battle. It has an armored body and multiple weapon mounts, allowing it to pack a variety of armaments.
<div class="statblock">
* ''Size'' Medium
* ''Speed'' 30 feet
* ''AC'' EAC 10, KAC 13
* ''Good Save'' Fortitude
* ''Poor Saves'' Reflex, Will
* ''Ability Scores'' Str 14, Dex 12, Con —, Int 6, Wis 10, Cha 6
* ''Ability Increases'' Strength, Dexterity
* ''Initial Mods'' [[reductive plating]], [[weapon mount]] or [[melee weapon arm]] (up to 2 in any combination), [[weapon proficiency|Weapon Proficiency (drone mod)]]
</div>
You're able to use your social skills and abilities to gain the upper hand during a confrontation, often depending on deception, misdirection, and pure confidence to defeat your foes instead of brute force. You gain an expertise die of the same value as that granted to an envoy of your level by the [[expertise]] class feature, but you do not add it to skill checks. Choose one of the following skills: [[Bluff]], [[Computers]], [[Culture]], [[Diplomacy]], [[Intimidate]], or [[Sense Motive]].
As a standard action, you can make an expertise attack as an attack action. Prior to your attack roll, attempt a skill check using the chosen skill with a DC equal to 15 + 1-1/2 × your target's CR. If you succeed at the check and your attack hits, you roll your expertise die and add the result to your damage roll, and the target is [[shaken]] for 1 round.
You can use this ability and other expertise abilities as long as you have at least 1 Resolve Point remaining. This ability counts as the expertise ability for purposes of other abilities and prerequisites. If an ability requires you to forgo your expertise die on a skill check to gain some other benefit (such as [[altered bearing]]), you can use that ability only in a round in which you
did not use combat expertise.
At 5th level, and every 4 levels thereafter, you can select another skill you can use with combat expertise. This counts as having expertise with that skill for purposes of [[expertise talents]] and other prerequisites, though you do not actually add your expertise die to any skill checks.
This replaces [[expertise]] and [[skill expertise]].
At 2nd level and every 2 levels thereafter, you gain a bonus feat in addition to those gained from normal advancement. These bonus feats must be selected from those listed as combat feats.
Whenever you gain a new bonus feat, you can also choose to replace one of the bonus feats you have already learned with a different bonus feat. The feat you replace can't be one that was used as a prerequisite for another feat or other ability. You can change only one feat at any given level, and you must choose whether or not to swap the feat at the time you gain the new bonus feat.
<h3>First Letter: <<selector>></h3>
<<list-links '[prefix{Combat Feats!!selection}tag[Combat Feats]]' class:index >>
<div class="statblock">
* ''Level'' 15; ''Price'' 345,000
* Gargantuan land vehicle (20 ft. wide, 45 ft. long, 10 ft. high)
* ''Speed'' 20 ft., full 450 ft., 50 mph
* ''EAC'' 29; ''KAC'' 30; ''Cover'' total cover
* ''HP'' 260 (130); ''Hardness'' 15
* ''Attack (Collision)'' 17d10 B (DC 17)
* ''Modifiers'' +0 [[Piloting]], –3 attack (–5 at full speed)
* ''Systems'' enhanced sensors ([[darkvision]] 1 mile), expansion bays (medical bays [4]), planetary comm unit
* ''Passengers'' 24 plus 16 patients
</div>
Combat hospitals are heavily armed vehicles meant to evacuate and treat combat casualties in even the most dire of circumstances. Their crew often includes gunners, guards, a doctor, and several combat medics equipped with the most cutting-edge medical equipment available.
As a move action, you can fortify an item you touch against attack. The item's hardness increases by an amount equal to your mechanic level (to a maximum of double its normal hardness) for 1 round. If the item is one you are wearing or holding, you can use this ability as a purely defensive reaction to an attack against it.
As a standard action, you can attempt one of the following combat maneuvers. For each maneuver, choose an opponent within your reach (including your weapon's reach, if applicable) and then make a melee attack roll against the opponent's KAC + 8. The effects of success vary depending on the maneuver, as described below.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
Like combat between characters, starship combat occurs over a number of rounds until one side flees, surrenders, or is otherwise defeated. Unlike rounds in combat between characters, a round of starship combat doesn't correlate to a specific amount of time. Each round of starship combat is divided up into three phases, resolved in order. Each character aboard a starship typically acts in only one of these phases, depending on her role on the starship.
<ol>
<$list filter="[tag<currentTiddler>]" >
<li><$link><<currentTiddler>></$link></li>
</$list>
</ol>
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
This utilitarian rifle is favored by mercenaries who aren't looking for flashy weapons.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|combat rifle | 10 | 16,500 | 3d8 P | 90 ft. | — | 12 rounds | 1 | 1 |[[analog]] |
</div>
<div class="statblock">
* ''Level'' 11; Price 73,000
* Large land vehicle (5 ft. wide, 10 ft. long, 5 ft. high)
* ''Speed'' 30 ft., full 500 ft., 55 mph
* ''EAC'' 24; ''KAC'' 25; ''Cover'' none
* ''HP'' 150 (75); ''Hardness'' 8
* ''Attack (Collision)'' 10d10 B (DC 18)
* ''Attack'' advanced [[rotolaser]] rotolaser (2d8 F; critical [[burn]] 1d6)
* ''Modifiers'' +1 [[Piloting]], –1 attack (–3 at full speed)
* ''Passengers'' 1
!!! SPECIAL ABILITIES
''Dermacrystal Coating ([[Ex]])'' The body and engine system of the sandrail is coated with a composite of microfine crystals and sand, forming a hard glassy barrier that allows it to skim across a desert as though it was flat terrain instead of difficult or rough terrain.
''Long Jump Booster ([[Ex]])'' Once per day, the pilot can take a standard action to use the sandrail's long jump booster, propelling the vehicle up to 20 ft. vertically and up to its full speed horizontally.
</div>
The combat sandrail skims over fine dust and sand, powered by a dynamic rear engine and a set of twin propulsion fans. Its lack of wheels and tubular roll cage keep the vehicle ultralight, and a passenger can fire from a small platform set on top of the engine.
Your [[exocortex]] provides you with enhanced combat ability, granting you proficiency with heavy armor and longarms. At 3rd level, you gain [[weapon specialization]] in longarms just as if your class granted proficiency. As a move action during combat, you can designate a foe for your exocortex to track. As long as that target is in sight, the exocortex feeds you telemetry, vulnerabilities, and combat tactics, allowing you to make attacks against that target as if your base attack bonus from your mechanic levels were equal to your mechanic level. Designating another target causes you to immediately lose this bonus against the previous target.
This specialized gym and miniature arena provides an array of holographic threats, tactical dilemmas, and automated combat simulations that help crew members practice close-quarters tactics and self-defense. This facility also adds several caches of weapons and armor spread throughout the starship, ensuring that the crew always have essential armaments close at hand in the event of an emergency. A basic combat training facility improves the crew's battle readiness, treating them as skilled (and granting a bonus) when resolving [[boarding]] events. Specialized and elite combat training facilities incorporate much more complicated simulations and rigorous protocols, and the crew are treated as specialized or elite, respectively, when resolving boarding encounters.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|combat training facility, basic | 3 | 3 |
|combat training facility, advanced | 5 | 8 |
|combat training facility, elite | 5 | 10 |
</div>
You gain a bonus combat feat. You must meet all of that feat's prerequisites.
You work fluidly with your creature companion mount.
''Prerequisites:'' [[Survival]] 1 rank.
''Benefit:'' Your creature companion is a combat-trained mount, and you no longer need to attempt the [[fight from a combat-trained mount|Ride a Creature]] task of [[Survival]] when directing it in battle.
Some galactic effects combine gravity fields, damaging zones, and radiation, making for very dangerous areas for a starship. However, sometimes the PCs' goals lie in the heart of such treacherous areas of space!
''Neutron Star:'' The collapsed remains of a giant star can form this ultra-dense body featuring extreme heat, gravity, and radiation. Flying near such a star often exposes a starship to as much as 1d8 damage per round per 2 tiers of the starship from the intense heat, high radiation, and strong gravitational pull. This damage occurs at the end of each helm phase and is divided evenly among the ship's quadrants.
''Pulsar:'' This neutron star has a very short rotational period (from milliseconds to seconds) and emits ultra-high-energy cosmic rays. Represent this hazard by adding a direct-fire attack every 1d4 rounds from the direction of the pulsar during the gunnery phase. A pulsar's ultra-high-energy cosmic ray has an attack bonus equal to 1-1/2 × the starship's tier, has the irradiate (severe) and vortex weapon special properties, and deals 1d12 × 10 damage; this damage increases by 1d12 × 10 per 5 tiers of the starship. During the helm phase, a science officer can take a crew action to analyze the pulsar with the ship's sensors (DC = 10 + 1-1/2 × the starship's tier). If successful, they avoid the cosmic ray entirely that round.
''Quasar:'' This is an ultra-luminous active galactic nucleus. The accelerating ring of gas revolves around a supermassive black hole, releasing energy across the entire electromagnetic spectrum, including bright visible light. Though beautiful to behold, a quasar is enormously dangerous; it emits high levels of radiation and heat, and its black hole has a strong gravitational pull. If a starship approaches the galaxy's quasar core, use the rules for a neutron star except it deals 10 times as much damage. Note that even the most stalwart ships could not survive this hazard for long.
Spells or magical effects usually work as their descriptions state, no matter how many other spells or magical effects happen to be operating in the same area or on the same recipient. Except in special cases, a spell does not affect the way another spell operates. Whenever a spell has a specific effect on other spells, the spell description explains that effect. Several other general rules apply when spells or magical effects operate in the same place.
!! Duplicate Effects
Spells and effects that provide bonuses or penalties to attributes such as attack rolls, damage rolls, and saving throws usually do not stack with themselves if multiple effects would apply to the same attribute. More generally, two bonuses of the same type do not stack even if they come from different spells or from effects other than spells.
However, damage from multiple spells that deal damage is always cumulative.
!! Different Strengths
In cases when two or more spells produce identical effects in the same area or on the same target, but at different strengths (such as one spell granting fire resistance 5 and another granting fire resistance 10), only the one with the highest strength applies. If a previously cast spell lasts longer than a more recently cast spell producing the same effect, and the most recent version expires, the previously cast spell resumes its effect for the remainder of its duration.
!! Multiple Mental Control Effects
Sometimes magical effects that establish mental control render each other irrelevant, such as spells that remove the subject's ability to act. For example, a creature under the effect of a //[[hold person]]// spell cannot be compelled to move using a //[[dominate]]// spell, because the hold person effect prevents the creature from moving.
Mental controls that don't remove the target's ability to act don't usually interfere with each other. If a creature is under the mental control of two or more creatures, it tends to obey each to the best of its ability and to the extent of the control each effect allows. If the controlled creature receives conflicting orders simultaneously, the competing controllers must attempt opposed Charisma checks to determine which one the creature obeys.
!! Countering And Negating
Some spells can be used to counter other specific spells, as noted in their spell descriptions. For instance, you can use //[[slow]]// to counter a casting of //[[haste]]//. This works exactly like the counter effect of the //[[dispel magic]]// spell, except you don't need to attempt a caster level check; if the target is in range, the spell is automatically countered and fails.
Many times, these same spells note that they negate one another as well. This means that a successful casting of one spell on a target under the effects of the second spell undoes those effects, and the effects of the first spell don't occur.
<div class="statblock">
* ''CR'' 12; ''XP'' 19,200
* N Diminutive vermin (swarm)
* ''Init'' +8; ''Senses'' [[blindsight]] (vibration) 30 ft., [[darkvision]] 60 ft.; ''Perception'' +22
!!! DEFENSE
''HP'' 200
* ''EAC'' 26; ''KAC'' 28
* ''Fort'' +14; ''Ref'' +16; ''Will'' +11
* ''Defensive Abilities'' [[swarm defenses]], [[void adaptation]]; ''Immunities'' cold, [[swarm immunities]]
!!! OFFENSE
* ''Speed'' 30 ft., fly 30 ft. ([[Su]], perfect)
* ''Melee'' [[swarm attack]] (6d6 C & P plus chilling toxin)
* ''Space'' 10 ft.; ''Reach'' 0 ft.
* ''Offensive Abilities'' [[distraction]] (DC 19), implant
!!! STATISTICS
* ''Str'' –2; ''Dex'' +8; ''Con'' +5; ''Int'' —; ''Wis'' +0; ''Cha'' –3
* ''Skills'' [[Acrobatics]] +22 (+30 to fly)
* ''Other Abilities'' [[mindless]]
!!! ECOLOGY
* ''Environment'' any vacuum
* ''Organization'' swarm, pair, or brood (3–6)
!!! SPECIAL ABILITIES
''Implant ([[Ex]])'' A comet wasp swarm can choose not to use its [[swarm attack]] on (and deal no damage to) a [[helpless]] or [[paralyzed]] living creature in its space. Instead of doing so, the swarm implants eggs in that creature, afflicting it with comet wasp gestation.
!!! Chilling Toxin
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 19
* ''Track'' [[Dexterity|Dexterity Poison Track]] (special)
* ''Frequency'' 1/round for 6 rounds
* ''Effect'' progression track is //Healthy—Sluggish—Stiffened—Staggered—Immobile//; no end state
* ''Cure'' 1 save
!!! Comet Wasp Gestation
* ''Type'' disease (injury)
* ''Save'' Fortitude DC 19
* ''Track'' [[physical|Physical Disease Track]] (special)
* ''Frequency'' 1/day
* ''Effect'' no latent state; the victim dies on the fifth day as a new comet wasp swarm cuts itself free
* ''Cure'' surgically extract eggs with a [[Medicine]] check (DC 19) that takes 1 hour and requires a [[medical lab]]; subject takes 1d4 Constitution damage on each attempt
</div>
Comet wasps create nests in frozen interstellar bodies. These icy, venomous vespids lay their eggs in living creatures.
You can attempt an [[Athletics]] check in place of [[Acrobatics]] check when attempting to [[tumble]] through an opponent’s space. You can choose to attempt to tumble through an opponent’s space as a full action instead of as a move action, in which case you can move up to half your speed and reduce the check DC by 5.
A personal comm unit is pocket-sized device that combines a minor portable computer (treat as a tier-0 computer with no upgrades or modules) and a cellular communication device, allowing wireless communication with other comm units in both audio- and text-based formats at planetary range. A personal comm unit also includes a calculator, a flashlight (increases the light level one step in a 15-foot cone), and several entertainment options (including games and access to any local infospheres). You can upgrade a personal comm unit to function as some other devices (such as full computers and scanners) by spending credits equal to 110% of the additional device's price.
Comm units that function at system-wide and unlimited ranges aren't as portable; they include built-in generators that provide the necessary amount of power. Short-term use of these units can be purchased in most major settlements.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|comm unit, personal | 1 | 7 | L | 80 | 1/hour |
|comm unit, system-wide | 6 | 4,000 | 20 | — | — |
|comm unit, unlimited | 12 | 32,000 | 40 | — | — |
</div>
As a telepathic species that doesn't speak, the grays don't use normal comms. They have constructed telepathic comms attuned to their thought patterns and telepathy. These comms are extremely rare outside gray facilities, available only through underground or gray-market channels. Their prices reflect this rarity.
A gray comm unit, a bizarre device made of smoky crystal and wires of gold and silver, functions like a normal [[comm unit]], except it sends only telepathic signals. You must identify the receiver, who must also have a gray comm unit, which notifies the receiver of an incoming message. To send or receive the message, you must have [[limited telepathy]] or [[telepathy]], or you must cast //[[mindlink]]// (an exception to that spell's normal targeting) or [//[telepathy|Telepathy (spell)]]// targeting the gray comm unit. Either spell retains its other parameters, such as duration. A mystic using the mindlink class feature can target a gray comm unit with the spell any number of times per day, even if the message comes from or goes to the same creature. Three kinds of gray comm units see use.
* ''Planetary (Level 3):'' This bulky handheld unit can reach another unit on the same planet or on an object orbiting the same planet.
* ''System-Wide (Level 8):'' A gray comm unit with a system-wide range typically takes up 10 or so cubic feet, much of it a network of wire and crystals set within a wall unit.
* ''Unlimited (Level 14):'' Few have seen these massive gray comm unit units, which take up a small room and highjack Drift beacons to transmit their telepathic signals across interstellar distances.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|gray comm unit, planetary | 3 | 1,500 | 1 |
|gray comm unit, system-wide | 8 | 9,000 | 40 |
|gray comm unit, unlimited | 14 | 72,000 | 120 |
</div>
<div class="statblock">
* <<levels>>
* ''School'' enchantment (compulsion, language-dependent, mind-affecting)
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one living creature
* ''Duration'' 1 round
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
You give the target one of the following commands, which it obeys to the best of its ability at its earliest opportunity. If the target can't carry out your command on its next turn, the spell automatically fails.
* //Approach//: The target moves toward you as quickly and directly as possible for 1 round, taking no other actions and triggering reactions (such as attacks of opportunity) for this movement as normal.
* //Drop//: The target drops whatever it is holding. It can't pick up any dropped item until its next turn.
* //Fall//: The target falls to the ground and remains [[prone]] for 1 round. It can otherwise act normally.
* //Flee//: The target moves away from you as quickly and directly as possible for 1 round, taking no other actions and provoking reactions (such as attacks of opportunity) for this movement as normal.
* //Halt//: The target is [[dazed]] for 1 round.
<div class="statblock">
* <<levels>>
* ''School'' illusion
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one creature
* ''Duration'' 1 minute/level (D)
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
Hobgoblins created this spell to signify rallying points and provide commanders with better ability to organize troops. The target creature seems more imposing, granting the creature a +2 morale bonus to Charisma-based checks made to motivate troops and all Intimidate checks. A symbol of leadership, such as the seal of an organization or a deity’s holy symbol, illuminates above the target. This symbol increases the light in a 10-foot radius by one step, up to normal. The light imposes a –20 penalty to [[Stealth]] checks and prevents the target from benefiting from concealment from darkness, invisibility, and similar effects. The target gains a +1 morale bonus to saving throws against fear and being charmed, as do allies while they remain within the symbol’s light.
<div class="statblock">
* <<levels>>
* ''School'' necromancy (sense-dependent)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one undead creature
* ''Duration'' 1 day/level
* ''Saving Throw'' Will negates, see text
* ''Spell Resistance'' yes
</div>
This spell allows you a degree of control over an undead creature. If the target is intelligent, it perceives your words and actions favorably (treat its attitude as friendly). It will not attack you while the spell lasts. You can give the target suggestions, but you must succeed at an opposed Charisma check to convince it to do anything it wouldn't ordinarily do. (Retries are
not allowed.) An intelligent commanded undead never obeys suicidal or obviously harmful suggestions, but it might be convinced that something very dangerous is worth doing.
An unintelligent undead creature gets no saving throw against this spell. When you control a mindless being, you can communicate only basic commands, such as "Come here," "Go there," "Fight," "Stand still," and so on. Unintelligent undead won't resist suicidal or obviously harmful orders.
Any act by you or your apparent allies that threatens the commanded undead (regardless of its Intelligence) breaks the spell. You command the undead creature by voice and it understands you, no matter what language you speak.
<div class="statblock">
* <<levels>>
* ''School'' enchantment (compulsion, language-dependent, mind-affecting)
* ''Targets'' up to one creature/level, no two of which can be more than 30 ft. apart
* ''Duration'' 1 round/level
</div>
This spell functions like //[[command]]//, except you can affect up to one creature per level and the targets continue the specified activity beyond 1 round. At the start of each commanded creature's action after the first, it can attempt another Will saving throw to break free from the spell. Each creature must receive the same command.
You’re a symbol of salvation for those in your squad, a peerless tactician whose battlefield acumen is matched only by your skill at arms.
!! Tactful Tactician (1st)
Add [[Diplomacy]] to your list of soldier class skills. You gain [[Coordinated Shot]] as a bonus feat, and you can choose Charisma instead of Strength or Dexterity as your key ability score if you choose the commander fighting style as your primary fighting style. Starting at 7th level, whenever you gain a gear boost, you can instead select an envoy expertise talent. You count as having expertise with [[Bluff]], [[Diplomacy]], [[Intimidate]], and [[Sense Motive]] for this purpose, and you can select only expertise talents that require expertise with one of these four skills. If an expertise talent would require you to forgo your expertise die, you must instead spend 1 Resolve Point to use that talent.
!! Lead by Example (5th)
As a move action, you can choose one opponent within 30 feet. If you hit that opponent with any attack before the end of your turn, your allies gain the attack bonus from [[Coordinated Shot]] against that opponent, and you don’t provide that opponent cover. These benefits last until the start of your next turn.
!! Coordinated Defense (9th)
Whenever an ally attempts an attack roll while flanking with you, or when an ally benefits from your [[Coordinated Shot]] feat, they also gain a +1 insight bonus to Reflex saves and AC until the start of their next turn. If your ally’s attack hits, you gain a +1 insight bonus to Reflex saves and AC until the start of your next turn. When you use lead by example and you hit with the attack, you can spend 1 Resolve Point to grant the attack bonus from Coordinated Shot to all allies attacking any enemy within 30 feet of you; when you do, you don’t provide cover to any enemies. Both these benefits last until the start of your next turn.
!! Rallying Cry (13th)
As a move action, you can choose one ally within 30 feet that’s affected by an emotion effect and attempt a [[Diplomacy]] or [[Intimidate]] check (DC = 10 + 1-1/2 × the ally’s level). If you succeed, the effect ends. Once an ally has benefited from your rallying cry, that ally can’t gain the benefits of your rallying cry again until they take a 10-minute rest to recover Stamina Points. This is a mind-affecting, language-dependent effect. In addition, whenever you critically hit an opponent or reduce an opponent’s Hit Points to 0, you can take a reaction to grant the attack bonus from [[Coordinated Shot]] to all allies attacking any enemy within 30 feet of you; when you do, you don’t provide cover to any enemies. Both of these benefits last until the start of your next turn.
!! Legendary Example (17th)
When you successfully attack an enemy, you automatically use lead by example; this doesn’t require an action.
You oversee a fleet directly, ensuring optimal performance.
* ''Associated Skills:'' [[Diplomacy]], [[Intimidation]], or [[Piloting]]
* ''Officer Bonus:'' [[Piloting]] checks
!! Direct (Helm Phase)
Either by issuing precise commands or by piloting a key starship yourself, you set an example that the rest of your fleet follows. Attempt a DC 15 flat check. If you succeed, you grant your officer bonus to either your fleet's gunnery checks or its AC until the end of the round. If you fail the check by less than 5, your officer bonus is reduced to 1 for this action.
!! Duel (Gunnery Phase)
You direct your starship to engage with an enemy officer's starship within 3 hexes—or if your target is a capital fleet, you lead your starship in a daring attack on the enemy vessel's bridge. Attempt a check against the enemy fleet's AC + 5. You gain a +5 untyped bonus to this check if your armada has identified the fleet's officers, and you gain an additional +5 untyped bonus if the targeted fleet also uses the duel action against your fleet. If you succeed and your fleet's attack that round deals damage to the enemy fleet, the target gains the communications critical damage condition until the end of the next round. If your attack would deal critical damage to the fleet, one of the fleet's officers is incapacitated and provides no benefits for the remainder of the combat.
<div class="statblock">
* ''Level'' 15; ''Price'' 122,500
* ''EAC Bonus'' +19; ''KAC Bonus'' +24
* ''Max Dex Bonus'' +3; ''Armor Check Penalty'' –3; ''Speed'' 30 ft.
* ''Strength'' 28 (+9); ''Damage'' 2d8 B
* ''Weapon Slots'' 3; ''Upgrade Slots'' 2
* ''Capacity'' 40; ''Usage'' 1/hour
* ''Size'' Large (10-ft. reach); ''Bulk'' 40
</div>
A reinforced version of the standard [[battle harness]], this powered armor frame is most often used by squad leaders commanding units of heavily armored soldiers. Its larger size helps leaders of entire armored battalions maintain visibility and control during a confrontation.
Commandos are elite specialists, trained to endure dangerous environments and hostile situations. They are known for building a resistance against specific threats, ranging from interrogation to weather. Above all else, a commando is tough and adaptable, sent into dangerous environments either as an individual or as part of a small troop to complete important missions or escort high-value individuals.
Organizations known to train commandos are widely varying, with soldier and vanguard commandos recruited by the Veskarium military, the Skyfire Legion of the Pact Worlds, and the Gideron Authority, where they play an important role in hostile environments and combat encounters. On Ghorus Prime, specialized commando mystics act as guides and operators for wilderness lodges that manage plant-creature populations in dangerous environments. The Speakers of Embroi are known for employing envoy commandos known for showing little fear, while squads regularly escort the Guardians of Daimalko. In both the Gideron Authority and the Marixah Republic, mystic and technomancer commandos lead investigations of unknown ruins in dangerous frontiers, resulting in technological advancements; such groups include the hobgoblin-led Scarlet Horse Troop and the Diamond Spider Division from the colonies of Sansorgis. What little exploration that has occurred on the floating ruins of Tabrid Minor is conducted largely by well-prepared commando biohackers and adaptable commando solarians.
The commando archetype grants alternate class features at 4th, 6th, and 12th levels, and an alternate class feature that can be selected at 9th level, 18th level, both, or neither.
!! Commando Conditioning (4th)
You have learned how to steel yourself against a specific type of hostile environment. Choose one conditioning style from those listed below. You gain a +2 insight bonus to saving throws against the types of effects listed in any conditioning styles you have selected from this archetype. This is your conditioning bonus. If your conditioning bonus would apply multiple times to a single saving throw, instead increase your conditioning bonus by +1 for every time after the first that it would apply.
!!! Conditioning Styles
The following conditioning styles are available to commandos. Each conditioning style can be taken only once.
* ''Attention Division:'' Your conditioning bonus applies against sense-dependent effects.
* ''Caustic Training:'' Your conditioning bonus applies against effects that would cause the [[entangled]] condition and effects that deal acid damage.
* ''Combat Chance:'' Your conditioning bonus applies against critical hit effects and effects that would force you to roll multiple times and take the worst result.
* ''Counter-Interrogation:'' Your conditioning bonus applies against charm and pain effects.
* ''Extreme Cold:'' Your conditioning bonus applies against cold dangers and effects that deal cold damage.
* ''Extreme Heat:'' Your conditioning bonus applies against heat dangers and effects that deal fire damage.
* ''Gamma Protocols:'' Your conditioning bonus applies against radiation and transmutation spells.
* ''Hardened Demeanor:'' Your conditioning bonus applies against compulsion effects and fear effects.
* ''Mental Fortress:'' Your conditioning bonus applies against mind-affecting effects.
* ''Storm Training:'' Your conditioning bonus applies against effects that deal electricity or sonic damage.
* ''Temple Body:'' Your conditioning bonus applies against diseases (other than addiction) and poisons.
!! Exceptional Endurance (6th)
Your field training makes you exceptionally tough. Choose an additional conditioning style. In addition, you add your class level to your total Stamina Points.
!! Further Conditioning (9th and 18th)
Optionally, you can choose an additional conditioning style.
!! Exposure Training (12th)
You have learned how to make the most out of any situation, even ones you're not specifically trained for. Choose an additional conditioning style. Additionally, once per day as a reaction when you attempt a saving throw that your conditioning bonus doesn't apply to, you can apply your conditioning bonus to that saving throw.
<div class="statblock">
* ''CR'' 2; ''XP'' 600
* N Large animal
* ''Init'' +5; ''Senses'' [[blindsense]] (scent) 60 ft.; ''Perception'' +7
* ''Aura'' algal gas (30 ft., Fortitude DC 11)
!!! DEFENSE
* ''HP'' 25
* ''EAC'' 13; ''KAC'' 16
* ''Fort'' +6; ''Ref'' +6; ''Will'' +1
* ''Weaknesses'' flammable
!!! OFFENSE
* ''Speed'' 60 ft., swim 30 ft.
* ''Melee'' gore +10 (1d6+4 P) or tail +10 (1d4+4 B)
* ''Space'' 10 ft.; ''Reach'' 5 ft. (10 ft. with tail)
* ''Offensive Abilities'' [[ferocious charge]]
!!! STATISTICS
* ''Str'' +2; ''Dex'' +4; ''Con'' +1; ''Int'' –5; ''Wis'' +1; ''Cha'' –2
* ''Skills'' [[Athletics]] +7
* ''Other Abilities'' marshborn
!!! ECOLOGY
* ''Environment'' any marsh (Castrovel)
* ''Organization'' solitary, pair, or herd (3–12)
!!! SPECIAL ABILITIES
''Algal Gas ([[Ex]])'' Swamp striders' fur supports thriving colonies of algae that emit malodorous, flammable gas. Creatures in the algal gas effect are [[sickened]] while they remain in the aura and for 1 round afterward (Fortitude DC 11 negates). Creatures with active environmental protections or no sense of smell are immune to this sickened effect.
''Flammable ([[Ex]])'' When a swamp strider takes fire damage, it also gains the [[burning]] (1d8 F) condition, after which the creature's algal gas and flammable abilities are disabled for 1 hour. While it burns, the swamp strider's attacks deal an additional 1d4 fire damage.
''Marshborn ([[Ex]])'' A swamp strider can move through bogs without penalty to its normal speed.
</div>
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 standard action
* ''Range'' 30 ft.
* ''Targets'' the caster and all allies within a 30-ft. burst, centered on the caster
* ''Duration'' 10 minutes/level
* ''Saving Throw'' none
* ''Spell Resistance'' yes (harmless)
</div>
This spell arises from ghorans’ tradition of imbuing their group projects and celebrations of togetherness with magic. Targets gain a +1 morale bonus to saving throws against fear effects while they’re observing at least one other target of the same casting of this spell. Also, when a target successfully aids another target of the same casting of this spell, or provides such a creature covering or harrying fire, the bonus from successfully doing so is +3 instead of +2.
[[Shirrens]] are used to working with others as part of a team, and subtle rewiring of your neural pathways adjusts your thought processes to approach collaboration similarly. Once per day, as long as an ally is within 10 feet, you can roll a single attack roll or skill check twice and take the higher result.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|communalism graft | 5 | 2,800 | brain |
</div>
<div class="statblock">
* ''Script'' [[Prepare the Space]] (Mysticism; failure), [[Sacrifice]] (1 Resolve Point), [[Invoke Entity]] (Will; fatigued, retry), [[Sacrifice]] (items worth 1,000 credits)
* ''Assistants'' 3
* ''Round Length'' 1 hour
</div>
You call upon an unknown planar entity to answer questions. This is a servitor of your deity if you have one. You can ask up to seven questions that can be answered with “Yes” or “No.” The entity is likely to know answers related to its purview; a servitor of Triune would know about objects located in the Drift, and a servitor of Damoritosh would know about the Veskarium. The entity answers with one-word answers such as “Yes,” “No,” “Likely,” or “Unknown,” though its answers always reflect its own agenda and could be deceptive. This ritual can’t uncover information directly related to the Gap.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Range'' personal
* ''Duration'' instantaneous
</div>
You become one with nature, attaining knowledge of the surrounding territory. You instantly gain knowledge of up to three facts from among the following subjects: the ground or terrain, plants, minerals, bodies of water, people, general animal population, presence of native creatures, presence of powerful unnatural creatures, or general state of the natural setting.
In outdoor settings, the spell operates in a radius of 1 mile per caster level. In natural underground settings—caves, caverns, and the like—the spell is less powerful and its radius is limited to 100 feet per caster level. The spell does not function where nature has been replaced by construction or settlements, such as in cities, factories, and starships.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 10 minutes
* ''Range'' personal
* ''Duration'' instantaneous
</div>
You form a connection with a planet you are on or in orbit of, instantly learning up to three facts from among the following: major settlements, basic attributes (location in the galaxy, diameter and mass, gravity, atmosphere, and day and year length), ecological state (such as untamed, cultivated, polluted, destroyed by war, and so on), intelligent life, the presence of powerful or unusual creatures, and technological installations.
\define compact(filter)
<$set name="sub" value="$filter$" >
<$list filter="[subfilter<sub>nsort[level]]">
<details class="compact">
<summary><$view field="caption"><$view field="title"/></$view>
<$list filter="[all[current]tag[Push]]"> (Push)</$list>
<span class="level" >
<$list filter="[all[current]!field:level[]]"> (<$view field="level"/><$list filter="st nd rd +[nth{!!level}]" emptyMessage="th" template="plain" />)</$list>
</span></summary>
<div class="section">
<$transclude mode="block" />
</div>
</details>
</$list>
</$set>
\end
Examples:
<<compact '[tag[Unthemed]]'>>
<<compact '[tag[Ability Descriptions]]'>>
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' the caster plus one willing creature (see text)
* ''Duration'' 1 hour/level (D)
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
As the lashuntas who created this spell, you forge a telepathic link with a pet, mount, or other creature, provided the creature has an Intelligence modifier and that modifier is –2 or lower, and the creature is of the aberration, animal, dragon, magical beast, or plant type. Any creature that you have as a creature companion can instead be the target of this spell. You can communicate telepathically through the bond, regardless of language. No special power or influence is established because of the bond. Once the bond is formed, it works over any distance provided you and the target are on the same plane. If the creature has an intelligence modifier of –3 or higher, they can communicate simple thoughts through the bond to you. Otherwise, the creature can communicate feelings through this bond but not words or complex concepts. If the target is your creature companion, it doesn’t need to see or hear you to receive your commands, and you receive a +2 morale bonus to [[Survival]] checks to control or ride the creature.
<div class="statblock">
* ''Tier'' 1/3
* Tiny racer
* ''Speed'' 8; ''Maneuverability'' perfect (turn 0); ''Drift'' 1
* ''AC'' 15; ''TL'' 12
* ''HP'' 20; ''DT'' —; ''CT'' 4
* ''Shields'' basic 10 (forward 3, port 2, starboard 2, aft 3)
* ''Attack (Forward)'' mining laser (2d6)
* ''Power Core'' Micron Light (50 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic computer, basic short-range sensors, data net, mk 3 armor
* ''Modifiers'' +2 [[Computers]], +2 [[Piloting]]
* ''Complement'' 1
!!! CREW
* ''Science Officer'' [[Computers]] +12 (1 rank), gunnery +4, [[Piloting]] +7 (1 rank)
</div>
The anacite pilot of a specific Autonomous Exploration Vehicle is often created and programmed to fit inside of and operate that vessel. Once its mission has been completed, its consciousness is usually transferred to another shell.
<div class="statblock">
* ''Tier'' 8
* Large destroyer
* ''Speed'' 6; ''Maneuverability'' average (turn 2); ''Drift'' 1
* ''AC'' 23; ''TL'' 20
* ''HP'' 190; ''DT'' —; ''CT'' 38
* ''Shields'' medium 140 (forward 35, port 35, starboard 35, aft 35)
* ''Attack (Forward)'' particle beam (8d6)
* ''Attack (Port)'' coilgun (4d4)
* ''Attack (Starboard)'' coilgun (4d4)
* ''Attack (Aft)'' coilgun (4d4)
* ''Attack (Turret)'' flak thrower (3d4)
* ''Power Core'' Pulse Orange (250 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' advanced mid-range sensors, anti-hacking systems, crew quarters (common), data net, mk 2 trinode computer, mk 4 defenses, mk 6 armor; ''Expansion Bays'' [[launch tubes]] (2, each holding 1 AEV)
* ''Modifiers'' +2 any three checks per round, +4 [[Computers]], +1 [[Piloting]]
* ''Complement'' 20
!!! CREW
* ''Captain'' [[Computers]] +25 (8 ranks), [[Diplomacy]] +16 (8 ranks), [[Engineering]] +21 (8 ranks), gunnery +13, [[Piloting]] +17 (8 ranks)
* ''Engineer (1 officer, 2 crew)'' [[Engineering]] +21 (8 ranks)
* ''Gunners (2 officers, 2 crew each)'' gunnery +19
* ''Pilot (1 officer, 3 crew)'' [[Piloting]] +22 (8 ranks)
* ''Science Officers (2 officers, 2 crew each)'' [[Computers]] +25 (8 ranks)
</div>
CompEnt engineers design Group Defense Frigates with little regard to aesthetic concerns, though some find their stark utilitarianism an enticing feature.
<div class="statblock">
* ''Tier'' 5
* Huge bulk freighter
* ''Speed'' 4; ''Maneuverability'' poor (turn 3); ''Drift'' 1
* ''AC'' 15; ''TL'' 15
* ''HP'' 180; ''DT'' 5; ''CT'' 36
* ''Shields'' Basic 40 (forward 10, port 10, starboard 10, aft 10)
* ''Attack (Forward)'' heavy laser cannon (4d8; 10 hexes)
* ''Attack (Aft)'' heavy laser array (6d4; 5 hexes)
* ''Attack (Turret)'' light laser cannon (2d4; 5 hexes)
* ''Power Core'' Nova Light (150 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic computer, basic short-range sensors, crew quarters (common), mk 2 armor, mk 2 defenses; ''Expansion Bays'' [[cargo holds]] (6), [[guest quarters]] (4, common)
* ''Modifiers'' +2 [[Computers]] (sensors only), +1 [[Piloting]]
* ''Complement'' 20 (minimum 20, maximum 50)
!!! CREW
* ''Captain'' [[Computers]] +8 (5 ranks), [[Diplomacy]] +11 (5 ranks), [[Engineering]] +8 (5 ranks), gunnery +10 (5th level), [[Intimidate]] +11 (5 ranks), [[Piloting]] +10 (5 ranks)
* ''Engineer (1 officer, 4 crew)'' [[Engineering]] +11 (5 ranks)
* ''Gunners (3 officers, 2 crew each)'' gunnery +10 (5th level)
* ''Pilot (1 officer, 1 crew)'' [[Piloting]] +11 (5 ranks)
* ''Science Officer (1 officer, 2 crew)'' [[Computers]] +16 (5 ranks)
</div>
The Compiler Enterprises Star Settler is a versatile and spacious transit ship designed in line with that company's aim of helping civilization spread to uninhabited worlds. Slow and ungainly, as its anacite builders did not particularly see the need for hurry, a Star Settler comes fitted with life-support systems to carry breathing crews and ferry cargo with efficiency. Not much else in the way of comfort can be found on board.
A Star Settler is capable of long-term operation with minimal power and features vast solar panels on its exterior that gather enough energy to maintain basic functionality even in the darkest depths of space. It is also fitted with a Drift engine for when such long-term travel isn't practical. While not intended for combat by any stretch of the imagination, the Star Settler does possess armament for defense should the need arise. But the most interesting feature of the vessel is its modularity: though a Star Settler is too large to make landfall on a planet, it can be broken down into individual pieces in orbit to provide ready-made structures for settlers to inhabit and use.
According to CompEnt market research, weapons systems are among the first upgrades to most independently owned Star Settlers (with faster thrusters a close second). The company has recently begun manufacturing variant models to adapt to customers' needs, but the reliability and affordability of the Star Settler keeps it in production.
<div class="statblock">
* ''Tier'' 17
* Colossal dreadnought (colony ship)
* ''Speed'' 6; ''Maneuverability'' clumsy (turn 6); ''Drift'' 1
* ''AC'' 26; ''TL'' 24
* ''HP'' 600; ''DT'' 15; ''CT'' 120
* ''Ablative Armor'' heavy 400 (forward 100, port 100, starboard 100, aft 100)
* ''Shields'' light [[deflector shields]] 8 (DV 8, +1 AC, +2 TL)
* ''Attack (Forward)'' quantum missile launcher (2d8×10; 20 hexes), super orbital particle cannon (2d6×10; 20 hexes)
* ''Attack (Port)'' superlaser (2d4×10; 20 hexes)
* ''Attack (Starboard)'' superlaser (2d4×10; 20 hexes)
* ''Attack (Turret)'' light particle beam (3d6; 10 hexes), linked light torpedo launchers (4d8; 20 hexes), tactical nuclear missile launcher (5d8; 20 hexes)
* ''Power Core'' Gateway Ultra (500 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' advanced short-range sensors, crew quarters (common), mk 6 armor, mk 6 defenses, mk 3 trinode computer; ''Expansion Bays'' [[arcane laboratory]], [[cargo holds]] (40), [[conference room|Conference and Meeting Rooms]], [[medical bay]], physical [[science lab]], [[shuttle bay]], [[tech workshop]]
* ''Modifiers'' +3 to any 3 checks per round, –2 to [[Piloting]], +4 [[Computers]] (sensors only)
* ''Complement'' 328 (minimum 125, maximum 500)
!!! CREW
* ''Captain'' [[Diplomacy]] +29 (17 ranks), gunnery +25 (17th level), ''Intimidate'' +29 (17 ranks), ''Piloting'' +29 (17 ranks)
* ''Engineers (3 officers, 40 crew each)'' [[Engineering]] +34 (17 ranks)
* ''Gunners (4 officers, 20 crew each)'' gunnery +25 (17th level)
* ''Pilot (1 officer, 15 crew)'' [[Piloting]] +27 (17 ranks)
* ''Science Officers (4 officers, 25 crew each)'' [[Computers]] +29 (17 ranks)
</div>
[[Compiler Enterprises]] (CompEnt) isn't known for building starships with extreme firepower, but its latest design represents a major departure from that reputation. The company hasn't officially acknowledged the dreadnought //Those Who Are// or addressed why it set off bristling with weaponry, but its construction suggests an alarming change in CompEnt's mission.
//Those Who Are// is massive, even for CompEnt. It showcases the company's trademark ample cargo space but, instead of customizable modular bays, boasts state-of-the-art shielding and armor, advanced weaponry, and housing for hosts of passengers. Lumbering at slow speeds and carrying a cannon designed to assault planetoids, //Those Who Are// seems built for wartime endurance and little else.
The most popular rumor as to the ship's purpose is that the Those Who Become anacites crafted it to seek out and avenge their own missing spacecraft. Others suggest that Those Who Become discovered a terrible threat outside the galaxy and designed their warship for when that nebulous enemy arrives. It's also possible the ship is designed to wipe out other planets' settlements and forcibly colonize those worlds. Realistically, CompEnt likely custom-built the ship for another party. The ship's name certainly lends credence to the existence of a new Aballonian faction, possibly one that adheres to the technological unity of Singularitism. Private organizations such as the Prophets of Kalistrade are also rumored to have ties to CompEnt, and certain political factions in Near Space, like the Veskarium, might appreciate the ship's munitions.
Despite these likely explanations, another unsettling rumor persists: that Those Who Become found the First Ones during their travels and, with the very foundations of their beliefs challenged, intend to wipe their creators from the galaxy in order to truly ascend.
<div class="statblock">
* ''Tier'' 8
* Huge bulk freighter
* ''Speed'' 6; ''Maneuverability'' poor (turn 3); ''Drift'' ''2
* AC'' 20; ''TL'' 21
* ''HP'' 200; ''DT'' 5; ''CT'' 40
* ''Shields'' medium shields 140 (forward 35, port 35, starboard 35, aft 35)
* ''Attack (Forward)'' heavy laser cannon (4d8)
* ''Attack (Turret)'' light plasma torpedo launcher (3d8; 14 hexes)
* ''Power Core'' Nova Heavy (200 PCU); ''Drift Engine'' Signal Booster
* ''Systems'' basic short-range sensors, anti-hacking systems, biometric locks, crew quarters (good), mk 4 armor, mk 5 defenses, mk 2 duonode computer; ''Expansion Bays'' [[cargo holds]] (7), [[escape pods]], [[guest quarters]] (luxurious), [[recreation suite]] (trivid den)
* ''Modifiers'' +2 to any 2 checks per round, +2 [[Computers]] (sensors only), +0 [[Piloting]]
* ''Complement'' 20 (minimum 4, maximum 50)
!!! CREW
* ''Captain'' [[Computers]] +16 (8 ranks), [[Diplomacy]] +16 (8 ranks), gunnery +14 (8th level), [[Intimidate]] +16 (8 ranks), [[Piloting]] +16 (8 ranks)
* ''Engineer'' [[Engineering]] +16 (8 ranks)
* ''Gunner'' gunnery +14 (8th level)
* ''Pilot'' [[Piloting]] +21 (8 ranks)
!!! SPECIAL ABILITIES
''Automated Operations'' Many systems on the //CompEnt Windfall// are automated, allowing the ship to operate with a skeleton crew of as few as four. These systems can be manually overridden to operate the ship with a full complement, with additional crew members filling roles of their choosing.
</div>
The //CompEnt Windfall//, a proprietary design of the Kalistocracy, is manufactured exclusively by Compiler Enterprises on the Horse Eye Orbital Plate near Aballon. The station produces one starship per month for the purpose of being ferried to the Fortune's Heart transfer station, loaded with treasure, and auctioned off to eager Kalistocrats. The Windfall is therefore fairly rare; most of those in existence are owned by Kalistocrats who have won previous auctions or those who have purchased them from these winners. Selling one's auction ship isn't necessarily frowned upon by Kalistocrats, though most would be reluctant to part with such a symbol of economic triumph.
The //Windfall// is designed to operate via partial automation by default, requiring only a small skeleton crew to maintain the systems. Though it has enough weaponry to defend itself, it's primarily a cargo ship; rather than sheer firepower, the //Windfall's// security comes more from the secrecy of its route, biometric locks to ensure only authorized individuals are allowed onboard, and anti-hacking systems to avoid breaches. Even so, piracy of the barges has recently increased as word of their valuable cargo has spread, so upgrades in armaments are likely imminent.
Most of the //Windfall's// floor plan is dedicated to cargo bays, with space reserved for a luxurious stateroom so that the winner of the auction might enjoy their journey in comfort, as well as a trivid den for the crew or the auction winner and their retinue to entertain themselves during long trips. The //Windfall's// decor is ostentatiously expensive and elegant, with gold-trimmed molding, jeweled light fixtures, and sumptuous furnishings. The crew quarters, though not as extravagant as the stateroom, are quite comfortable, and piloting a //Windfall// to Fortune's Heart is generally considered a plush gig among those in the know—assuming they can pass the rigorous security checks required.
!!! Anacite Explorers
<div class="statblock">
* ''Manufacturing Centers'' Aballon (Horse Eye Orbital Plate, Pursuit, Striving)
* ''Specialties'' Colony ships and explorers
* ''Famous Models'' [[AEV|CompEnt AEV]], [[Group Defense Frigate|CompEnt Group Defense Frigate]], //[[Those Who Are|CompEnt Those Who Are]]//
</div>
As the philosophies of the two major sects of anacites on Aballon took shape, the group known as Those Who Become began to reach out to the stars. Believing it their destiny to take up the mantle of their creators, Those Who Become strive to colonize distant worlds. However, no existing companies were able to meet their specific needs on the scale they required. Few companies produce enough ships to transport an entire colony into the unknown without a known destination or expected transit time. These anacites tried purchasing ships from multiple manufacturers to assemble a fleet, but it still wasn't enough. However, the time they spent refitting vessels to suit their needs taught them a great deal about starship construction. They embraced their new expertise, and the first ships sailed off Compiler Enterprises (CompEnt)'s relatively small production line shortly thereafter. Today, CompEnt is the premiere manufacturer of large vessels designed for long-term operation with few—or no—opportunities to return home for maintenance.
Those Who Become operate the company with a design philosophy influenced by their belief that they are the inheritors of the First Ones. Large colony ships and long-term deep space exploration vessels make up the bulk of the company's production. Unlike starship manufacturers that equip ships with a fixed suite of expansion bays to serve the ships' intended purposes, CompEnt ships boast modular expansion bays that allow for heavy modification. A new starship's bays are left empty, enabling the buyer to configure the ship however they like. These cavernous interiors make CompEnt vessels very popular as smuggler ships, cargo haulers, and passenger transports.
Being of Aballonian design, CompEnt's ships have a simple, practical look. The ships' hulls are polished to a shine but are otherwise unadorned beyond the hull markings, giving them a feel of rugged accessibility and suggesting they're just the sort of ships to help colonists accomplish their dreams. In addition to the usual customization options, CompEnt also builds ships with unusual materials on request. Rumors say that the company is involved in manufacturing the golden commerce barges of the Prophets of Kalistrade—no surprise, given most of those opulent starships originate in Aballon's Horse Eye Orbital Plate shipyards. But other reports suggest this lucrative contract was in fact stolen from CompEnt by another ruthless (and so far unknown) corporate rival, and that CompEnt is debating how ruthless its own response should be. Regardless, its ships also support large complements while minimizing the requirements for each crew member and providing a great deal of space, which certainly fulfills the requirements of followers of the Prophecies and other luxury clients.
''Manufacturer Perk:'' [[External expansion bays]] installed on CompEnt starships cost only 2 BP each (rather than 3 BP).
With understanding and experience, you can manipulate your genetics to gain unexpected secondary effects.
''Prerequisites:'' [[Life Science]] 5 ranks, early stage adaptation racial trait
''Benefit:'' When you use early stage adaptation, you can choose two different benefits instead of only one.
The control module allows the computer to operate a complex device, to which it must be in some way connected. (Simpler devices can be controlled as part of a computer's basic functions.) Some countermeasures might make use of a computer's control modules when activated. Gaining control of a computer allows the user to activate the devices in any way allowed by the control module. The price of a control module depends on the complexity of the object being controlled. The control module for a more complex device, such as a spy drone, vehicle, or weapon turret, costs 10% of the device to be controlled.
When controlling a basic device that essentially has an on/off switch, the computer simply gains access to that switch and can activate or deactivate the connected device as instructed. When in charge of a device that can already operate autonomously (such as a robot or another computer), the controlling computer can give orders to that device. When operating a device that requires a skill check or attack roll (such as a computer hooked to a med-bed or weapon), the controlling computer can either allow a creature with authorized access to attempt a skill check or attack roll, or attempt the skill check or attack roll itself. When making its own check, the computer is assumed to have an attack bonus equal to its tier, proficiency with any weapon it controls, and a total skill bonus equal to 2-1/2 × its tier. Such controlled objects are normally mounted to a specific location (such as a controlled longarm placed in a turret with line of sight to the computer's terminal), in which case the mount and related components are included in the control unit price.
A computer can also control another computer. In this case, hacking one computer allows you to attempt to hack any computer it controls, but this does not automatically give you access to those other computers. It's common for a lower-tier computer to be set up to control a higher-tier computer, such as when a clerk's desk computer is linked to a company mainframe. In these cases, the lower-tier computer can only send specific, authorized commands to the higher-tier computer, though it can still be used as an access point in an attempt to hack the higher-tier computer.
With a wider beam than typical lasers, the compliance ray is designed for crowd control and other nonmilitary uses. Although these rays are legal for civilians to own, most models are themed to fit in with the local constabulary's armor; the Stewards' blue-and-gold models are common throughout the Pact Worlds. Shots from these pistols cause intense discomfort, and a hit to the eyes can cause temporary blindness. Models begin with the flash designation and increase in intensity as follows: flare, strobe, starburst, and sunspot.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|compliance ray, flash | 3 | 1,400 | 1d6 F | 60 ft. | [[blind]] | 20 charges | 1 | L |[[nonlethal]] |
|compliance ray, flare | 7 | 6,400 | 2d4 F | 60 ft. | [[blind]] | 20 charges | 1 | L |[[nonlethal]] |
|compliance ray, strobe | 11 | 25,100 | 4d4 F | 60 ft. | [[blind]] | 20 charges | 1 | L |[[nonlethal]] |
|compliance ray, starburst | 15 | 171,000 | 6d4 F | 60 ft. | [[blind]] | 20 charges | 1 | L |[[nonlethal]] |
|compliance ray, sunspot | 19 | 545,000 | 9d4 F | 90 ft. | [[blind]] | 20 charges | 1 | L |[[nonlethal]] |
</div>
Marketed for the modern sustainable lifestyle, this dormant, biogenetically-engineered nanite organism is sold securely sealed within its own industrial grade plastic container. Once you unseal the package, the composter slime becomes active and requires at least 1 bulk of organic matter per week to survive. Once per week, you can feed the composter slime an object of no more than 1 bulk and whose price does not exceed 500 credits and, after 24 hours of digestion, the slime excretes dry waste pellets that function as UPBs with a market value equal to half that of the item consumed. These pellets are semi-stable, degrading into worthless powder after one month if not used to craft an object. Composter slimes are functionally sessile.
Once active, a composter slime lives for 20 weeks before dying of old age.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|composter slime | 5 | 2,000 | — |
</div>
You can sift through many realities, gaining understanding of a task by seeing it attempted dozens of different ways. Choose a skill. You gain a +1 insight bonus to checks using that skill. This bonus increases by +1 at 6th level and every 3 levels thereafter. You can change your chosen skill every time you gain a witchwarper level. At 9th level, you become more adept with your compound sight and can choose two skills to apply it to.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' reaction
* ''Range'' personal
* ''Targets'' you
* ''Duration'' 1 hour/level
* ''Saving Throw'' none (harmless)
* ''Spell Resistance'' no (harmless)
</div>
This spell grants you a +2 insight bonus to [[Culture]] checks you attempt during the duration. The insight you gain might help you greet someone properly, know whether physical contact (a handshake, for example) is appropriate, or how to eat without making a mess or insulting your host. In addition, when you attempt [[Diplomacy]] checks to change attitudes during the duration, you can lower the DC by 5. This spell does not replace careful study of a culture, nor does it give insight beyond events that occur during the duration.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Duration'' 10 minutes/level
</div>
You can understand the spoken or signed words of creatures or read otherwise incomprehensible written or tactile messages. The ability to read does not necessarily impart insight into the material, merely its literal meaning. The spell enables you to understand or read an unknown language, not speak or write it. You can't use this spell to read magic writing or encoded messages (though it does reveal if a message is magic or encoded), but you can use it to read raw computer code or foreign programming languages, allowing you to understand enough to attempt [[Computers]] checks on those materials without penalties.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' 1 creature
* ''Duration'' 1 round/ level (D)
* ''Saving Throw'' Fortitude negates
* ''Spell Resistance'' yes
</div>
This spell compresses the body of the target, reducing their size by one category (to a minimum of Small) for the purposes of squeezing and of the number of squares it occupies. The target’s speed is reduced by 5 feet, and it can’t [[run]] or [[charge]] while compressed.
This spell doesn’t confer bonuses, inflict penalties, or trigger effects that would otherwise result from changing a creature’s size.
The creature can move through an area as small as one-quarter of its space without squeezing or one-eighth its space when squeezing.
//Format:// ''Other Abilities'' compression.
When a foe attempts to hack a starship's computers and fails, a set of countermeasures can punish the would-be hacker. The crew can install countermeasures following the normal rules. Each countermeasure costs a number of Build Points equal to the starship's computer's tier.
<div class= "table-wrapper">
|System | PCU | Cost (in BP) |h
|computer countermeasures | 0 | tier of computer |
</div>
<div class="statblock">
* ''CR'' 1/2; ''XP'' 200
* LE Tiny fey
* ''Init'' +2; ''Senses'' //[[detect tech]]// (computers only); [[low-light vision]]; ''Perception'' +4
!!! DEFENSE
* ''HP'' 5
* ''EAC'' 9; ''KAC'' 10
* ''Fort'' +2; ''Ref'' +2; ''Will'' +3
* ''Defensive Abilities'' networked technomancy; ''Resistances'' cold 5, electricity 5; ''SR'' 11
* ''Weaknesses'' [[vulnerable]] to fire
!!! OFFENSE
* ''Speed'' 20 ft., climb 20 ft.
* ''Melee'' bite +2 (1d4–1 P plus glitch module, DC 10)
* ''Space'' 2-1/2 ft.; ''Reach'' 0 ft.
* ''Offensive Abilities'' glitch module, networked technomancy
* ''Spell-Like Abilities'' (CL 1st; melee +1, ranged +1)
** 1/day—//[[erase]]//, //[[jolting surge]]//
** At will—//[[energy ray]]// (electricity only), //[[ghost sound]]// (DC 13), //[[transfer charge]]//
** Constant—//[[detect tech]]// (computers only)
!!! STATISTICS
* ''Str'' –1; ''Dex'' +2; ''Con'' +1; ''Int'' +3; ''Wis'' +1; ''Cha'' –2
* ''Skills'' [[Computers]] +9, [[Engineering]] +4 (+9 to use computers), [[Stealth]] +9
* ''Languages'' Aklo, Common; digital telepathy 30 ft.
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' pair or infection (3–8)
!!! SPECIAL ABILITIES
''Digital Telepathy ([[Su]])'' A computer glitch gremlin can communicate telepathically only with digital devices and with other creatures that can do so (such as other computer glitch gremlins). This allows the glitch gremlin to attempt [[Computers]] checks to access any computer within the telepathy's range.
''Glitch Module ([[Su]])'' When a glitch gremlin succeeds at a [[Computers]] check to access a system or hits a foe with an attack or spell, the accessed system or one random computer held or carried by the struck creature glitches. An attended computer (including any computer on a creature hit by a computer glitch gremlin's attack or spell) negate this effect by succeeding at a DC 10 Will save. The glitch causes one of the following effects, which functions as if the system had the indicated countermeasure (DC = 16 + the number of glitch gremlins within 30 feet when the glitch was added):
@@.special
* a fake shell countermeasure that obstructs all users
* an alarm that plays a loud and potentially embarrassing audio or holographic file when accessed by any user unless the user succeeds at a [[Computers]] check as if hacking the system
* one randomly determined countermeasure that applies even to users with root access.
@@
@@text-indent:0em;
Disabling or removing this glitch requires a Computers check as if disabling or removing a module. A disabled glitch reactivates after 1d10 minutes if not removed. A system can have no more than one glitch per module.
@@
''Networked Technomancy ([[Sp]])'' When gathered in groups, computer glitch gremlins share their magic. As long as a computer glitch gremlin is within 30 feet of another of its kind, it gains concealment thanks to erratic holograms that falteringly appear near it and emulate the appearance of surrounding objects. Groups of computer glitch goblins can also use more potent spell-like abilities; each gremlin in the group except for one takes a standard action to prepare the spell-like ability, and the final gremlin actually uses it. Two computer glitch gremlins can use //[[implant data]]// or //[[logic bomb]]// (DC 15), four can use //[[holographic image]]// (3rd level, DC 16) or //[[instant virus]]// (DC 16), and six can use
//[[destruction protocol]]// (DC 17).
</div>
A //computer idol// is a small statuette that creates a field of good luck during computer use. These figures vary wildly in shape, from religious figures to trivid mascots. When you fail a [[Computers]] check, the //computer idol// allows you to reroll and take the higher result. You must be within 5 feet of your //computer idol// and able to see it to benefit from it.
A //computer idol// allows a number of rerolls per day based on its type. Once you benefit from a given //computer idol//, you can't benefit from a different one for 24 hours.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Rerolls/Day |h
|//computer idol//, mk 1 | 4 | 1,850 | L | 1 |
|//computer idol//, mk 2 | 8 | 8,500 | L | 2 |
|//computer idol//, mk 3 | 12 | 34,000 | L | 3 |
</div>
Your armor is wired to allow an integrated onboard computer to monitor your condition and operate some functions of your armor. An armor interface comes with a tier 1 computer with an artificial personality and a single control module linked to your armor. You can access this computer without exposing it or yourself to the environment outside of your armor, and you receive information from it through heads-up displays and broadcasts via your armor's integrated [[comm unit]].
With a successful [[Computers]] check (DC = the DC needed to hack the computer) you can set the computer to give basic information about your condition (blood pressure, heart rate, temperature, and so on) to authorized users (which you designate), or to anyone with a [[medkit]], [[advanced medkit]], or [[medical lab]]. Characters who can access this information gain a +2 circumstance bonus to [[Medicine]] checks they attempt on you.
With 10 minutes of work, you can set the computer's control module to operate any one system in your armor, as long as that system doesn't take a full action or longer to activate or deactivate. Common applications are environmental protections or a [[force field]] armor upgrade. You can set the computer to operate the upgrade at your command (allowing you to activate one such item each round without taking an action to do so), or set it to automatically trigger the system under specific conditions as follows: the first time you take damage, the first time you take Hit Point damage, when you are [[stunned]], when you are [[staggered]], when you are [[unconscious]], or when the atmospheric conditions change. If the trigger occurs, the computer automatically activates the linked system. This occurs at the end of your next turn after the condition occurs. The control module can be linked to weapons or tools that are part of the armor, subject to the normal limitations of control modules.
You can install a higher-tier computer into the computer interface, as long as it has light or negligible bulk. You must pay for the additional computer separately, and installing it requires a successful [[Computers]] check with a DC equal to the DC to hack the new computer. The computer cannot have countermeasures that require links to the environment beyond the armor (such as a shock grid) or control modules that control anything other than armor systems, and it cannot activate more than one system each round (even if linked to multiple systems with automatic triggers).
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|computer interface | 7 | 6,000 | 1 | any | — |
</div>
When you attempt a [[Computers]] check, you can choose not to roll your expertise die until later. After you determine what the check's result would be, you can choose to either roll your expertise die and add it to the total or forgo the expertise die and reroll the check. At 9th level, you can spend 1 Resolve Point to both reroll the check and add the result of your expertise die.
Your vehicle contains a limited [[virtual intelligence]] that can control the vehicle for short periods of time.
* ''Adjustments:'' Increase price by 5%.
* ''Systems:'' The vehicle gains an [[autopilot]] with a [[Piloting]] bonus equal to 4 + 1-1/2 × the vehicle's level.
<$list filter="[list[$:/StoryList]is[current]]">
Each computer system is made up of various simple statistics that tell the GM how the computer functions, what it knows, what it controls, and what it can do to defend itself. This information is presented in the following terms.
!! Tier
The computer's tier indicates its overall technological sophistication, from 1 to 10. A tier-1 computer might be something as simple as a common datapad, a door lock, or a lighting controller, whereas a tier-10 computer represents the systems managing the engine core of a space station or the mainframe of an Aspis Consortium intersystem office. A computer's effective item level is equal to twice its tier (or 1 for computers of tier 0 and lower). Note that the workstation of a tier-10 computer mainframe might itself be only a tier-3 computer, but it cannot in any way access or control the full mainframe, even if hacked; it can interface with only the components to which it has been granted access. Thus, access to the mainframe itself and features it controls requires hacking its tier-10 defenses.
The tier of a computer determines its base price and the base DC to hack into its system using a Computers check. Both of these are modified by the modules and countermeasures installed on a system. The base DC to hack a computer is equal to 13 + 4 per tier.
<div class="table-wrapper">
|Tier | Price | DC to Hack |h
|1 | 50 | 17 |
|2 | 250 | 21 |
|3 | 1,250 | 25 |
|4 | 5,000 | 29 |
|5 | 10,000 | 33 |
|6 | 20,000 | 37 |
|7 | 40,000 | 41 |
|8 | 80,000 | 45 |
|9 | 160,000 | 49 |
|10 | 320,000 | 53 |
</div>
!! User Interface
A computer's control module is the input device and display designed to allow you to enter commands into and receive data from the computer. In the Pact Worlds, most user interfaces include a keyboard, view screen, microphone, and speakers, to allow typed, spoken, or gesture-based commands to be given to the computer and to deliver graphic or audio data from the computer. These kinds of user interfaces come free with any system, and a computer can have as many as ten user interfaces per point of bulk the computer has (though normally only public systems or computers used by large companies do this).
It is also possible for a user interface to exist only as a broadcast device (such as a comm unit), or even to have another smaller computer act as a user interface (using a control module). You can set a computer to use this kind of user interface for free when you buy it, though you must pay for the additional device separately, or you can install (or remove) user interfaces using the disable or manipulate module task of the Computers skill to alter a user interface. Such additional user interfaces do not count against the total modules a computer can have.
You can use a [[hacking kit]] to access a computer without using a user interface, but this requires you to have physical contact with the computer or to make contact through an infosphere or similar network that is linked to the computers.
!! Size
Computers can be extremely small, but miniaturizing such units without sacrificing computational power or durability increases a computer's price. At base, a computer has a bulk equal to its tier squared. Computers with light bulk or negligible bulk can be worn easily on the wrist or clipped to communications devices and used without having to hold them in a hand. Any computer with a bulk of 1 or more must be held or set on a sturdy surface to be used. Computers with a bulk of 25 or more are not designed for portability, and normally they are permanently mounted to furniture or a vehicle or starship. You can reduce the size of a computer with the [[miniaturization]] upgrade.
!! Access and Authorization
Computers are designed for users to quickly and easily gain access to their files and functions. A computer may have unsecured access, which allows anyone able to interact with its user interface to perform basic functions. In such cases it usually has secured root access, so more crucial features remain available to only a select few. A computer can have unsecured root access, but this is normally only the case for a newly-purchased computer, and the first owner is expected to establish secure root access as soon as possible.
!!! Access
Access means you are able to use all the basic functions of the computer, which generally includes retrieval of any information not stored in a secure data module, the ability to send and receive messages from other devices or systems connected to the computer (which may include access to a planetary infosphere), and control of any minor functions (such as door controls, entertainment systems, light switches, and other common household devices) controlled by the computer.
In most cases, it is obvious at a glance whether a computer's user interface has unsecured access or whether it is necessary to attempt a [[Computers]] check to [[hack]] the system.
!!! Root Access
Root access is a more advanced form of access that allows you to use all of a computer's functions and modules, bypass or set conditions for its countermeasures, and look at, copy, add to, and delete any of its secured data. With root access, you can also grant a specific individual with access the ability to use a specific module or countermeasure you control that would not normally be available to the base access level.
You can gain root access only when a computer is first purchased, when it is granted by another creature that already has root access, or when you make a successful Computers check to hack the system and beat the computer's normal DC by 20 or more. Normally, root access applies to a computer as a whole, but modules behind a firewall can have their own separate root access permissions.
!! Secured Computers
Most systems attempt to balance access and security with a two-step verification process to confirm authorized access, entailing both a physical security key (which might be nearly any tangible object, such as a keycard, palm print, or even another computer) and a password (often a fairly long string of characters entered through a keyboard, but also potentially a voiceprint or song, a telepathic command, or a riddle easily understood if you know the context).
Characters who are authorized, have the security object, and know the password can access a computer and use it for its intended purpose without needing to hack into it. Both a security key and a password can limit a character's access to only some modules or tiers of a computer and don't allow the user to access other functions. If you attempt to hack a computer, you gain a significant advantage if you acquire its security key or password, each giving you a +5 bonus to Computers checks to hack. However, the access granted by such security measures can easily be revoked by someone who already has access to the computer if that individual knows you have somehow obtained a security key or learned a password. Similarly, if you use either a security key or password to gain a bonus to a Computers check and then fail that check by 5 or more, the system automatically locks access against further attempts from the specific security credential used, which no longer grants its bonus to future checks.
!! Basic Functions
Computers are good at storing data, making calculations, manipulating and sorting information, performing rote tasks, and combining these tasks (often in the form of apps or programs). A computer may be set up to perform any of these functions in a general way, and it's impossible to define everything a computer can possibly do. In general, computers can be treated as tools that streamline tasks that would otherwise demand significant bookkeeping, computation, sorting, tracking, or viewing, as long as the needed data can be input. Such tasks are normally part of a computer's basic functions (though the data they need might well be kept behind a firewall, in a secure data module, or both), and ultimately it is up to a GM to determine a computer's total capacity for performing such basic functions.
A basic function can also control a simple device such as a fire-suppression system, remote door, or a video camera— anything with simple on and off functions. New basic functions of this type can be added with a successful DC 10 Computers check, though the GM has final say on what an appropriate basic function is for a computer. Anything more complex that would normally require a creature to operate must be controlled through a control module.
!! Modules
Modules define what a computer is capable of doing beyond its basic functions. Computers can have any number of modules. These typically fall into one of four categories: control, secure data, spell chips, and upgrades. Control modules can operate a device or object that is in some way linked to the computer, such as a video camera or even a connected robot. A secure data module contains a vast amount of information, from technical blueprints to financial ledgers or perhaps personal correspondence. Spell chips are special magic items that allow a computer to generate spell effects. Finally, upgrades are simply improvements to the computer system that increase the difficulty of hacking the computer, expand its reach, or make it faster and easier to use.
<<list-links "[tag[Modules]sort[title]]" class:index>>
!! Upgrades
These modules improve the overall effectiveness, security, and utility of a computer system. A computer system can have any number of these modules, but their effects generally do not stack. For a better effect, a more expensive module must be purchased and installed on the computer.
<<list-links "[tag[Upgrades]sort[title]]" class:index>>
!! Countermeasures
Countermeasures are specific actions that occur if someone tries to hack into a computer system. Some spring into action only if someone attempts and fails a Computers check to hack the system, while others activate whenever anyone tries to access the machine in any way. The most basic countermeasures simply remove access from a user or specific user interface, whereas more advanced countermeasures might alert robot sentries or even emit a lethal shock. A computer can have a maximum number of countermeasures equal to its tier.
<<list-links "[tag[Countermeasures]sort[title]]" class:index>>
</$list>
<$list filter="[<currentTiddler>is[missing]]" >
<<tabs "[contains:tab[Computers (equipment)]sortby{Computers (equipment)!!list}]" "Modules" "Index Template">>
</$list>
You can operate, manipulate, and hack into computer systems. If you don't have physical access to a computer system's user interface, you must use a [[hacking kit|Tool Kit]] to access and manipulate the system.
Computers are set up to give one or more authorized users root access, allowing them to access any information or function of the computer as a standard action, with no need for a Computers check. Firewalls can block off specific sections of a computer and grant different users root access to those sections.
The base DC for many of the tasks of the Computers skill is equal to 13 + (4 × the computer's tier). These DCs may be adjusted by the GM to reflect other circumstances.
<$list filter="[tag<currentTiddler>tag[Tasks]]">
<$macrocall $name="collapse" tiddler={{!!title}}/>
</$list>
A computer system functions in many ways as a ship's brain. Most computers aboard starships have at least a rudimentary artificial personality, and while they can't fully perform the duties of a crew member, they can assist crew members in various tasks. However, many spacefarers claim that over time, a starship's computers can develop temperaments and personality quirks that set them apart from identical computers in other ships. A starship has a basic computer of a tier equal to half the starship's tier (minimum 1). Which upgrades
a crew can purchase for its starship computer is determined by the GM; some upgrades can be purchased with Build Points.
While a starship's computer is responsible for operating and managing a wide variety of starship systems at any given point in time, only a starship with an integrated control module (ICM) can aid the crew in starship combat (the basic computer listed on the table below is the only option that lacks an ICM). In general, an ICM adds a flat circumstance bonus to one or more starship combat checks, decided just before the check is attempted. An ICM has a number of nodes; each node grants its bonus to one starship combat check per round. Multiple nodes allow an ICM to influence multiple starship combat checks in a round, but they do not allow a computer to add multiple bonuses to the same starship combat check.
The cost of an ICM for the starship's computer is equal to the bonus it grants squared, multiplied by its number of nodes. ICMs can be purchased only with Build Points, not with credits.
<div class="table-wrapper">
|Name |Bonus | Nodes | PCU | Cost (in BP) |h
|Basic computer |+0 | 0 | 0 | 0 |
|mk 1 mononode |+1 | 1 | 10 | 1 |
|mk 1 duonode |+1/+1 | 2 | 10 | 2 |
|mk 1 trinode |+1/+1/+1 | 3 | 10 | 3 |
|mk 1 tetranode |+1/+1/+1/+1 | 4 | 10 | 4 |
|mk 2 mononode |+2 | 1 | 15 | 4 |
|mk 2 duonode |+2/+2 | 2 | 15 | 8 |
|mk 2 trinode |+2/+2/+2 | 3 | 15 | 12 |
|mk 2 tetranode |+2/+2/+2/+2 | 4 | 15 | 16 |
|mk 3 mononode |+3 | 1 | 20 | 9 |
|mk 3 duonode |+3/+3 | 2 | 20 | 18 |
|mk 3 trinode |+3/+3/+3 | 3 | 20 | 27 |
|mk 3 tetranode |+3/+3/+3/+3 | 4 | 20 | 36 |
|mk 4 mononode |+4 | 1 | 25 | 16 |
|mk 4 duonode |+4/+4 | 2 | 25 | 32 |
|mk 4 trinode |+4/+4/+4 | 3 | 25 | 48 |
|mk 5 mononode |+5 | 1 | 30 | 25 |
|mk 5 duonode |+5/+5 | 2 | 30 | 50 |
|mk 5 trinode |+5/+5/+5 | 3 | 30 | 75 |
|mk 6 mononode |+6 | 1 | 35 | 36 |
|mk 6 duonode |+6/+6 | 2 | 35 | 72 |
|mk 7 mononode |+7 | 1 | 40 | 49 |
|mk 7 duonode |+7/+7 | 2 | 40 | 98 |
|mk 8 mononode |+8 | 1 | 45 | 64 |
|mk 8 duonode |+8/+8 | 2 | 45 | 128 |
|mk 9 mononode |+9 | 1 | 50 | 81 |
|mk 9 duonode |+9/+9 | 2 | 50 | 162 |
|mk 10 mononode |+10 | 1 | 55 | 100 |
|mk 10 duonode |+10/+10 | 2 | 55 | 200 |
</div>
A weapon with the conceal special property is considered especially small or easy to hide for purposes of [[Sleight of Hand]]'s hide object task, granting you a +4 circumstance bonus to skill checks to hide it.
This upgrade consists of many hidden compartments that are difficult to distinguish from the armor's surface. Your armor grants you a +5 bonus to [[Sleight of Hand]] checks when hiding items on your body. You can store up to 1 bulk worth of items in your concealed compartments.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|concealed compartments | 1 | 175 | 1 | any | L |
</div>
In a process that requires an hour of uninterrupted work, you can hide a non-consumable piece of technological gear inside a larger technological object (something of higher bulk). For instance, you can conceal a personal comm unit inside a pair of hoverskates or a detonator inside a basic medkit. The concealed item easily passes casual inspection, but someone using a scanner or performing a close inspection can discover it with a successful [[Perception]] check (DC = 10 + your total [[Engineering]] skill modifier – the concealed item's bulk [minimum 1]). Both devices retain their normal functionality and require their own batteries, but if the concealed device requires a skill check to use, the user takes a –2 penalty to that skill check. You can't conceal weapons or armor or conceal items in weapons or armor.
Starting at 5th level, you can conceal the functional parts of a technological item or a ranged weapon inside a technological object of the same size, as long as that object is at least 1 bulk. For instance, you can conceal an azimuth laser pistol inside a large-enough musical instrument or a pulsecaster pistol inside a beacon. Concealing a weapon in this way imposes a –2 penalty to attack rolls with that weapon and reduces its range by half. This requires an additional hour of work and an amount of UPBs equal to 10% of the concealed item.
In either case, do not combine the bulk of the two devices; only the higher bulk counts toward a character's bulk limit.
You are adept at concealing your weapons and other items. Double your operative's edge bonus to [[Sleight of Hand]] checks when attempting to hide a small object on your body. Additionally, you can draw a hidden weapon as quickly as a non-hidden weapon.
Originating from sources such as dense smoke and battlefield position, concealment obscures precise senses and imposes a miss chance on attacks. When you have concealment, it's harder for enemies to see you clearly. This might be due to your position on the battlefield, or it might be due to another effect that makes it more difficult for enemies to perceive and hit you with an attack.
To determine whether you have concealment from a creature's ranged attack, choose a corner of the enemy's square. If any line from this corner to any corner of your square passes through a square that provides concealment or the border of such a square, you have concealment. Also use these rules when a creature makes a melee attack against a target that isn't adjacent to it.
When a creature is making a melee attack against an adjacent target, the target has concealment if its space is entirely within an effect that grants concealment.
Additionally, some effects provide concealment against all attacks, regardless of whether any intervening concealment exists.
!! Concealment Miss Chance
Concealment gives the target of a successful attack a chance that the attacker actually missed. This is called a miss chance. Normally, the miss chance for concealment is 20%. Make the attack normally; if the attacking creature would hit, the target must roll a 20 or lower on a d% roll to avoid being struck. Multiple concealment conditions do not stack.
!! Varying Degrees Of Concealment
Certain situations can provide more or less of a miss chance than typical concealment. In this case, it is up to the GM to determine a character's degree of concealment.
!! Total Concealment
If a creature has line of effect to you but not line of sight, you have total concealment. An enemy can't attack you when you have total concealment, though it can attack into a square it thinks you occupy. A successful attack into a square occupied by an enemy with total concealment has a 50% miss chance (instead of 20%).
!! Ignoring Concealment
Concealment might be ineffective. Dim light or darkness doesn't provide concealment against creatures with [[darkvision]]. Creatures with [[low-light vision]] can see in dim light as if it were normal light.
Some spells require continued concentration to keep them going. Concentrating to maintain a spell is a standard action.
To successfully cast a spell, you must concentrate. The length of time you must concentrate to cast a spell is specified in the Casting Time entry in the spell's description. Your foes can interrupt your spellcasting in a few ways, as described below.
The concentration required to cast a spell is sufficient to cause you to briefly lower your defenses. If a foe threatens the space you are in, casting a spell provokes an [[attack of opportunity]] unless the spell specifies otherwise.
Normally, you can concentrate even in a distracting situation, but if you're casting a spell and you take damage from either a successful attack that targeted your AC or from an effect that you failed a saving throw against, the spell fails.
You are most at risk of taking damage while casting when a spell's casting time is 1 round or longer, you have provoked an attack of opportunity, or a foe readied an action to attack you when you began to cast. However, if you are taking ongoing damage (such as if you are bleeding or on fire), your spells are not disrupted in this way.
If you ever try to cast a spell in conditions where the characteristics of the spell can't be made to conform, the spell fails. For example, if you try to cast a spell that targets a humanoid on a non-humanoid, the spell fails.
!! Concentrating In Harsh Environments
If you attempt to cast a spell in environmental conditions that make spellcasting impossible, the spell fails. You can typically cast spells in bad weather or when your ship is making tricky maneuvers, but at the GM's discretion, if you are subject to extremely violent motion (such as an earthquake) or extremely violent weather (such as a hurricane), you can't concentrate to cast spells.
The powerful blast from a concussion grenade causes a small shockwave that blasts creatures off their feet. Creatures that fail their save against a concussion grenade are knocked [[prone]]. A flying creature caught in the blast is affected as if by the [[trip|Trip (combat maneuver)]] combat maneuver if it fails its save, descending 10 feet and becoming prone if this causes it to reach the ground. More advanced versions of this grenade explode so forcefully that they also inflict sonic damage. The grenade's shockwave requires a gas or liquid medium, and this grenade has no effect in a vacuum.
<div class= "table-wrapper">
|Weapon | Level | Price | Range | Capacity | Bulk |Special |h
|concussion grenade I | 1 | 50 | 20 ft. | drawn | L |[[explode]] ([[knockdown]], 10 ft.) |
|concussion grenade II | 3 | 230 | 20 ft. | drawn | L |[[explode]] (1d4 So, [[knockdown]], 10 ft.) |
|concussion grenade III | 6 | 615 | 20 ft. | drawn | L |[[explode]] (2d6 So, [[knockdown]], 10 ft.) |
|concussion grenade IV | 10 | 2,600 | 20 ft. | drawn | L |[[explode]] (4d6 So, [[knockdown]], 10 ft.) |
|concussion grenade V | 14 | 9,800 | 20 ft. | drawn | L |[[explode]] (7d6 So, [[knockdown]], 10 ft.) |
</div>
<<list-links "[tag[Conditions]sort[title]]" class:index>>
Your respiratory system manufactures nanites that specialize in conducting and channeling electrical energy. As a standard action, you can breathe these nanites into a 10-foot burst with a range of 20 feet. The nanites remain airborne and active in the area for 1 minute, though a moderate wind (11+ mph) disperses the nanites in 4 rounds, and a strong wind (21+ mph) disperses the nanites in 1 round. As a reaction when you or an ally makes an attack that deals electricity damage to a single target in the nanites' area, you can activate the nanites to have the attack instead affect all creatures in the nanites' area, resolved as though the attack had the [[explode]] weapon special
property. Alternatively, you can activate the nanites as a reaction when an effect with the electricity descriptor includes the nanites in its area, adding the nanites' area to the triggering effect's area of effect. Either use destroys these nanites.
After you create a cloud of nanites with this augmentation, you can't do so again until you've rested for 10 minutes to regain Stamina Points, though you can spend 2 Resolve Points at any point to recharge it immediately.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|conductive carrier | 13 | 51,000 | lungs and throat |
</div>
Your drone conducts, stores, and unleashes electricity with a touch. Your drone gains a special unarmed strike that deals 1d3 electricity damage; this attack doesn’t count as [[archaic]] and targets EAC. When your drone reaches 3rd level, it gains [[Weapon Specialization]] with its natural weapon. Your drone must have the [[resistance|Resistance (drone mod)]] (electricity) mod to select this mod.
Installed with top-notch telecommunication equipment (including integral system-wide comm units), this high-end office space is often featured in starships used to transport government officials or top business leaders. Starships with this expansion bay can even host sizable conferences.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|conference and meeting rooms | 1 | 1 |
</div>
The target must succeed at a Will saving throw or gain the [[confused]] condition for 1 round.
You are mentally befuddled and can't act normally. You can't tell the difference between ally and foe, and thus you treat all creatures as enemies, even your closest friends and family, if applicable. An ally who wishes to cast a beneficial spell on you with a range of touch must succeed at an attack roll against your Energy Armor Class, since you cannot be considered a willing target. If you are attacked while you're confused, you always attack the creature that last attacked you until that creature is dead or out of sight, unless it is otherwise impossible for you to attack it that round. While confused, you can't make attacks of opportunity against any creature or thing that you aren't already committed to attacking.
If you are not devoted to attacking a target, roll on the following table at the beginning of your turn each round to see what you do in that round.
{{Table: Confusion}}
If you can't carry out the indicated action, you do nothing but babble incoherently. Attackers are not at any special advantage when attacking you.
<div class="statblock">
* <<levels>>
* ''School'' enchantment (compulsion, mind-affecting)
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' 15-ft.-radius burst
* ''Duration'' 1 round/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
This spell causes [[confusion|confused]] in all creatures in the area, making them unable to determine their actions. Any confused creature that is attacked automatically attacks or attempts to attack its attackers on its next turn, as long as it is still confused at the start of its next turn. Note that a confused creature will not make attacks of opportunity against any foe that it is not already devoted to attacking (either because of its most recent action or because it has just been attacked). For confused creatures that have not been attacked, roll on the following table at the start of each affected creature's turn each round to see what it does in that round.
{{Table: Confusion}}
A confused creature that can't carry out the indicated action does nothing but babble incoherently. Attackers are not at any special advantage when attacking a confused target.
<div class="statblock">
* <<levels>>
* ''School'' enchantment (compulsion, mind-affecting)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one living creature
* ''Duration'' 1 round
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
This spell causes a single creature to become [[confused]] (as per the //[[confusion]]// spell) for 1 round.
Conjuration spells bring creatures, objects, or energy (potentially including healing energy) into being or transport them to new locations. A conjured creature or object must arrive in an open location on a surface capable of supporting it. It can't appear inside another creature or object. The conjured creature or object must appear within the spell's range, but once conjured it does not have to remain within the range.
A connecting weapon creates a ropy tendril. If the weapon hits, this tendril connects the firing vessel and the one struck. While maintaining this connection, the weapon can't be used to connect to another starship. Instead, while connected, both vessels have a maneuverability rating that's one worse than normal and can move at no more than half speed. A larger vessel can tow a smaller one. If both vessels are the same size, either can tow the other. Neither starship can move more than 5 hexes from the other until the connection is broken. A crew member of the firing starship can break the connection as an action during any phase. The pilot of the target starship can do so by using an action to attempt a [[Piloting]] check (DC = 15 + 1-1/2 × the tier of the firing ship), breaking the connection on a success. The tendril has the AC and TL of the firing starship and no shields. It breaks if it takes any damage, ending the connection.
name://connecting tendril//
range:short
speed:—
damage:3d6
pcu:10
cost:10
special:[[burrowing]], [[connecting]], [[mystical]]
You can use the [[divert]] engineer action as a magic officer action during the engineering phase. Instead of an [[Engineering]] check, you attempt a [[Mysticism]] check against the same DC and expend an unused mystic spell slot of 1st level or higher. You gain a bonus to the Mysticism check equal to twice the expended spell's level.
You gain a hint of mystic power.
''Prerequisites:'' Wis 15, character level 5th, no levels in mystic.
''Benefit:'' Choose two 0-level mystic spells and one 1st-level mystic spell. You can cast the 0-level spells at will and the 1st-level spell once per day for every 3 character levels you have. For these spells, your caster level is equal to your character level and the key ability score is Wisdom. If you later gain levels in mystic, you lose the benefits of this feat and can replace it with either [[Spell Focus]] or [[Spell Penetration]].
<div class="statblock">
* ''Tier'' 20
* Supercolossal ultranought
* ''Speed'' 6; ''Maneuverability'' clumsy (turn 6); ''Drift'' 1
* ''AC'' 35; ''TL'' 32
* ''HP'' 1,050; ''DT'' 15; ''CT'' 210
* ''Shields'' superior 600 (forward 150, port 150, starboard 150, aft 150)
* ''Attack (Forward)'' gravity gun (6d6; 10 hexes), ultra x-laser cannon (6d8×10; 20 hexes)
* ''Attack (Port)'' antimatter mega-missile launcher (4d10×10; 20 hexes)
* ''Attack (Starboard)'' antimatter mega-missile launcher (4d10×10; 20 hexes)
* ''Attack (Turret)'' persistent particle beam cannon (2d10×10; 20 hexes)
* ''Power Core'' Titan Heavy (950 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' advanced short-range sensors, crew quarters (common; 10% good, 1% luxury), hangar bay, mk 4 mononode computer, network node, mk 13 armor, mk 13 defenses, security (anti-hacking systems [4], biometric locks); ''Expansion Bays'' [[cargo holds]] (35), [[recreation suite]] (gym), [[sealed environment chamber]], [[tech workshop]]
* ''Modifiers'' +4 to any two checks per round, +4 [[Computers]] (sensors only), –2 [[Piloting]]
* ''Complement'' 5,000 (minimum 250, maximum 5,000)
!!! CREW
* ''Captain'' [[Diplomacy]] +34 (20 ranks), [[Engineering]] +34 (20 ranks), gunnery +29 (20th level), [[Intimidate]] +34 (20 ranks), [[Piloting]] +34 (20 ranks)
* ''Engineers (2 officers, 850 crew each)'' [[Engineering]] +34 (20 ranks)
* ''Gunners (2 officers, 1,500 crew each)'' gunnery +29 (20th level)
* ''Pilots (1 officer, 195 crew)'' [[Piloting]] +39 (20 ranks)
* ''Science Officers (1 officer, 98 crew)'' [[Computers]] +34 (20 ranks)
</div>
The most well-known Vindicas vessel is the //Conqueror of Worlds//. This masterpiece of destruction is the flagship of the Veskarium, and the last thing many science officers see on their sensors, just before facing Pharasma. When the Veskarium has decided to bring a planet under its control and that planet resists, it brings in this massive weapon to lay waste to any defenses the planet can muster. The ship can hold its targets in place with a tractor beam while its spinal-mounted ultra x-laser cannon warms up; then the cannon can rip an entire line of starships to shreds. When engaging opposing fleets, the ship rarely needs to fire the weapon twice before the target acquiesces to virtually any demand the Veskarium makes.
Conquerors are perhaps the largest and most difficult to handle of the plasma weapon category. A conquerer can deliver a single devastating blast of plasma, but the weapon is rather front-heavy and difficult to maneuver. Some vesk take up the weapon as a sign of their patron deity, Damoritosh, viewing it as the ranged spiritual equivalent of the doshko. In addition to the red star, yellow star, white star, and blue star models, the particularly powerful violet star conqueror has recently made its way onto the market.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|conqueror, red star | 1 | 430 | 1d10 E & F | 60 ft. | [[wound]] | 20 charges | 4 | 3 |[[unwieldy]] |
|conqueror, yellow star | 4 | 2,400 | 1d12 E & F | 80 ft. | [[wound]] | 40 charges | 4 | 3 |[[unwieldy]] |
|conqueror, white star | 9 | 15,200 | 3d12 E & F | 80 ft. | [[wound]] | 40 charges | 4 | 3 |[[unwieldy]] |
|conqueror, blue star | 13 | 52,000 | 5d10 E & F | 100 ft. | [[wound]] | 80 charges | 4 | 3 |[[unwieldy]] |
|conqueror, violet star | 18 | 590,000 | 10d10 E & F | 100 ft. | [[wound]] | 80 charges | 4 | 3 |[[unwieldy]] |
</div>
Stories told by Veskarium warriors speak of an ancient Vesk captain named Harakoye, who was awarded the Conqueror's Star, a coveted Veskarium military decoration, for slaying an overwhelming number of enemy soldiers in a glorious battle against all odds. Harakoye so prized the emblem, she slept with it hanging around her neck. But one night, when sleeping in the same barracks as her unit, Harakoye was betrayed by an assassin who had posed for months as a loyal comrade. As the assassin slit her throat, Harakoye awoke from slumber and grabbed the doshko she kept by her bedside. As the assassin continued to slash at Harakoye's neck and stabbed out her eyes, Harakoye hacked away at him. It was not until her head was removed completely that Harakoye was finally slain, and even then, soldiers of the Veskarium claim her body rose once more, headless, to attack one final time, dealing a fatal blow to her assailant.
The //Conqueror's Star of the Headless Vesk// is an [[adamantine]] medallion set atop an eight-pointed star and molded into the form of a vesk hand clutching the bleeding heart of an enemy in its claws. It is spattered with Harakoye's blood and affixed to a gore-soaked turquoise ribbon. No matter how much anyone attempts to clean the medal or the ribbon (even using magic), the blood spatter always reappears within 2d4 hours. While you are wearing the medallion, you gain 20 temporary Hit Points that replenish after 8 hours of rest. If you are surprised by an attack while wearing the //Conqueror's Star of the
Headless Vesk//, you can call any one weapon you own immediately into your hands as if it had the [[called]] weapon fusion. In addition, if you would be reduced to 0 Hit Points by an attack while wearing the artifact, you can attempt a Fortitude saving throw (DC = 10 + the CR of the creature whose attack reduced you to 0 Hit Points + 5 if the attack was a critical hit) to be reduced to 1 Hit Point instead. Each time beyond the first that you activate this ability within 1 week, the save DC increases by 5. If you fail this Fortitude save, you can immediately make a melee attack against an enemy within your reach before you are reduced to 0 Hit Points.
Unfortunately, wearing the artifact has a major drawback. Any time you are struck with a melee weapon with the [[wound]] or [[severe wound]] critical hit effect, the attacker acts as if they had rolled a 20 on the [[Wounding Weapons]] table, and you must roll the Fortitude saving throw twice and take the worse result.
This metal-and-glass disk is 8 feet in diameter and has a series of sensors and electrodes mounted along one edge. In a process that takes 1 minute, a creature lying on the disk can attach electrodes to their head (or equivalent region) and transfer their mind into a computer or construct adjacent to the //consciousness transfer unit//, functioning as //[[transfer consciousness]]// (CL 14th). If the creature whose consciousness is transferred is unwilling, they can negate this effect with a successful DC 22 Will save. Once a creature has been affected by the device, whether the effect succeeded or not, they’re immune to that consciousness transfer unit’s effects for 24 hours.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//consciousness transfer unit// | 14 | 89,700 | 20 |
</div>
A consciousness uplink drive is an incredibly potent and thoroughly dangerous system that enables a crew member with a [[datajack]] to interface directly with their starship. The device converts electronic signals from the starship's computers and various sensors into neural signals that the user's brain can interpret as if the signals had originated from the user's own body. This grants the crew member extraordinary reaction speed and multitasking abilities, but it also leaves the user's body vulnerable to painful feedback if the starship is damaged, potentially inflicting lasting harm.
To use the uplink drive, a crew member must have a datajack and physically link their datajack to their starship, such as to a port in the pilot's chair. Calibrating this connection takes at least 1 minute outside of starship combat or takes the uplinking crew member's crew action to calibrate during starship combat. A crew member can begin starship combat already calibrated and connected. Once calibrated, they gain all of the benefits and drawbacks that follow and can change starship roles without disconnecting. Disconnecting safely takes an additional 1 minute, or 1 round during starship combat, during which the user can act normally but gains none of the uplink's benefits and still experiences the drawbacks until the process concludes. The user can instead disconnect at the start of a round before the engineering phase, but severing the link so quickly is harmful; they take damage equal to twice the starship's tier when a system becomes [[malfunctioning]] or [[wrecked]].
Only one crew member can use a consciousness uplink drive at a time, as multiple users introduce mental interference that negate the system's benefits.
''Benefits:'' The benefits provided by the uplink depend on the quality of the user's datajack, with more advanced models able to process more complex commands. While linked, the crew member can perform the following starship crew actions as minor crew actions: [[divert]], [[fly|Fly (pilot action)]], [[precognition]], [[scan]], and [[shoot]]. If using a high-density or accelerated datajack, the user also gains a +1 circumstance bonus to gunnery and starship combat skill checks. If using an accelerated datajack, the user's circumstance bonus increases to +2 when performing science officer actions, and the user adds the following to their list of minor crew actions: [[balance]], [[eldritch shot]], [[fire at will]], [[hold it together]], and [[maneuver]].
''Drawbacks:'' An uplinked user suffers neural feedback whenever the starship takes critical damage. Whenever one of the starship's systems takes critical damage and becomes [[glitching]], the user takes damage equal to the starship's tier; this damage doubles if the system becomes [[malfunctioning]] or [[wrecked]]. The user can halve this damage with a successful Fortitude save (DC = 10 + 1/2 the starship's tier). If the user has a high-density datajack, they gain a +1 circumstance bonus to saving throws against this feedback (+2 for an accelerated datajack).
If critical damage gives a system the malfunctioning or wrecked condition, the feedback disables part of the uplinked user's body unless they succeed at a Fortitude save (DC = 10 + 1/2 × the starship's tier for malfunctioning, or 15 + 1/2 × the starship's tier for wrecked). On a failed save, the user suffers a wound, per the [[wound]] critical hit effect, based on which system was damaged:
* ''Engines:'' leg
* ''Life Support or Power Core:'' vital organ
* ''Sensors:'' eye
* ''Weapons Array:'' arm
For a malfunctioning system, the wound's effects are temporary, lasting only 8 hours if the user failed the save. For a wrecked system, however, the wound is permanent if the user failed the save. These wounds don't intrinsically prevent a user from operating the starship, but the injuries are apparent once the user disconnects.
The user doesn't take any of the above effects when the starship gains a critical damage condition from reducing the severity of a system's critical damage condition.
<div class="table-wrapper">
|System | PCU | Cost (in BP) |h
|consciousness uplink drive | 0 | 4 |
</div>
<div class="statblock">
* ''Script'' [[Sacrifice]] (incense and offerings worth 2,000 credits), [[Prepare the Space]] (Mysticism; retry), [[Invoke Entity]] (Will; damage, failure)
* ''Assistants'' any
* ''Round Length'' 1 day
</div>
You consecrate a site to your deity. The effects of this ritual last for 1 year, and they extend in a 40-foot radius centered on an immobile shrine, altar, or fixture of your deity. While within the area, worshippers of your deity gain a +1 divine bonus to Armor Class, attack rolls, damage rolls, saving throws, and skill checks. If your deity is chaotic, evil, good, or lawful, attacks by your worshippers made from within the area are chaotic-aligned, evil-aligned, good-aligned, or lawful-aligned, respectively.
Weapons with the //conserving// fusion preserve their ammunition and charges after a miss. When you miss with a ranged attack roll, your charge or ammunition is not consumed, as though the weapon had never been fired. This fusion does not prevent your weapon from malfunctioning or breaking as a consequence of your attack. Only weapons that use [[arrows]], [[batteries]], [[darts]], [[flares]], [[grenade arrows]], [[mini-rockets]], [[rounds]], or [[scattergun shells]] as ammunition can benefit from a //conserving// fusion.
A //conspirator's emblem// is a badge or amulet like those commonly worn to mark people as members of an organization. Insignia of the Aspis Consortium in particular are notorious for all sorts of secretive magic, including that of the //conspirator's emblem//.
As a standard action while wearing this emblem, you can create an aura of confidentiality in a 20-foot-radius spherical emanation centered on you. You can designate any number of willing creatures you can see within the aura as coconspirators. You and your coconspirators can converse normally so long as you remain within the aura, provided you share a language or another means of understanding one another. Other creatures inaccurately perceive your discussion, sensing a magically generated dialogue about a topic you designate. //[[Comprehend languages]]// reveals only that your conversation has a magical aspect, but a creature benefitting from a //[[tongues]]// spell or capable of [[truespeech]] understands your actual exchange if within the emblem's aura.
A //conspirator's emblem// can create its emanation for up to 1 hour per day; this duration can be used in 10-minute increments. The effect ends immediately if you remove the item or fall unconscious. A creature participating in the emanation of any //conspirator's emblem// for longer than 1 hour on a given day experiences psychic dissonance, becoming [[sickened]] while within the area and for 1 hour after each subsequent exposure.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//conspirator's emblem// | 7 | 6,500 | L |
</div>
You’ve learned how to make friends by telling people what they want to hear.
''Benefit:'' After a creature discusses their beliefs or guiding philosophy with you, or if they’re displaying a prominent symbol that would indicate their beliefs (such as a holy symbol), you can attempt a [[Culture]] check to [[recall knowledge]] (DC = 15 + 1-1/2 × the creature’s CR). On a success, you know what the creature cares deeply about and how to use that to your advantage. For the next minute, while you are using this knowledge, you can treat the creature’s attitude toward you as one step higher.
You're always on the lookout for danger, making it hard to get the drop on you.
''Prerequisites:'' Wis 11, character level 5th.
''Benefit:'' Once per day, you can reroll an initiative check. You also win tied initiative checks as though you had the higher initiative bonus. If multiple characters have this feat, ties are resolved normally.
When you're fully photon-attuned, as a standard action, you can create a momentary chain of bursting energy that burns through the terrain. When you use this ability, you create three 10-foot-radius bursts within 60 feet of you, each of which cannot overlap and must be centered no more than 20 feet from the center of one other radius. You deal 5d6 fire damage, plus 1d6 for every 2 solarian levels you have beyond 9th, to each creature in each radius. An affected creature can attempt a Reflex save to take half damage. At 17th level, you can create three, four, or five bursts when using this ability.
Almost every sapient culture has constellations—patterns of stars visible from a location that represent figures from mythology, folklore, or religion. Stories about these constellations have been shared for generations, cementing their shapes in the collective imagination of thousands of different worlds. Every planet has different constellations and stories attached, but they are all linked together in a mystical sense, as the use of //constellation orreries// proves.
A //constellation orrery// is a form of interstellar drive that enables starships to navigate along the imaginary lines that connect the stars in a constellation, using stars that appear in multiple constellations as “switching stations” to change lines. These constellation lines are similar to terrestrial ley lines, and they run through not just one plane, but many. //Constellation orreries// look similar to ancient mechanical solar system models that displayed the orbits of planets around a star, but they depict the relative positions of stars in a constellation, reconfiguring their appearance as the ship passes through different constellations. The Church of Ibra is the sole known purveyor of //constellation orreries//, but whether the drive’s origin lies in the Gap or before it is just another cosmic mystery for the faithful to decipher.
<div class= "table-wrapper">
|Drive | Engine Rating | Minimum<br/>PCU | Maximum<br/>Size | Cost (in BP) |h
|//constellation orrery// | 2 | 150 | Huge | 10 × size category |
</div>
//Healthy—Weakened—Impaired—Debilitated—Unconscious—Dead//
//Weakened:// The victim takes a –2 penalty to Fortitude saves, Constitution checks, and Constitution-based DCs. Every time the victim attempts a Fortitude save against the poison—whether he succeeds or fails—he loses Hit Points as per on initial exposure.
//Impaired:// The victim takes an additional –2 penalty to the affected checks, and the DCs of his spells and special abilities decrease by 2.
//Debilitated:// Strenuous actions cause the victim pain. If he takes a standard action, he immediately loses 1 Hit Point.
//Unconscious:// The victim is [[unconscious]] and can't be woken by any means.
//Dead:// The victim dies.
Your drone can use its [[flexible body]] to constrict a foe. When your drone successfully renews a [[grapple|Grapple (combat maneuver)]] or pin on an opponent, it automatically deals an amount of bludgeoning damage equal to 1d3 + your character level.
A construct is a magically animated object or an artificially created creature.
* ''Traits:''
** [[darkvision]] 60 ft., [[low-light vision]]
** [[construct immunities]]
** [[unliving]]
** set Constitution modifier to —
** must have either the magical or technological subtype
** if the construct is mindless, set Intelligence modifier to — and add [[mindless]]
* ''Adjustments:''
** –2 to all saving throws
** +1 to attack rolls
[[Constructs]] are immune to the following effects, unless the effect specifies that it works against constructs.
* Bleed, death effects, disease, mind-affecting effects, necromancy effects, paralysis, poison, sleep, and stunning.
* Ability damage, ability drain, energy drain, exhaustion, fatigue, negative levels, and nonlethal damage.
* Any effect that requires a Fortitude save (unless the effect works on objects or is harmless).
//Format:// ''Immunities'' construct immunities.
Forces humming within your solar armor make it more difficult for sound waves and electrical impulses to reach your body and harm you. You gain [[energy resistance]] 5 whenever your solar armor is active. You can choose either electricity resistance or sonic resistance when you activate the armor, and you can switch energy types as a move action.
When you are attuned or fully attuned, you double the amount of resistance granted by this ability.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 10 minutes
* ''Range'' personal
* ''Duration'' concentration
</div>
You send your mind to another plane of existence (an Elemental Plane or some plane further removed) in order to receive advice and information from powers there. The powers reply in a language you understand, but they resent such contact and give only brief answers to your questions. All questions are answered with "Yes," "No," "Maybe," "Never," "Irrelevant," or some other one-word answer.
You must concentrate on maintaining the spell in order to ask questions at the rate of one per round. A question is answered by the power during the same round. You can ask one question for every 2 caster levels. On rare occasions, this divination may be blocked by an act of certain deities or forces. Contacting a minor planar power is relatively safe but may not result in useful answers. For each question you ask, the GM secretly rolls 1d20.
<div class="table-wrapper">
| Roll |Result |h
| 1–2 |The power gives you no answer, the spell ends, and you must attempt @@.constrained a DC 7 Intelligence check. On a failed check, your Intelligence and Charisma scores each fall to 8 for a week and you are unable to cast spells for that period.@@ |
| 3–5 |You receive a random answer to the question. |
| 6–10 |@@.constrained You receive an incorrect answer to the question. Based on the nature and needs of the creature contacted, this may be a lie designed to harm you.@@ |
| 11–15 |You receive no answer to the question. |
| 16 or more |@@.constrained You receive a truthful and useful one-word answer. If the question can't be truthfully answered in this way, no answer is received.@@ |
</div>
Contact with minds further removed from your home plane increases the probability that you will incur a decrease in Intelligence and Charisma due to your brain being overwhelmed by the power's sheer strangeness and force, but it also increases the chance of the power knowing the answer and answering correctly. You can add any value from +1 to +5 to the d20 roll to represent contacting increasingly powerful planar beings. However, on a roll of 1 or 2, the result is still no answer, the spell ends, and you must attempt an Intelligence check to avoid losing Intelligence and Charisma. The DC of this Intelligence check is increased by the same amount added to the d20 check to contact a planar creature.
Upon exploding, a //containment grenade// forces creatures in the blast radius to attempt a Reflex saving throw. Those that fail remain within the blast radius, provided it's big enough to contain them. Creatures that succeed take 3d6 force damage as they are pushed out of the blast radius. If a creature is too large to be contained within the radius, that creature is shunted out of the area as if it succeeded at the saving throw. Creatures that remain inside the sphere are trapped for 10 minutes as if by a //[[wall of force]]// spell.
<div class="table-wrapper">
|Weapon | Level | Price | Range | Capacity | Bulk |Special |h
|//containment grenade// | 12 | 6,000 | 20 ft. | drawn | L |[[explode]] (5 ft.; see text) |
</div>
A //containment tesseract// is a four-dimensional cube, about 6 inches on a side, with runes lining the surfaces. It is thought that technomancers unknown to recorded history created initial models during the Gap. Historians posit these devices were intended to imprison extraplanar entities, and that a creature trapped within one might have avoided the effects of the Gap. If that's true, there could be a //containment tesseract// holding a being that knows truths lost to the current age.
As a standard action, you can command the tesseract to imprison a creature you can see within 60 feet of you. The target must attempt a Will saving throw (DC = 19 + your key ability score modifier). A creature that has already been imprisoned in a //containment tesseract// can roll the saving throw twice and take the higher result. On a failure, the target disappears into the tesseract and remains inside, unharmed and unaware, until released. The tesseract can hold only one creature at a time.
Alternatively, as a standard action, you can command the tesseract to release a creature within it. The released creature must succeed at a Will saving throw or become helpful toward you for 1 hour. A creature that succeeds at the saving throw acts according to its normal inclinations and desires.
A //containment tesseract// accepts commands only twice per day.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//containment tesseract// | 19 | 500,000 | 1 |
</div>
The beings known through the Pact Worlds as contemplatives of Ashok were once humanoids of extreme intelligence living on Akiton. Upon unlocking exceptional psychic powers, they deliberately evolved their brains, to the detriment of their bodies. Now, contemplatives float along using telekinesis, their atrophied bodies dangling from pulsating brain-sacs.
Contemplatives' specialized evolution dates back to long before the Gap, and only piecemeal records hint at their original appearance. Were they more interested in power and influence as a species, they likely would have conquered their home planet of Akiton, but instead, most contemplatives are content to ponder the multiverse and its secrets, most famously debating their conclusions in Akiton's Halls of Reason. Contemplatives scholars are universally welcomed in laboratories, research facilities, and universities throughout the Pact Worlds, making them among the most prolific academic authors. Those who turn their minds to more worldly pursuits are rare, yet it is small cabals of such financial masterminds and political theorists that have best exploited Akiton's recent economic downturn. These moguls have purchased large swaths of the planet's real estate, ruling as silent overlords of ghost towns and thriving neighborhoods alike.
Although contemplatives are known to be extraordinarily intelligent, observant, and confident, their behavior is often jarring to their colleagues of other species. Individual contemplatives often refer to groups of their kindred using the first-person plural, suggesting some degree of racial hivemind, telepathic union, or sacred sense of shared existence. Further supporting this theory is the fact that contemplatives rarely come into conflict with one another, with few instances of intraracial violence in recorded history. Despite contemplatives' relative peacefulness, other races often perceive them as aloof, overly logical, and emotionally sterile.
Contemplatives are able to speak, though their voices are reedy and soft. Most consider verbal communication rather crude, favoring telepathy. Those who regularly need to speak often wear inexpensive contact speakers that translate their telepathic thoughts into spoken words. They're also able to sing in keening wails, although they rarely do so except around others of their kind or their most honored colleagues. The few ethnographers who study this behavior directly have compared the songs to religious paeans—an association contemplatives find absurd, in part because most prefer to study faith objectively rather than as worshipers.
Despite their frail appearance, contemplatives are able to survive in unforgiving environments. They find indoor sites far more comfortable, however especially areas that are cool and still, as these conditions facilitate their concentration. When contemplatives do build their own communities, the structures are often windowless and difficult to navigate for those unable to fly.
!! Racial Traits
* ''Ability Adjustments:'' +4 Int, +2 Cha, –2 Str, –2 Con
* ''Hit Points:'' 2
* ''Size and Type:'' Contemplatives are Medium monstrous humanoids.
* ''Applied Knowledge:'' Once per day before attempting a skill check or saving throw against a creature, a contemplative can use its bonus for the skill associated with that creature's type (such as [[Life Science]] for an ooze or [[Mysticism]] for an outsider) in place of its normal bonus.
* ''Atrophied:'' A contemplative's limbs are practically vestigial. A contemplative can manipulate most tools and one-handed weapons (including small arms) without difficulty. A contemplative can't properly wield a two-handed weapon without dedicating its telekinetic powers to supporting the weapon, and even then it takes a –4 penalty to attack rolls. It also can't use its spell-like abilities or fly until it is no longer wielding that weapon.
* ''Limited Telepathy:'' Contemplatives have [[limited telepathy]] with a range of 30 feet.
* ''Psychic Flight:'' Contemplatives fly [[supernaturally]] at a speed of 30 feet with average maneuverability, but their base speed is only 5 feet.
* ''Psychic Senses:'' Contemplatives have [[blindsense]] (thought) out to 30 feet and [[darkvision]] to a range of 60 feet.
!! Applied Knowledge Graft
{{Applied Knowledge}}
The //continuous// fusion lets a weapon with the [[line]] special property sustain fire continuously by expending additional charges. When you make a line attack with a weapon with this fusion, you can expend additional ammunition or charges equal to the weapon's usage value to sustain your attack until the start of your next turn. This has no additional effect on targets already within the line, but anything that moves across your weapon's line is attacked using your original attack roll and damage. If you hit but fail to damage this new target, it blocks your line as normal. If an existing blockage is removed, your line extends out to its maximum range unless blocked anew, and it can damage creatures and objects that it failed to reach previously. You can't damage a single target more than once in a round with the //continuous// fusion, even if it moves in and out of the path of your attack. If you move from where you initiated the attack for any reason, your line automatically ends. Only weapons that can make a line attack benefit from this fusion. You can use the //continuous// fusion with [[unwieldy]] weapons.
This tight-fitting jumpsuit magically reshapes and rearranges your body in response to external pressure, enhancing your flexibility and ability to move through tight spaces. While wearing a //contortion coat//, you gain the [[compression]] universal creature ability. In addition, you gain a +4 circumstance bonus to [[Acrobatics]] checks when using the [[escape]] task.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//contortion coat// | 5 | 3,300 | L |
</div>
You distract a target, allowing an ally to slip their hand into the mark’s pocket.
''Prerequisites:'' [[Diversion]]
''Benefit:'' When you successfully use [[Bluff]] to create a diversion, you can allow an ally that’s adjacent to a creature that you diverted to attempt a DC 20 [[Sleight of Hand]] check to pick that creature’s pocket. You can allow your ally to place an object of negligible or light bulk on that creature instead of stealing an object, but the ally takes a –5 penalty to their Sleight of Hand check.
''Normal:'' Using Bluff to create a diversion does not allow an ally to attempt a Sleight of Hand check to pick a pocket.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' 30-ft.-radius spread
* ''Duration'' 10 minutes/level
* ''Saving Throw'' Fortitude partial (see text)
* ''Spell Resistance'' no
</div>
You can alter the atmosphere within the spell's area to cause it to become more like the atmosphere of another planet. You can alter one aspect of the atmosphere—its corrosiveness, density, or toxicity. The possible effects of each of these changes are detailed below.
''Corrosiveness:'' You can make the atmosphere corrosive. Each creature and object in the area when you cast the spell must succeed at a Fortitude save or take 5d6 acid damage. Creatures and objects that remain in the area take 3d6 additional acid damage every 10 minutes (Fortitude half).
Alternatively, you can make a normally corrosive atmosphere noncorrosive. In this case, the atmosphere within the spell's area deals no acid damage for the duration of the spell.
''Density:'' You can make the atmosphere in the area one step thinner (going from severely thick to thick, thick to normal, normal to thin, or thin to severely thin) or thicker (going from severely thin to thin, thin to normal, normal to thick, or thick to severely thick). The spell cannot make an atmosphere thicker than severely thick or thinner than severely thin. In addition to the normal long-term effects of being in an atmosphere thinner or thicker than a creature is acclimated to, each creature in the area of the spell when it is cast must succeed at a Fortitude save or suffer the immediate effects described below. This is true even for creatures with environmental protection from equipment (such as armor), as the air within the armor is affected on a failed saving throw. Creatures that do not need to breathe are not affected by changes in atmospheric density.
If the air is thicker than a creature is acclimated to, on a failed saving throw, that creature becomes [[sickened]]. For every step beyond the first that the air is thicker than the target's acclimation, it takes a –1 penalty to its save against this effect. If the air is thinner than a creature is acclimated to, on a failed saving throw, it is [[fatigued]]. For every step beyond the first that the air is thinner than the target's acclimation, it takes a –1 penalty to its saving throw against this effect. The effect ends if the creature moves out of the area, and it is not required to attempt a new saving throw upon reentering the area (instead it is subject only to the normal dangers of thicker or thinner air).
''Toxicity:'' You can make the atmosphere toxic. Each creature in the area of the spell when it is cast must succeed at a Fortitude save or suffer the immediate effects described below. Creatures with environmental protection from equipment already active (such as armor) are not exposed to the toxic atmosphere. A creature that fails its save contracts [[bubonic plague]] (no save) and immediately moves to the weakened state. Creatures that enter the area of toxic atmosphere later are exposed to inhaled bubonic plague and follow the normal disease rules for contracting the disease and progressing on the physical disease track. The disease is nonmagical, and those infected are still infected when the spell's duration ends.
Alternatively, you can make a normally toxic atmosphere nontoxic. In this case, the atmosphere within the spell's area does not expose those who breathe it to any toxic disease for the duration of the spell.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' up to one 10-ft. cube/2 levels (S)
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Fortitude negates, see text
* ''Spell Resistance'' no
</div>
You can control gravity in an area, causing it to reverse, become zero-g, or become extremely strong. A creature or object within the area that succeeds at its saving throw is unaffected (though if it stays in the area, it must succeed at a new save each round or become affected), but it might still suffer secondary effects (such as an object flying up from reversed gravity, or an object falling upon it when the spell ends). You choose how to have this spell affect gravity when you cast it, and you cannot change it without recasting the spell. If two control gravity spells affect the same area, they negate each other in the area of overlap.
If you reverse gravity in an area, you cause unattached objects and creatures in the area to fall upward and reach the top of the affected area in 1 round. If a solid object (such as a ceiling) is encountered in this fall, falling objects and creatures strike it in the same manner as they would during a normal downward fall. If an object or creature reaches the top of the spell's area without striking anything, it remains there, oscillating slightly, until the spell ends. At the end of the spell's duration, affected objects and creatures fall downward. Creatures who can fly or levitate can keep themselves from falling in either direction.
If you increase gravity in the area, creatures and objects weigh twice as much as normal, move at half speed, can jump only half as far as normal, and can lift and carry only half as much as normal. Any flying target has its maneuverability worsened by one step (from average to clumsy, for example; minimum clumsy) and plummets to the ground unless it succeeds at a DC 25 [[Acrobatics]] check to fly to remain in the air.
An area of zero-g works like the zero-g environment. You can also use this spell to make areas of zero-g, heavy gravity, or light gravity act as normal gravity for the duration.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' constructs of the technological subtype with individual CRs no greater than your level + 1 and a total CR no greater than twice your level, no two of which can be more than 30 ft. apart
* ''Duration'' concentration, up to 1 round/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' no
</div>
You wrest control of the target constructs and command them telepathically. You can issue commands to any number of controlled constructs on your turn, beginning when you cast this spell, as part of the concentration required to sustain its duration (a standard action).
If any of the constructs are under the control of a hostile creature, that controlling creature can attempt a Will saving throw (DC equal to this spell's) to negate this spell's effect. Each construct under the control of another creature grants its controlling creature a separate saving throw to negate the effect for that construct.
While this spell is in effect, the affected constructs follow any command you give them, even if it would be dangerous to the controlled constructs. At the end of the spell, the constructs revert to their normal behavior. If they are intelligent, they know and remember that you used magic to control them.
Neurons in your brain that would normally help you imagine what another person is experiencing are amplified magically, allowing you to decide what another creature does. As a full action, you can target any creature of your type that you are observing and attempt to control that individual. This functions as //[[dominate person]]// (DC = 10 + half your level + your Charisma modifier) for as long as you continue to observe the target, except establishing the effect doesn't require an attack roll, and no command you give the target can take more than a standard action to complete. Issuing a command is a move action. You can't target a creature again for 24 hours after it succeeds at its saving throw against this effect or the duration ends. Once you use your //control mirror neurons//, you can't use them again until you've rested to regain Stamina Points, though you can spend 1 Resolve Point at any time to recharge them immediately.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|//control mirror neurons// | 18 | 365,000 | brain |
</div>
You are capable of operating multiple AIs, one in a [[drone]] and one in an [[exocortex]]. You must divide up your mechanic level between these different AIs, and each gains abilities based on the number of levels you assign to it. Every time you gain a level in mechanic, you can change the distribution of levels between these AIs using your [[custom rig]] after 24 hours of uninterrupted work. While each AI can act independently to the limits of its ability, you can control them as normal (although you can directly control only one AI at a time). If the number of levels assigned to your exocortex is less than your mechanic level, your exocortex grants a smaller increase to your base attack bonus when using [[combat tracking]], as noted in the table below. You gain additional exocortex abilities, such as [[wireless hack]] and [[multitasking]], based upon the level you assign to it as normal.
<div class="table-wrapper">
| Increase To Base Attack Bonus | Levels Assigned |h
| 1–4 | +1 |
| 5–8 | +2 |
| 9–12 | +3 |
| 13–16 | +4 |
| 17–20 | +5 |
</div>
<div class="statblock">
* <<levels>>
* ''School'' necromancy
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' undead creatures with individual CRs no greater than your level + 1 and a total CR no greater than twice your level, no two of which can be more than 30 ft. apart
* ''Duration'' 1 minute/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
This spell enables you to control undead creatures for a short period of time. You command them by voice and they understand you, no matter what language you speak. No matter what, the controlled undead do not attack you. At the end of the spell, the targets revert to their normal behavior.
If any of the undead are under the control of a hostile creature, that controlling creature can attempt a Will saving throw (DC = the spell's DC) to negate this spell's effect if the creature failed its initial saving throw. Each undead under the control of another creature grants its controlling creature a separate saving throw to negate the effect for that undead.
Intelligent undead creatures remember that you controlled them, and they may seek revenge after the spell's duration ends.
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' transmutation (air)
* ''Casting Time'' 1 standard action
* ''Range'' 10 ft./level; see text
* ''Area'' 10 ft./level radius cylinder, equally high; see text
* ''Duration'' 10 minutes/level (D)
* ''Saving Throw'' Fortitude negates, see text
''Spell Resistance'' yes
</div>
You alter the movement of air in an area around you. Wind created by this spell imposes a penalty to [[Perception]] checks equal to the penalty the wind imposes on non-energy ranged weapon attacks (see [[Table: Wind Effects|Table: Wind Effects]]). At the GM's discretion, outdoor wind conditions are generally light wind, while indoor wind conditions are generally no wind; these conditions can vary by environment. This spell can't create wind in an area that has no atmosphere.
''1st:'' When you cast //control winds// as a 1st-level spell, you can lower or raise the wind speed in the area by one level (for example, from strong wind to either moderate or severe wind), to a minimum of no wind and a maximum of severe wind.
''2nd:'' When you cast control winds as a 2nd-level spell, you can lower or raise the wind speed in the area by up to two levels, to a minimum of no wind and a maximum of severe wind.
''3rd:'' When you cast //control winds// as a 3rd-level spell, you can lower or raise the wind speed in the area by up to three levels, to a minimum of no wind and a maximum of severe wind.
When you dismiss the spell or it otherwise ends, you can create a blast of severe wind in an instantaneous line-shaped burst that originates from the area's point of origin and has a length equal to the area's radius. Creatures that enter the area or start their turn there must attempt a Fortitude saving throw to avoid effects based on their size: Tiny and smaller creatures are knocked [[prone]] and pushed 1d4 × 10 feet along the wind's path, up to the end of the wind's range, and the creature takes 1d4 bludgeoning damage per 10 feet. Small creatures are knocked [[prone]]. Medium and smaller creatures moving against the wind move at half speed. In addition, flying creatures in the area must attempt an [[Acrobatics]] check to fly in dangerous wind conditions. This gust can also do whatever a gust of severe wind might be expected to do, such as put out small flames, fan large flames, blow away vapors, and so on.
''4th:'' When you cast //control winds// as a 4th-level spell, it functions as the 3rd-level version, but you can raise the wind speed up to a maximum of windstorm. In addition, when you cast the spell, you can exclude up to 2 squares per level from the spell's effects; these squares must be contiguous. If you create a blast of wind when you dismiss the spell or it otherwise ends, the blast is windstorm level. Creatures are treated as one size category smaller when determining the effects of the blast on them.
You expertly control your body’s adaptive quirks to mitigate your transformation’s drawbacks. If you have at least 1 MP, you treat your MP total as though it were 1 higher (to a maximum of your normal MP maximum) for the purpose of determining your instinct effects and you treat your MP total as though it were 1 lower (minimum 1 MP) for the purpose of determining your drawback effects.
When you're injured or suffering from certain afflictions, complete bed rest can help speed your recovery.
''Activity:'' You spend the entire day resting. You don't have to sleep for every minute of the 24-hour period, but you must refrain from movement, combat, spellcasting, skill use, conversation, and any other fairly demanding physical or mental task.
''Results:'' You recover 2 Hit Points per character level. Additionally, any ability damage you have is reduced by 2 points per affected ability score. Finally, you move one step toward healthy on the progression track of each poison you're affected by, provided you've either fulfilled that poison's cure condition or reached the end of its duration.
If another character successfully provides you with [[long-term care]], you can recover even faster.
<div class="statblock">
* ''CR'' 2; ''XP'' 600
* CE Large monstrous humanoid
* ''Init'' +1; ''Senses'' [[blindsense]] (vibration) 30 ft., [[darkvision]] 60 ft.; ''Perception'' +7
!!! DEFENSE
* ''HP'' 30
* ''EAC'' 13; ''KAC'' 15
* ''Fort'' +6; ''Ref'' +4; ''Will'' +3
* ''Defensive Abilities'' [[Swarm mind]]; ''Immunities'' acid, fear effects
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' slam +11 (1d6+4 B)
* ''Space'' 10 ft.; ''Reach'' 5 ft.
* ''Offensive Abilities'' acid burst (2d4+4 A, DC 11)
!!! STATISTICS
* ''Str'' +2; ''Dex'' +1; ''Con'' +4; ''Int'' +0; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +7, [[Athletics]] +12, [[Survival]] +7
* ''Languages'' Shirren; [[telepathy]] 100 ft.
* ''Other Abilities'' Swarm carrier
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or troop (2–5 plus 2 Medium-sized Swarm creatures for each convecyte)
!!! SPECIAL ABILITIES
''Acid Burst ([[Ex]])'' When a convecyte dies, its protective plates crack and explode, showering an area with their acidic contents. Every creature within a 20-foot burst (including those within the convecyte) takes 2d4+4 acid damage (Reflex DC 11 half).
''Swarm Carrier ([[Ex]])'' A convecyte can carry a number of creatures under its chitinous layers, giving each creature [[DR]] 10/— and full cover from attacks while they rest inside, though such creatures can't act while inside a convecyte. A convecyte can carry four Small or two Medium creatures this way and can deposit them in adjacent squares as a swift action.
</div>
A swarm convecyte has several interlocking plates of rigid chitin that run along its back and sides. Underneath these plates are hollow cavities that a convecyte can use to hide and transport smaller creatures. An acidic fluid runs through its plates, providing a last-minute bit of defense in the event that the convecyte is killed in battle, though it could be considered a liability if the creatures it is protecting aren't also immune to acid.
The remainder of a convecyte's body is dedicated to generating enough energy for the creature to be able to heft these plates around and carry passengers. As such, a convecyte needs to consume twice as many calories per day as another creature of its size, making its body warm to the touch and elevating the temperature within its body cavities to nearly 90° F. The Swarm use convecytes to transport other Swarm creatures into battle, but only on planets where the terrain isn't too difficult. A Swarm convecyte is about 12 feet long and stands about 8 feet at its shoulder.
For those seeking efficient laser attacks in a reliable, relatively lightweight format, the convergent laser is an ideal weapon. The weapon's smaller lasers synchronize and focus their output on a single target to deal more damage than any single beam could deal alone; however, the need to carefully aim and adjust the weapon makes it somewhat slower to fire than its single-beam counterparts. Typically, the different beams originate from the corners of a square or triangular barrel, angling in to join at a single point on the target. A single-wave convergent laser emits a single wavelength, with all its beams sharing a color. Multiwave convergent lasers produce different wavelengths for each beam, using computer assistance to continually adjust the output, while a wide-spectrum convergent laser increases the number of beams until their joining point on the target is a white so brilliant that it's painful to look at.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|convergent laser, single-wave | 4 | 2,100 | 1d12 F | 100 ft. | [[burn]] 1d6 | 40 charges | 4 | 2 |[[unwieldy]] |
|convergent laser, multiwave | 11 | 24,500 | 4d10 F | 120 ft. | [[burn]] 3d6 | 40 charges | 4 | 2 |[[unwieldy]] |
|convergent laser, wide-spectrum | 15 | 118,000 | 7d10 F | 120 ft. | [[burn]] 4d6 | 40 charges | 4 | 2 |[[unwieldy]] |
</div>
When you attempt a [[Bluff]] check, you can choose not to roll your [[expertise]] die until later. After you determine what the check's result would be, you can choose to either roll your expertise die and add the result to the total or forgo the expertise die and reroll the check. At 9th level, you can spend 1 Resolve Point to reroll the check and add the result of your expertise die.
You can pull the pin on a grenade and hold onto it until the last second before its detonation, making it harder to avoid.
''Prerequisites:'' Dex 11, proficiency with grenades
''Benefit:'' As a full action, you can draw a grenade and make a ranged attack with it. If you do so, the grenade's Reflex save DC is increased by 2. If your attack roll is a natural 1 (the d20 comes up 1), the grenade instead detonates at a randomly determined grid intersection of your space.
Coolant sprayers were designed following the principles of a flamethrower, but with an eye more toward hindrance than sheer damage. Experts can easily identify a coolant sprayer by the bulky insulation surrounding the sprayer's coolant reservoir. The weapon expels a cone of activated coolant that stiffens and freezes living tissue. While not harmless, the effect is somewhat less deadly than most energy weapons. Hiemal, algid, glacial, and isothermal coolant sprayers all function in similar ways, though their destructive potential varies from one model to another.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|coolant sprayer, heimal | 3 | 1,600 | 1d4 C | 20 ft. | [[stagger]] | 40 charges | 4 | 3 |[[blast]], [[entangle]] (1d4 rounds), [[unwieldy]] |
|coolant sprayer, algid | 7 | 7,400 | 1d6 C | 30 ft. | [[stagger]] | 40 charges | 4 | 3 |[[blast]], [[entangle]] (1d4 rounds), [[unwieldy]] |
|coolant sprayer, glacial | 12 | 41,000 | 2d6 C | 40 ft. | [[stagger]] | 40 charges | 4 | 3 |[[blast]], [[entangle]] (2d4 rounds), [[unwieldy]] |
|coolant sprayer, isothermal | 17 | 290,000 | 3d6 C | 40 ft. | [[stagger]] | 40 charges | 4 | 3 |[[blast]], [[entangle]] (2d4 rounds), [[unwieldy]] |
</div>
You and your allies practice teamwork exercises, combat routines, and fundamental skills, building a rapport that pays dividends.
''Activity:'' You spend the day training with at least one other creature who is performing the coordinate activity. Up to six creatures can train together this way, as long as each is using the coordinate activity.
''Results:'' On the following day, when you grant a creature you trained with a bonus using [[aid another]], [[covering fire]], or [[harrying fire]], you can increase that bonus by 1.
''Multiday:'' For each consecutive day you spend coordinating with an ally, you increase by 1 the DC of [[Sense Motive]] checks to [[discern secret messages]] that you and that ally pass to one another using [[Bluff]], up to a maximum of 7 higher. This increase lasts for the number of days you spent coordinating.
If you have a [[drone]], whenever both you and your drone make attacks against the same target, you each receive a +1 circumstance bonus to your attack rolls. If you have an [[exocortex]] instead, whenever you and your exocortex are both attempting to hack a system, you each receive a +1 circumstance bonus to the checks to gain access. In either case, these bonuses increase to +2 at 17th level.
As a move action, choose one ally within 60 feet. That ally gains the benefit of the [[Coordinated Shot]] feat. If the chosen ally already has this feat, they do not grant foes cover against attacks made by you and your allies. The effects of this improvisation last until the start of your next turn.
This is a language-dependent, mind-affecting, sense-dependent effect.
Whenever you or an ally within 60 feet of you charges an opponent, you can signal all allies within 60 feet of the charging character as a reaction. Signaled characters can also charge the opponent as a reaction if the distance between the character and the charged opponent is equal to or less than the signaled character's speed. All characters that charge an opponent using this improvisation are [[staggered]] until the end of their next turn. Characters who can't be staggered can't benefit from this improvisation. Once you use this ability, you can't use it again until after you regain Stamina Points following a 10-minute rest.
This is a language-dependent, mind-affecting, sense-dependent effect.
As a move action, you can coordinate your allies into effective flanking partners. Until the start of your next turn, you and your allies count as flanking any creature that at least two of you threaten, regardless of your position.
This is a language-dependent, mind-affecting, sense-dependent effect.
Whenever an ally within 60 feet attempts to use a combat maneuver against an opponent, as a reaction you can signal weak points in the opponent's defenses. The ally gains a morale bonus to their attack roll for that combat maneuver equal to 1d4+1. Once you use this ability, you can't use it again until after you regain Stamina Points following a 10-minute rest.
This is a language-dependent, mind-affecting, sense-dependent effect.
As a move action, you can grant a single move action to an ally within 60 feet. The ally can use that move action during her next turn to reload or draw a weapon. As part of the move action to activate this ability, you can also reload or draw a weapon. If the ally is adjacent to you, she can draw weapons and use ammunition you are carrying as though she were carrying them herself. The ally can use her extra move action in between her other actions, as well as before or after a full action. A character can use no more than one bonus action from coordinated reload or similar abilities (such as the [[quick quaff]] and [[hurry]] envoy improvisations) in a single round.
This is a mind-affecting, sense-dependent effect.
You can maneuver a foe to be in the direct line of an ally's fire.
''Prerequisites:'' Base attack bonus +1.
''Benefit:'' When you are threatening a foe with a melee weapon, any ally that has line of sight to that foe without you granting that foe cover gains a +1 bonus to ranged attack rolls against that foe.
Copaxis evolved from copi, an unintelligent, coral-like organism that once covered their home world—the now heavily industrialized planet Tabrid Minor. Copi exhibit a supernatural attunement to the universe's gravitational forces, and for ages, copaxis harnessed this organism's power to create floating cities where they lived for centuries in a near-utopia.
The Signal changed copaxi society forever in 3 AG when copaxi inventors discovered how to refine copi into a semiorganic alloy suitable for constructing starships. Conflicting ideologies arose between traditionalists who clung to their people's ancient mysticism and technological innovators who wished to explore the stars. These differences led to violence and, eventually, all-out war. The ensuing struggles toppled the established order, nearly destroyed copaxi mystical traditions, and led copaxis to abandon their flying cities in pursuit of industrialization. The newly united copaxis decimated the planet's copi, simultaneously fueling a technological revolution while also severing their connection to the copi's supernatural power.
Thanks to their world-spanning government's fearful suppression of its past for decades, modern copaxis have only recently begun uncovering their planet's history. Most admit that Tabrid Minor has suffered as a result of rapid industrialization, but few know the extent of the damage or comprehend their ancestors' sacrificed connection to copi. Fewer still know the history of robotic life on the planet, for the government strictly monitors such technology and has instilled a superstitious fear of anything resembling a sentient machine in the populace. After Tabrid Minor began petitioning the Pact Worlds for protectorate status several years ago, the planet's government increased its crackdown on historical introspection, fearing the world's fraught past might undermine its chances of being accepted.
Copaxis have long enjoyed an affinity for solarian techniques, particularly minor feats of gravity control, though their current powers encompass only a shadow of what the species once accomplished with their full copi connection. Now that adventurers have begun rediscovering their people's ancient techniques locked away in the floating cities, sundry factions—from independent gyms to soldier-scholars trained by the military—have begun restoring and innovating the nearly forgotten arts of gravity manipulation and ecological mysticism.
A copaxi is a colony of individual, genetically identical polyps that have developed into an anthropomorphic form. Each polyp includes five feeding tentacles, about 2 inches long, that facilitate filter feeding. These polyps adapt and intertwine to form every part of a copaxi's body. Their segmented, calcium-rich exoskeletons sometimes develop elaborate horns and head crests that serve as unique identifiers for a copaxi.
!! Racial Traits
* ''Ability Adjustments:'' +2 Con, +2 Cha, –2 Wis
* ''Hit Points:'' 4
* ''Size and Type:'' Copaxis are Medium humanoids with the copaxi subtype.
* ''Blindsense:'' Copaxis have [[blindsense]] (scent) with a range of 30 feet.
* ''Gravity Adjustment:'' Retaining some of their ancient connection to the universe's gravitational forces, a copaxi can adjust their personal gravity as a standard action. They can treat high or low gravity as standard gravity or treat standard gravity as high or low gravity. These adjustments affect only the copaxi and anything they carry, but not thrown weapons. A copaxi can't adjust to or from extreme or zero gravity. This adjustment remains in effect until the copaxi spends another standard action to return to their environment's natural gravity. Entering an environment with a different gravity also cancels the copaxi's ongoing gravitational adjustment.
* ''Natural Communicator:'' A copaxi quickly adopts new forms of communication. Each time a copaxi gains a rank in Culture, they learn two languages rather than one language.
* ''Regenerative Evolution:'' A copaxi gradually reshapes their body and neural networks to overcome new challenges. Each time a copaxi gains a level, they can retrain all the choices of one previous character level, as though they had used a [[mnemonic editor]]. They must have qualified for any new selections at the retrained level.
Copper dragons are mischievous and enjoy playing pranks on both allies and enemies.
* ''CR:'' 3+
* ''Required Creature Type and Subtype:'' dragon (earth)
* ''Suggested Alignment:'' chaotic good
* ''Traits:''
** [[blindsight]] (vibration) 60 feet and [[darkvision]] 120 feet
** [[frightful presence]] (CR 14+, 60 feet + 10 feet per CR)
** [[DR]] 5/magic (CR 13+; increase to DR 10/magic at CR 15, DR 15/magic at CR 17, DR 20/magic at CR 19)
** [[immunity]] to acid
** burrow speed of 30 feet
** climb stone (see below)
** [[breath weapon]] (line 30 feet + 10 feet per 2 CR, 1d6 A + 1d6 per CR)
** slow breath (see below)
** spell-like abilities (CR 8+)
* //Climb Stone ([[Ex]]):// A copper dragon can climb on stone surfaces as though affected by //[[spider climb]]//.
* //Slow Breath ([[Su]]):// Instead of a line of acid, a copper dragon can breathe a 30-foot cone of slowing gas. Each creature within the cone that inhales the gas must succeed at a Fortitude save or be slowed (as per //[[slow]]//) for 1d6 rounds plus a number of additional rounds equal to half the dragon's CR.
The hollow head of this two-handed hammer is filled with exceptionally dense plasma, which is released on contact with enemies, sometimes even spraying plasma on a well-placed strike. Core hammers constructed by the followers of Angradd tend to be functional works of dark metal, where vesk models are usually designed to display the plasma behind magnetic containment. Tactical core hammers and advanced core hammers contain a stable plasma core, while fusion core hammers and reactor core hammers employ devices that focus plasma to trigger momentary flares of nuclear fusion.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|core hammer, tactical | 3 | 1,320 | 1d6 E & F | [[jet]] 1d6 | 2 |[[powered]] (capacity 40, usage 2) |
|core hammer, advanced | 8 | 9,150 | 3d6 E & F | [[jet]] 2d6 | 2 |[[powered]] (capacity 40, usage 2) |
|core hammer, fusion | 13 | 48,200 | 6d6 E & F | [[jet]] 4d6 | 2 |[[powered]] (capacity 40, usage 5) |
|core hammer, reactor | 20 | 725,000 | 15d6 E & F | [[jet]] 8d6 | 2 |[[powered]] (capacity 80, usage 8) |
</div>
<<list-links "[tag[Races]tag[Core]sort[title]]" class:index >>
<<list-links "[tag[Core Systems]]" class:index>>
<div class="statblock">
* ''CR'' 10; ''XP'' 9,600
* N Large vermin
* ''Init'' +2; ''Senses'' darkvision 60 ft.; ''Perception'' +19
!!! DEFENSE
* ''HP'' 165
* ''EAC'' 23; ''KAC'' 27
* ''Fort'' +14; ''Ref'' +9; ''Will'' +12
* ''Immunities'' fire
!!! OFFENSE
* ''Speed'' 20 ft., burrow 10 ft.
* ''Melee'' bite +20 (2d10+15 P plus 1d10 F; critical [[burn]] 1d10) or
* claw +22 (2d6+15 S plus 1d10 F)
* ''Space'' 10 ft.; ''Reach'' 5 ft.
* ''Offensive Abilities'' [[breath weapon]] (30-ft. cone, 11d6 F, Reflex DC 17 half, usable every 1d6 rounds)
!!! STATISTICS
''Str'' +5; ''Dex'' +2; ''Con'' +8; ''Int'' —; ''Wis'' +3; ''Cha'' +0
''Skills'' [[Athletics]] +19, [[Survival]] +19
''Other Abilities'' [[solar adaptation]], solar slingshot, [[void adaptation]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or crew (1–2 plus 3–8 [[sun-scrapper beetles]])
!!! SPECIAL ABILITIES
''Heated Carapace ([[Ex]])'' A dawn core-diver exudes intense heat, dealing 1d10 fire damage to any creature that hits it with a natural weapon or unarmed strike and to any creature the core-diver hits with its attacks.
''Scrap ([[Ex]])'' See [[sun-scrapper beetle]].
''Solar Slingshot ([[Ex]])'' See [[sun-scrapper beetle]].
</div>
As a standard action, you can surround your body with an envelope of fiery plasma. You gain cold [[resistance]] 10, and any adjacent creature that hits you with a natural weapon or a melee weapon takes 2d6 fire damage. The corona lasts for 1 round or until you leave photon mode. At 12th level, the damage increases to 3d6 and the cold resistance increases to 15. At 18th level, the damage increases to 4d6 and the cold resistance increases to 20.
When you are attuned or fully attuned, any creature that starts its turn adjacent to you while your corona is in effect takes fire damage equal to half your solarian level.
Corporations control much of the modern world, from the food each person eats to the weapons a soldier deploys on the field of battle. You are an agent of one such corporation, which relies on your negotiation, deal-making, and your natural cunning to advance its agendas. Whether you are making proposals to agents of other corporations to split the mining rights for a valuable asteroid or establishing your corporation's presence on a newly discovered world, you are the company's eyes, ears, and hands.
!! Theme Knowledge (1st)
You are deeply connected to the world of corporate culture, and know all the movers and shakers. When attempting a [[Profession]] or [[Culture]] check to [[recall knowledge]] about corporations and their executives, reduce the DC by 5. [[Diplomacy]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to Diplomacy checks. In addition, you gain an ability adjustment of +1 to Charisma at character creation.
!! Networking (6th)
If your corporate database doesn't have a piece of information you are searching for, you probably know someone who does. It takes you only 10 minutes to attempt a [[Diplomacy]] check to gather information, as long as you have connection to a local infosphere or a quick way to communicate with contacts in a settlement that is at least technologically average. Additionally if you have access to a local infosphere, you can take 20 on a skill check to [[recall knowledge]] in half the normal time (typically 1 minute).
!! Strong-Arm Tactics (12th)
When you throw the name of your company around, you can usually get what you want, though acting in such a way never wins you any friends. When you successfully use [[Intimidate]] to [[bully]] a creature, its change in attitude lasts three times as long. At the GM's discretion, this ability might not work on creatures that haven't heard of your corporation.
!! Seal the Deal (18th)
Nothing is more thrilling to you than engaging in spirited discussion to pursue your employer's interests. It is why you were hired, and it's why you venture out into the wider cosmos. Up to twice per day, after you spend at least 10 minutes bargaining and negotiating (this doesn't count as resting to regain Stamina Points) or using an infosphere to research details relevant to a deal that is significantly advantageous to your company, you regain 1 Resolve Point.
This portable light source functions as a [[lantern|Portable Light]] that never requires a battery, though the light it gives off is an unsettling pale green. Once per day as a standard action, you can touch an arcane rune on the lantern's base to cause all corpses within the 10-foot radius of its light to speak, as per //[[grave words]]//.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//corpse lantern// | 2 | 500 | L |
</div>
A corpse recycler allows a starship crew to render bodies into parts for necrografts. In a process that takes 1 hour, a carcass fed into the recycler produces a number of necrograft UPBs equal to 10 × the CR of the creature from which the corpse originated. These UPBs can be used only to create necrografts.
<div class="table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|corpse recycler | 2 | 2 |
</div>
<div class="statblock">
* ''Type'' drug (ingested)
* ''Save'' Fortitude DC 23
* ''Addiction'' Fortitude DC 23 (physical)
* ''Track'' [[Dexterity|Dexterity Poison Track]]
* ''Effect'' +4 morale bonus to saves against death effects and, if reduced to 0 Hit Points, [[stabilize]] automatically without spending any Resolve Points for 1d4 hours.
</div>
<div class="table-wrapper">
|Substance | Level | Price |h
|corpseflower pollen | 15 | 80,000 |
</div>
<<section 'Corpsefolk Operative'>>
<<section 'Corpsefolk Marine'>>
Bodies of the dead can, if in good enough condition, be magically made into corpsefolk: free-willed and intelligent undead who remember much of their past lives. For lone necromancers, this magic is possible only if the corpse is of the recently deceased or has been preserved shortly after death. However, the bone sages of Eox have learned to magically repair even badly damaged corpses and those decayed beyond what was usable for lesser necromancers.
As a result, corpsefolk make up much of the population of Eox, some serving as indentured servants to pay off the cost of their creation. Undead creatures of this type were called zombie masters in ancient days, but as a class of normal citizens on Eox and soldiers in the Corpse Fleet, they have become known as corpsefolk, balancing their humble social status with their self-willed mentality.
Corpsefolk look like zombies, but unlike those undead, corpsefolk retain memories of their previous lives, skills and abilities gained from classes and experience, and the will to make their own decisions. Initially, a corpsefolk's physical form looks gaunt and dry, with sunken eyes and a hollow torso, but it begins as intact as its corpse was when it gained undeath.
As corpsefolk age, however, their bodies can become torn and tattered. Early in their undead years, corpsefolk use surgery and magic to adopt a more wholesome appearance, but after a few decades, most cease to care what they look like, focusing only on what they can do to increase their long-term wealth and power. Corpsefolk can benefit from cybernetic implants, though many prefer necrografts, which blend more seamlessly with their animated forms.
Most living creatures see corpsefolk as walking corpses and as such fear or mistrust them, but other self-aware undead creatures treat corpsefolk as second-class undead. Bone sages view corpsefolk as barely better than zombies, while ghouls, vampires, and other undead treat them as peasants or wage slaves unworthy of respect. Because most corpsefolk exist as a result of being created specifically to serve, few enter their undead existence with wealth, power, or influence. Most corpsefolk also lack innate magic power or special abilities. Though they can learn and excel with time and practice, doing so is no easier for them than for living creatures. This fact, coupled with the prejudices they face, makes it difficult for corpsefolk to rise into important positions. Eox, for instance, has a vast corpsefolk underclass, and these ragged undead are rarely selected for any position calling for interaction with living citizens of the Pact Worlds.
Corpsefolk can be found in various roles in those societies that accept them: managers, soldiers, technicians, and workers. They can use equipment they mastered in life and gain new skills, though they vary in their ambition. Some corpsefolk lack the drive to do more than the minimum needed to maintain their existence, which is very little. Unlike undead that must consume materials from the living or those that hate the living and wish to destroy them, corpsefolk have no supernatural hunger or drive to kill. They don't need air, food, sleep, or water, and the more apathetic corpsefolk also don't need stimuli—when left alone, they can sit in silence for weeks or years with no sense of boredom or unease. Such corpsefolk carry out the tasks assigned to them and do little else.
Most corpsefolk, however, still experience emotions and desires, though they have duller passions than most of the living and take a long-term view. Even when tending to menial tasks, they assume their current positions are temporary, trusting that as time passes and their experience grows, they can at least improve their lot even if positions of power and influence are out of reach.
Some corpsefolk have great ambition. These drives can be tied to some aspect of a corpsefolk's original life or an activity experienced early in their undeath that sparks significant interest. Such corpsefolk might settle old scores from their life, become fascinated with a specific kind of art, eagerly embrace new skills and opportunities, explore situations they feared in life, or seek to excel at assigned tasks as a way to track their progress through a potentially eternal unlife.
!! Corpsefolk Template Graft
The animated corpse of a dead creature, a corpsefolk keeps the abilities, intelligence, and skills it had when it was alive. Most corpsefolk are cunning and dangerous foes rather than mindless undead. They lack most of the needs, much of the fear, and many mortal vulnerabilities that can hold back the living.
* ''CR:'' 2+
* ''Required Creature Type:'' undead
* ''Traits:''
** [[DR]] 5/magic
** increase Hit Points by 20%
* ''Suggested Ability Modifiers:'' combatant—Dexterity, Strength; expert—Dexterity, Intelligence; spellcaster—Wisdom, Dexterity
<div class="statblock">
* ''CR'' 7; ''XP'' 3,200
* Corpsefolk soldier
* NE Medium undead
* ''Init'' +9; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +14
!!! DEFENSE
* ''HP'' 126
* ''EAC'' 19; ''KAC'' 22
* ''Fort'' +9; ''Ref'' +7; ''Will'' +8
* ''DR'' 5/magic; ''Immunities'' [[undead immunities]]
!!! OFFENSE
* ''Speed'' 30 ft. (20 ft. in armor)
* ''Melee'' LFD [[pulse gauntlet]] +14 (2d6+9 B & So; critical [[knockdown]])
* ''Ranged'' dual [[acid dart rifle]] +17 (2d8+9 A & P; critical [[corrode]] 2d4) or [[frag grenade]] II +17 ([[explode]] [15 ft., 2d6 P, DC 15])
* ''Offensive Abilities'' fighting styles ([[sharpshoot]]), [[focus fire|Sharpshoot]], [[sniper's aim|Sharpshoot]]
!!! STATISTICS
* ''Str'' +2; ''Dex'' +5; ''Con'' —; ''Int'' +0; ''Wis'' +4; ''Cha'' +0
* ''Skills'' [[Athletics]] +19, [[Intimidate]] +14, [[Piloting]] +14
* ''Other Abilities'' [[unliving]]
* ''Languages'' Common
* ''Gear'' elite [[defiance series]], dual [[acid dart rifle]] with 48 darts, LFD [[pulse gauntlet]] with 2 batteries (20 charges each), [[frag grenades]] II (2)
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or elite squad (3–5)
</div>
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* Corpsefolk operative
* NE Medium undead
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +14
!!! DEFENSE
* ''HP'' 42
* ''EAC'' 14; ''KAC'' 15
* ''Fort'' +3; ''Ref'' +6; ''Will'' +7
* ''Defensive Abilities'' [[evasion]]; ''DR'' 5/magic; ''Immunities'' [[undead immunities]]
!!! OFFENSE
* ''Speed'' 40 ft.
* ''Melee'' survival [[knife]] +7 (1d4+4 S)
* ''Ranged'' static [[arc pistol]] +9 (1d6+3 E; critical [[arc]] 2) or tactical [[shirren-eye rifle]] +9 (1d10+3 P)
* ''Offensive Abilities'' [[trick attack]] +1d8
!!! STATISTICS
* ''Str'' +1; ''Dex'' +4; ''Con'' —; ''Int'' +1; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +9, [[Intimidate]] +9, [[Sleight of Hand]] +14, [[Stealth]] +14
* ''Other Abilities'' operative exploits ([[uncanny mobility]]), specialization ([[thief]]), [[unliving]]
* ''Languages'' Common
* ''Gear'' graphite [[carbon skin]], static [[arc pistol]] with 2 batteries (20 charges each), survival [[knife]], tactical [[shirren-eye rifle]] with 25 sniper rounds
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or association (3–10)
</div>
<div class= "statblock">
* ''Rate'' +0; ''Initial'' +0; ''Maximum'' +0
* ''Special'' As a standard action, the mech can draw the residual life energy out of a creature within its reach that died within the past minute. The power core's rate increases by 1, which lasts 1 round for every 4 levels or CR the dead creature possessed. The mech can't draw energy from the same creature more than once, and the creature's level or CR must be at least half the mech's tier (minimum 1). A mech can't increase its rate by more than 1 in this way.
* ''Cost'' 1/2 × tier
</div>
Eoxian engineers pioneered this core template, granting the mech an insatiable hunger for souls.
''System:'' Skin
Perhaps as much a fashion statement as an augmentation, corpseskin replaces living skin with mummified flesh. Corpseskin insulates against cold, though it lacks the sensitivity of living flesh. You gain an amount of cold [[resistance]] equal to the necrograft's mark. If you have cold resistance from your racial traits that is equal to or greater than that from your corpseskin (and doesn't explicitly stack with other sources of energy resistance), adding corpseskin increases the value of that cold resistance by 1. If you have cold resistance from your racial traits of a value less than that of your corpseskin, the value of the cold resistance from your corpseskin increases by 1.
Regardless of your corpseskin's model, you take a –2 penalty to [[Perception]] checks based primarily on touch and gain a +2 enhancement bonus to saving throws against pain effects. The necrograft grants a +5 competence bonus to [[Disguise]] checks to impersonate corporeal, non-skeletal undead, but it increases the DC of disguising yourself as a living creature by 5 (in addition to any other modifiers). In addition, corpseskin protects against [[radiation]] as armor of its item level.
The target takes corrode damage equal to the amount listed. This functions as the [[burning]] condition but deals acid damage rather than fire damage.
<div class="statblock">
* <<levels>>
* ''School'' necromancy
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one object
* ''Duration'' 1 round/level
* ''Saving Throw'' Fortitude negates (object)
* ''Spell Resistance'' yes (object)
</div>
You cause the energy cells of a technological item to corrode, causing it to unreliably hold a charge. Whenever a creature uses the target item in a way that would use a charge, there’s a 20% chance the item doesn’t function (as if the item is out of charges), and any action normally required to use the item is lost.
The //corrosive// fusion weaves the destructive power of acid into the weapon's form. Half the weapon's damage type is replaced with acid damage. You can activate or deactivate the //corrosive// fusion as a swift action. If the weapon already deals two types of damage, replace one of them with acid (you decide which damage type is replaced each time you activate the //corrosive// fusion). You can add this fusion only to a weapon that does not already deal acid damage. This fusion never causes a weapon that normally targets KAC to target EAC.
<div class="statblock">
* <<levels>>
* ''School'' evocation (acid)
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Effect'' 5-ft.-diameter cloud of acid
* ''Duration'' 1 round/level
* ''Saving Throw'' Reflex negates
* ''Spell Resistance'' yes
</div>
A 5-foot cloud of acid-resistant nanites continually converts nearby water vapor into deadly acid. You can create the cloud in the same square as a creature and move it up to 30 feet in any direction as a move action on your turn. If the cloud enters (or is created in) a square containing a creature, it can't move any farther that round and deals 4d6 acid damage to that creature (Reflex negates). The acidic cloud also corrodes any unattended objects along its path, dealing them 4d8 acid damage.
If you don't move the cloud, it remains where it is; if it shares its square with any creature at the beginning of your turn, that creature must succeed at a Reflex save or take 4d8 acid damage. Any creature that takes damage from the cloud takes 10 additional acid damage at the end of its next turn.
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* CE Medium monstrous humanoid
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft., [[blindsense]] (vibration) 30 ft.; ''Perception'' +13
!!! DEFENSE
* ''HP'' 40
* ''EAC'' 14; ''KAC'' 16
* ''Fort'' +5; ''Ref'' +7; ''Will'' +4
* ''Defensive Abilities'' [[Swarm mind]]; ''Immunities'' acid, fear effects
!!! OFFENSE
* ''Speed'' 40 ft., climb 30 ft.
* ''Melee'' claw +9 (1d6+5 S)
* ''Ranged'' acid cannon +12 (1d4+3 A; critical [[corrode]] 1d4)
* ''Offensive Abilities'' psychic assault
!!! STATISTICS
* ''Str'' +2; ''Dex'' +4; ''Con'' +1; ''Int'' –1; ''Wis'' +1; ''Cha'' –3
* ''Skills'' [[Acrobatics]] +8, [[Athletics]] +8 (+16 when climbing), [[Stealth]] +8
* ''Languages'' Shirren; [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or pack (3–8)
!!! SPECIAL ABILITIES
''Acid Cannon ([[Ex]])'' A corrovox has an organic acid cannon grafted onto its forearm that can fire blobs of organic acid at a range increment of 40 feet. This weapon can't be disarmed and produces its own ammunition, so it never runs out.
''Psychic Assault ([[Su]])'' A corrovox can unleash a burst of harmful mental chatter at a target within 30 feet as a standard action. The target takes an amount of damage equal to 1d4 × the corrovox's CR (3d4 damage for most corrovoxes). A successful DC 12 Will save halves this damage.
</div>
Corrovoxes are Swarm shock troops. They act as advance scouts and worldseekers for the Swarm, and moving vast hordes across potential feeder worlds. Like many Swarm creatures, corrovoxes have latent telepathic ability and are capable of psychically ravaging a foe's mind.
You have embraced your corruption.
''Prerequisites:'' One or more corruption manifestations.
''Benefit:'' Choose one of your manifestations and make its gift permanent. If you're ever cured of your corruption, you lose the stain but not the gift. You can take this feat multiple times, making a different gift permanent each time you do so. Each instance of this feat counts as a manifestation you have for calculating the save DC for corruption.
<$list filter="[list[$:/StoryList]is[current]]">
Corruption is an insidious affliction of the soul. A number of different corruptions exist, from the mind-rending horror of ghostly possession to the monstrous physical transformation of lycanthropy. However, all corruptions function in a similar way. When a character first contracts a corruption, it shows itself in minor symptoms—brief bouts of melancholy or a mild fixation on unusual stimuli or a particular environment. The corruption eats away at the victim's mind and spirit with the promise of dark gifts that come with frightful drawbacks. Fighting these temptations is draining on a victim, and some spend their entire lives on the verge of giving in. Others believe they can control their corruption, and allow the corruption to progress in order to gain the power it grants. Such beings eventually become completely defiled as corruption takes a permanent hold over them.
</$list>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Corruptions'>>
</div>
<$list filter="[list[$:/StoryList]is[current]]">
!! Contracting Corruption
A character can contract corruption in numerous ways, from an ancient curse to a technomagical virus. A corruption's origin is usually supernatural, and contracting one requires failing a saving throw against the corruption's cause. When corruption first takes hold, it begins at stage 1 and is dormant. A victim might not grasp the nature of the affliction for some time. During this period, dark urges or horrific nightmares might occur, but nothing more.
!! Corruption Progress
When you're afflicted with a corruption, you must attempt a saving throw against the corruption's progress at the end of each day, before taking the normal 8 hours of uninterrupted rest to regain spent Resolve Points and daily abilities. If the corruption is mental, this is a Will save. A physical corruption requires a Fortitude save. The save DC is equal to 10 + half your level + the number of manifestations you have (see below). If you fail, you can instead spend a number of Resolve Points equal to 1 + the number of manifestations you have in order to succeed. If you can't or don't spend the required number of Resolve Points, your corruption progresses one stage. Every time the corruption progresses to an evennumbered stage, such as from stage 1 (dormant) to stage 2, you gain a manifestation.
!! Manifestations
Corruptions become evident through manifestations, which alter your mind and body in strange ways. A manifestation grants a power, known as a gift, but it also imposes a detriment, known as a stain. When you gain a manifestation, you choose which manifestation to receive, but some have prerequisites that must be met before they can be selected.
''Saving Throws:'' Unless stated otherwise, for gifts that require a saving throw, the DC is equal to 10 + half your level + your key ability score modifier.
''Refusing Gifts:'' When you select a manifestation, you can refuse its gift and accept only the stain. If you do, you gain a +1 bonus to further saving throws against that corruption. This bonus stacks for each gift you refuse. You can change your mind and accept a gift at any time, however, losing the corresponding bonus to saving throws against your corruption and risking your soul.
''Alterations:'' The number of manifestations you have affects your personality and appearance, as detailed in a given corruption. If you accept five gifts or have nine manifestations, you succumb to corruption and become an NPC under the GM's control. This change can also alter your other statistics, depending on the corruption.
''Multiple Corruptions:'' In the rare case that you gain multiple corruptions, you must attempt separate saving throws against each, and gain manifestations from each corruption you fail the saving throw against, in order. You still succumb to corruption when you have five gifts or nine manifestations, however, regardless of the source. Therefore, having multiple corruptions only speeds your doom. When a specific corruption's feature is based on the number of manifestations you have, you count only the manifestations that arise from that specific corruption.
!! Removing a Corruption
Corruptions are hard to remove. Each requires a specific set of deeds or circumstances as detailed in the corruption's description. //[[Remove affliction]]// can suppress the gifts and stains of a target's corruptions for 10 minutes per caster level. In addition, one casting of break enchantment or remove affliction can remove one manifestation, but only if the victim meets the cure conditions of the corruption or hasn't accepted the gift associated with that manifestation. The DC for such spells is 15 + three times the number of manifestations the target has. Removing a manifestation in this way doesn't cure the corruption.
</$list>
Cosmetics are usually liquids or powders used for covering blemishes or subtly altering one’s facial features. They can be purchased in countless brands, colors, and styles. Using cosmetics to disguise yourself gives you a +1 circumstance bonus on [[Disguise]] checks as long as you are not attempting to disguise yourself as a different species.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|cosmetics | 1 | 20 | L |
</div>
<div class="statblock">
* <<levels>>
* ''School'' evocation
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' 20-ft.-radius spread
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Reflex partial, see text
* ''Spell Resistance'' yes
</div>
You pull dormant mystical energy from the land and objects around you and use it to create a swirling eddy that batters your foes and can hinder their movement. The eddy deals 4d6 bludgeoning damage to each creature in the area. Additionally, creatures in the area are knocked [[prone]] and are reduced to half speed while the spell is in effect. A creature that succeeds at a Reflex save takes only half damage and is not knocked prone, but it is still reduced to half speed. Flying creatures within the eddy's area must attempt an [[Acrobatics]] check to fly (DC equals the spell's save DC) each round. Failure means the creature cannot move for that round.
The spell deals damage and knocks creatures prone only once. However, if a creature leaves the spell's area and then returns, it is subject to the damage and other effects described above again (and can attempt another Reflex saving throw). Similarly, if a creature is not in this spell's area when it is first cast but later moves into it, it is subject to the damage and other effects described above.
Small, unattended items (no more than light bulk) are also thrown around in the eddy's area. At the end of the spell's duration, such items land in a randomly determined space
within the spell's area.
A rapidly spinning pulsar casts out subatomic particles, constantly shooting high-energy cosmic rays into space; you've learned to control these cosmic rays and wield them in battle. As a standard action while you are attuned or fully attuned, you can shoot a ray of high-energy particles at a single target within 120 feet, making a ranged attack against its EAC. On a hit, your target is exposed to medium [[radiation]]. At 12th level, your cosmic ray exposes the target to high radiation instead, and at 20th level, your cosmic ray exposes the target to extreme radiation.
Once you use this revelation, you can't use it again until you rest for 10 minutes to regain Stamina Points.
You can reveal one of the mysterious underpinnings of the universe you've learned in your travels, forcing a creature to grapple with the implications.
''Prerequisites:'' Wis 15, [[Bluff]] 5 ranks, [[Mysticism]] 5 ranks.
''Benefit:'' As a standard action, you can spend 1 RP to force one creature within 30 feet of you to attempt a Will save (DC = 10 + half your ranks in Bluff + your Wisdom bonus); if it fails, it is [[confused]] for 1d4 rounds. Once a creature has seen or heard you use this ability, it is immune to your further uses of the ability for 24 hours. This is a language-dependent, sense-dependent ability.
A cot is a portable bed consisting of sturdy fabric stretched over a collapsible aluminum or composite frame. Assembling or collapsing a cot is a full action. A cot has 1 bulk when collapsed, and increases to 3 bulk when assembled.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|cot | 1 | 25 | 1 |
</div>
name:counter-missile bank
range:short
speed:14
damage:8d6
pcu:10
cost:11
special:[[limited fire]] 6, [[point]] (+12)
This substance boosts your immune system. If you take or are injected with a counteractant, you gain a bonus equal to the medicinal's tier to saving throws to end afflictions, and a successful saving throw counts as a number of consecutive saving throws equal to the medicinal's tier.
<<list-links "[tag[Countermeasures]sort[title]]" class:index>>
As a reaction when you take damage from an attack by a technological weapon or source within medium range that specifically targets you, you can expend an unused spell slot to disrupt the attack. With a spell slot of 1st to 5th level, you can counter an attack from a technological weapon whose item level is equal to or less than the level of the expended spell slot × 3, to a maximum of your caster level. 6th-level spell slots can counter any weapon with a level equal to or less than your caster level. For example, at 2nd level, you could expend a 1st-level spell slot to counter an attack from a 1st- or 2nd-level weapon. To successfully counter the attack, you must roll a countertech check (1d20 + your caster level) with a DC equal to 11 + the weapon's level. If the countertech check succeeds, the attack deals half damage. If the countertech check fails, the attack deals normal damage. This magic hack only affects attacks that target you directly; you cannot use countertech against attacks that target an area or that target another person.
You can spend 1 Resolve Point to use your [[countertech]] magic hack to counter a direct attack against an ally within 15 feet. You can't use countertech sentinel against attacks that target an area. You must have the countertech magic hack to choose this magic hack.
As a full action, you can deliver a special attack called a coup de grace to an adjacent [[helpless]] opponent. You automatically hit and score a critical hit. If the target survives the damage, he must succeed at a Fortitude saving throw (DC = 10 + your level or CR) or die. However, if the target is immune to critical hits, the coup de grace does not deal critical damage or effects, nor does it force the target to succeed at a saving throw or die.
Enchanted to pulse with a bluish glow, a //courage medallion// is awarded to those who risked their own lives to protect the innocent and their fellow companions. Once per day as a standard action, you can activate the item to summon a fiery orb, granting you the benefits of //[[wisp ally]]// until the end of your next turn.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//courage medallion// | 1 | 100 | L |
</div>
Using fear-suppressing chemicals and magic, this upgrade bolsters your resolve. It must be installed in a suit of armor for 24 hours before it functions, and when the upgrade is removed from the armor, no other upgrade can use its vacated slot for 24 hours. While you are wearing the armor and this upgrade has a charge, you ignore the effects of the [[shaken]] condition. When an effect would cause you to gain the [[frightened]] or [[panicked]] condition, as a reaction you can expend the device's charge to be shaken for the same amount of time instead. The device's charge replenishes each day.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk | Capacity | Usage |h
|//courage module// | 10 | 18,300 | 1 | any | L | 1 | 1 |
</div>
Cover does not necessarily block precise senses, but it does make it more difficult to hit a target. To determine whether your target has cover from your attack, choose a corner of your square. If any line from this corner to any corner of the target's square passes through a square or border that blocks line of effect or provides cover, or through a square occupied by a creature, the target has cover. Cover grants you a +4 bonus to AC and a +2 bonus to Reflex saves against attacks that originate from a point on the other side of the cover from you. Note that spread effects can extend around corners and negate these bonuses.
!! Cover And Attacks Of Opportunity
If you have cover relative to an enemy, it can't make an attack of opportunity against you.
!! Low Obstacles And Cover
A low obstacle (i.e., a wall half your height) provides cover, but only to creatures within 30 feet (six squares). The attacker ignores the cover if he's closer to the obstacle than his target is.
!! Soft Cover
Creatures, even enemies, between you and the source of an effect provide you with cover against ranged attacks, giving you a +4 bonus to AC. However, soft cover provides no bonus to Reflex saves, nor does soft cover allow you to attempt a [[Stealth]] check.
!! Partial Cover
If more than half of you is visible, your bonuses from cover are reduced to +2 to AC and +1 to Reflex saving throws.
!! Improved Cover
In some cases, such as when a target is hiding behind a gun port in a defensive wall, cover provides greater bonuses to AC and Reflex saves. In such situations, the normal bonuses to AC and Reflex saves are doubled (to +8 and +4, respectively).
!! Total Cover
If an enemy doesn't have line of effect to you, you have total cover from the enemy. A creature can't make an attack against a target that has total cover.
About 3 inches in diameter, a typical //cover seed// looks like a large walnut. The Xenowardens deployed the first cover seeds, but the device now sees widespread application and equally diverse appearances.
As a move action, you can squeeze the seed to activate it and hold it or drop it in a square within your reach. Alternatively, as a standard action, you can squeeze and throw the seed (range increment 20 feet) as a ranged attack targeting a square (AC 5). At the end of the turn in which you activated the seed, it sprouts into thick vines in the square it's in as well as 2 squares of your choice adjacent to the first. These vines form a wall 5 feet high and thick enough to provide cover to creatures in or near them. The vines' area is difficult terrain.
A //cover seed's// vines last and renew themselves for 10 rounds; if the seed lands on a surface made of a material in which plants can't normally grow, the vines last only 5 rounds. When the duration ends, the seed and vines wither and turn to dust.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//cover seed// | 2 | 200 | L |
</div>
You can use your standard action to make a ranged attack that provides covering fire for an ally. Make a ranged attack roll against AC 15. If you hit, you deal no damage but the selected ally gains a +2 circumstance bonus to AC against the next attack from a creature in your line of effect, so long as that attack occurs before your next turn.
Peppering an enemy ship with bullets or laser fire can force its pilot to take suboptimal evasive maneuvers, giving the firing ship a chance to catch up or bug out.
''Success:'' The crew gains 1 success.
You're frozen with fear. You're [[flat-footed]] and can take no actions.
Sometimes it's easier to make off with an entire device and break into it at your leisure than to do so under fire.
''Activity:'' You spend all day working to crack a single computer or object whose item level is no more than 2 higher than your character level (a computer's effective item level is 2 × its tier). The entire computer system or other locked or secured object must be in your possession, and to crack an object, you must have access to a [[tech workshop]] or similar facilities. Usually, only one character can use the crack technology activity on a given item in a given day, though depending on its size or complexity, the GM might allow checks to aid another.
''Results:'' You can take 20 on a [[Computers]] check to [[hack]] the computer system or an [[Engineering]] check to [[disable the device|Disable Device]]. This triggers defensive countermeasures as normal when hacking a system and has the same consequences for failure as when disabling a device. The GM might rule that certain devices are too powerful to be hacked or disabled this way.
''Multiday:'' For each consecutive day you spend on this downtime activity, you gain a cumulative +1 circumstance bonus to the appropriate check, up to a maximum of +5.
If you have enough ranks in Computers, you can build computers.
If you have enough ranks in Life Science or Physical Science, you can create drugs, poisons, and medicinals.
If you have enough ranks in Life Science, you can create food and drink items.
If you have enough ranks in Mysticism, you can create magic items.
If you have enough ranks in Engineering, you can create technological devices or items (including computers).
Rather than buying mass-produced, mass-marketed equipment, characters with the right skills can construct their own equipment. This takes time, and due to the economies of scale enjoyed by multisystem corporations and shops with dedicated construction machines and drones, it does not save you any money. However, it allows you to acquire exactly what you need, as long as you can meet the construction requirements.
A player character can create all the items presented in this chapter as long as he has the skills, materials, tools, and time needed to construct it. He must have a number of ranks in the appropriate skill equal to the item level of the item to be created. For weapons, armor, vehicles, and technological equipment, the appropriate skill is [[Engineering]]. For magic fusions and magic items, the appropriate skill is [[Mysticism]]. For hybrid items, you must have the required ranks in both Engineering and Mysticism. For drugs, medicinals, and poisons, the skill can be either [[Life Science]] or [[Physical Science]]. For any food or drink, the appropriate skill is Life Science. For computers, you can use either [[Computers]] or Engineering, and you can construct a computer with a tier equal to half your ranks in the skill. For items that are not considered any of these categories (such as most clothes, tents, and so on) either Engineering or Mysticism can be used. At a GM's discretion, an appropriate [[Profession]] skill can be used for a narrower range of items. For example, a character with Profession (weaponsmith) might be able to make technological, hybrid, and magic weapons and weapon fusions, but no other items.
Crafting items requires you to have access to tools and a workshop or similar space. Most starships have an appropriate area set aside, and such space can be rented at the same price as lodgings in major cities (with the size of the lodging being equivalent to the size of the workshop, which limits the size of items that can be constructed and how many people can work on a single item at one time). Creating an item normally has a base time of 4 hours. If your number of ranks in the appropriate skill to craft an item exceeds that item's level by 5 or more, you can craft that item in half the base time. If your ranks exceed the item level by 10 or more, you can create the item in onequarter the base time. Objects larger than a Medium creature take twice as long to craft for each size category larger.
To create an item, you must have UPBs with a total value equal to the price of the item to be created. At the GM's discretion, you can scavenge similar items for parts, allowing 10% of the scavenged item's value to count toward the UPBs needed. Even magic and hybrid items are created using UPBs, as the Mysticism skill is used to form the materials into runes and specific implements for rituals utilized in the creation of magic devices.
Custom-built equipment has a few advantages over mass-produced items. If you have a skill that allows you to repair an item you crafted, you can do so in half the normal time. When determining the hardness, Hit Points, and saving throws of an item you have crafted, treat its item level as if it were 2 higher.
A popular safety accessory for stunt performers, competitive climbers, and others who regularly risk falling or sustaining high-impact injuries, a crash pad is a rectangular packet of polyfluid worn on a belt or clipped to armor. A built-in altimeter can be set to customize the distance fallen before the crash pad activates, but it defaults to 15 feet. Further, an included accelerometer can be set to account for any acceleration that could prove harmful to a wearer. When you're wearing a crash pad and fall or suffer an impact from your body being moved through space, such as in a vehicle collision, the crash pad activates, flash-manufacturing ablative, protective foam and surrounding you with it. You reduce the number of dice of damage you take due to the triggering impact by three dice, taking no damage if this reduction leaves no dice to be rolled for the damage. You then halve any remaining damage you take from the triggering impact, rounded down. A used crash pad container can be recycled, allowing you to craft a new one with the usual 10% discount for having scavenged parts.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|crash pad | 2 | 150 | L |
</div>
If an uncontrolled vehicle runs into an obstacle or another vehicle, it crashes. This deals double the vehicle's collision damage to the uncontrolled vehicle and to the obstacle it ran into, and stops the uncontrolled vehicle's progress. If the uncontrolled vehicle crashes into a controlled vehicle, the other pilot can attempt a [[Piloting]] check to avoid being hit as if it were being [[rammed]]. If that pilot avoids being hit, the uncontrolled vehicle continues to move as above.
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* N Medium vermin
* ''Init'' +2; ''Senses'' [[blindsense]] (vibration) 60 ft., [[darkvision]] 60 ft.; ''Perception'' +8
!!! DEFENSE
* ''HP'' 30
* ''EAC'' 15; ''KAC'' 17
* ''Fort'' +7; ''Ref'' +5; ''Will'' +2
* ''Defensive Abilities'' crate shell; ''Resistances'' acid 5
!!! OFFENSE
* ''Speed'' 20 ft. (40 ft. outside crate shell)
* ''Melee'' bite +11 (1d6+7 A & P; critical [[corrode]] 1d4) or claw +11 (1d6+7 S and [[grab]])
* ''Ranged'' acid blast +9 ([[explode]] [5 ft., 1d6+1 A plus 1d4 [[corrode]], DC 12])
* ''Offensive Abilities'' explosive death
!!! STATISTICS
* ''Str'' +2; ''Dex'' +1; ''Con'' +4; ''Int'' —; ''Wis'' +0; ''Cha'' –3
* ''Skills'' [[Athletics]] +8, [[Stealth]] +13
* ''Other Abilities'' [[compression]], [[mindless]]
!!! ECOLOGY
* ''Environment'' any urban or land (Taekah III)
* ''Organization'' solitary, pair, or rack (3–5)
!!! SPECIAL ABILITIES
''Acid Blast ([[Ex]])'' As a standard action, a crate fiend can launch an acid blast with a range increment of 20 feet.
''Crate Shell ([[Ex]])'' A crate fiend dwells within a container as if it were the creature's shell. While inside its container and motionless, a crate fiend appears to be the container. As a move action, a crate fiend can partially or fully withdraw into its shell. If it partially withdraws, it gains partial cover but takes a –2 penalty to attack rolls and can move at only half speed. While fully withdrawn, the fiend can neither move nor attack but has total cover. The container has AC 10, hardness 10, and 22 Hit Points. The fiend has a –2 penalty to AC in a container that has the [[broken]] condition. If the container is destroyed, the penalty increases to –4. A crate fiend can adapt to a new container in 1 hour.
''Explosive Death ([[Ex]])'' When a crate fiend dies, as no action on its part, it makes an acid blast attack. The attack's point of origin must be adjacent to the creature's space.
</div>
Crate fiends, properly called taekahbs, are bizarre arthropods that originated on Taekah III, a habitable world in the Vast. On this planet, these soft-shelled scavengers seek homes in the cast-off shells of larger native gastropods or nodules of volcanic pumice the taekahbs hollow out with their acid. Crate fiends breed quickly, laying hidden caches of eggs that are scented so other crate fiends find and fertilize them.
When they migrated offworld, no doubt due to careless smugglers or foolish zoologists, crate fiends found homes in the maintenance tunnels and ventilation systems of starships and space stations, as well as in the nooks and crannies of industrialized settlements. Discarded shipping containers proved to be fine homes for them, earning the taekahbs their common name, since they can use such abodes to hide in plain sight. These beasts prefer to eat refuse and carrion, and they avoid discovery and confrontation. However, larger crate fiends have been known to kill and consume dockworkers and unlucky passersby.
When the going gets tough, you hide behind allies.
''Prerequisites:'' Cha 13.
''Benefit:'' As a reaction when you are attacked while adjacent to an ally, if that ally is willing to take a –2 penalty to her Armor Class until the beginning of her next turn, you gain a +2 circumstance bonus to your AC against that attack.
You can crawl 5 feet as a move action. A crawling character is considered [[prone]].
This rubbery, organic cord is 5 feet long and has a plug on each end that attaches to a computer, allowing you to interface with the computer from a distance. You can use a standard action to control the cord using a computer attached to one of these ends. The cord can stretch, contract, and bend around obstacles, moving up to 20 feet each time you direct it. Its maximum length is 50 feet. It can also grab onto and move a computer of light or negligible Bulk by plugging into it and pulling, but it disconnects if used to pull an object of more than light bulk. Moving a crawling cord past observers without being noticed requires a successful [[Sleight of Hand]] check, opposed by the [[Perception]] check of any observer. The cable draws power from any computers to which it is attached.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|crawling cord | 1 | 100 | L |
</div>
<div class="statblock">
* <<levels>>
* ''School'' conjuration (creation)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Duration'' 1 minute/level (D)
</div>
You create a specific type of ammunition, such as arrows or a battery, and conjure it in hand or a place within range. You can create ammunition with an item level of 1 or 2, and you create a number of charges or pieces of ammunition as if you had purchased the ammunition (for example, 20 arrows or a battery with 20 charges). If you use this spell to create a battery, the battery can be used for any function a battery performs. This spell cannot create ammunition made from special materials or with any special quality, and it cannot create grenades, rockets, missiles, or the like. The ammunition disappears when the duration ends.
As a standard action, the creature can create a 20-foot-radius area of darkness centered
on itself, which negates the effects of all nonmagical light sources in that area. This darkness lasts for a number of minutes equal to the creature's CR, and the creature can dismiss the effect as a standard action. The darkness doesn't move with the creature. Unless otherwise noted, any magic source of light can increase the light level in the area as normal.
//Format:// ''Offensive Abilities'' create darkness.
When you attempt a [[Bluff]] check to create a diversion, you can forgo rolling your expertise die. If you succeed at the check, all your allies within 60 feet also count as having succeeded at creating a diversion until the beginning of your next turn.
Whether by jettisoning junk, igniting a pocket of volatile gas, or summoning a cloud of technomagical nanites, a crew can put a dangerous hazard in the path of their opponent.
''Success:'' The crew gains 1 success.
You can use Computers to forge official documents. This takes 1d4 minutes. The GM rolls the Computers check to create a forgery in secret, so you're not sure how good your forgery is. This check is opposed by the Computers check of anyone who examines the document to determine its authenticity.
The DCs for Computers checks to detect a forgery are based on the type of forged document as well as other circumstances determined by the GM, as shown in the table below.
<div class= "table-wrapper">
|Circumstance | DC Modifier |h
|Document contradicts knowledge or orders | -2 |
|Type of document is well known to examiner | -2 |
|Type of document is unknown to examiner | +2 |
|Examiner only casually reviews document | +2 |
|Forger has a sample of a similar document | +8 |
</div>
During your travels through the galaxy, you may seek out a creature to accompany you. Use [[Table: Creature Companion Statistics]] in conjunction with one of the sample stat blocks provided to generate statistics for your creature companion.
At the GM's discretion, you can work with them to create a custom creature companion. The GM should use [[Table: Creature Companion Statistics]] for your companion's basic statistics, and then give it at most one free special ability and one standard special ability as outlined for NPCs in [[Step 6: Special Abilities]]. The GM can also use the sample stat blocks to get a sense of appropriate abilities.
!! Using the Creature Companion Statistics Table
Use the following information to determine your creature companion's statistics. Use the statistics presented on the table without applying ability modifiers unless otherwise stated.
''Level:'' Your creature companion's statistics, and sometimes its abilities, are based on its level.
''Price:'' This is the price in credits for a creature companion of the listed level. This might represent the cost of advanced training, basic supplies, food used to win the creature's friendship, or licenses and vaccinations. The GM might waive the price for creatures you gained during adventures.
''Hit Points:'' This is the creature's Hit Point total. A creature companion doesn't have Stamina Points or Resolve Points.
''Attack Bonus:'' This is the total attack bonus for any of the creature's melee or ranged attacks.
''Damage:'' This is the damage the creature deals with its natural weapons. It adds its Strength modifier to this damage for melee attacks.
''EAC and KAC:'' These are the creature companion's Energy Armor Class and Kinetic Armor Class.
''Good Save Bonus and Poor Save Bonus:'' These are the creature's saving throw bonuses. Each creature companion lists which one of its saving throws uses the good bonus and which two use the poor bonus.
''Ability Modifiers:'' These are the creature's two highest ability modifiers, as determined by its specific stat block. Unless otherwise noted, its Intelligence modifier is –4 and its other ability modifiers are +0.
''Skill Bonus:'' This is the total bonus for the creature's skill checks. Unless otherwise noted, creature companions can attempt only [[Acrobatics]], [[Athletics]], [[Perception]], and [[Stealth]] checks, and [[Survival]] skill checks to [[endure severe weather]], [[follow tracks]], [[live off the land]], and [[orienteer]].
<<section 'Table: Creature Companion Statistics' >>
Creating an NPC encompasses nine steps, many of which don't take very long. Each step is briefly outlined below and detailed further in its section (on the page noted in parentheses).
!! Before You Begin: NPC Concept
Before you start designing your NPC, you should have a clear concept for it. Think about its role in your story, and select a Challenge Rating for it. Consult [[Table: Encounter Difficulty]] to help you determine your NPC's CR based on the player characters' Average Party Level. If you are creating a different version of an existing alien (such as one with a higher CR or a class graft), feel free to give it special abilities similar to that of the original alien.
!! [[Step 1: Array]]
Determine whether your NPC is a combatant, an expert, or a spellcaster, and use the appropriate array tables to determine the NPC's starting statistics.
!! [[Step 2: Creature Type Graft]]
The first graft—a set of adjustments—you apply to your NPC gives it attributes that reflect the base kind of creature it is, such as animal, humanoid, or undead. This and other grafts give new abilities and possibly adjust the numbers from the NPC's array. If you give an NPC a class graft (see Step 4), some of the adjustments from its class graft can be superseded by ones granted by its creature type graft.
!! [[Step 3: Creature Subtype Graft]]
If the NPC has any subtypes, add those now. Many subtypes don't grant additional abilities, but they are important for interactions with other rules.
!! [[Step 4: Class Graft]]
If you're making an NPC who functions as a character with a class, you can give it a class graft. The class graft gives it abilities based on the relevant class's abilities, but which abilities the NPC gains is determined by its CR rather than by a class level. Some class graft adjustments can replace ones from its creature type graft (see Step 2).
!! [[Step 5: Template Graft]]
If you would like the NPC to have a template, apply it now.
!! [[Step 6: Special Abilities]]
In this step, give your NPC a number of appropriate special abilities, as given in its array. Some abilities are combat tricks, while other adjustments might switch up its basic statistics. A few abilities can be given to an NPC for free.
!! [[Step 7: Skills]]
Your NPC's array (and possibly a graft or special ability you give it) determines its bonuses for skills it has mastered or is better than average at using. Pick the specific skills and determine the bonus for each now.
!! [[Step 8: Spells]]
If your NPC can cast spells, choose them now. Usually only spellcasters or creatures with spell-like abilities need this step.
!! Step 9: Final Check
Finally, make sure your NPC matches what you had planned for it. You also might want to double-check your numbers after applying special abilities to make sure none of them are too far from the baseline.
<div class="statblock">
* <<levels>>
* ''School'' conjuration ([[creation]])
* ''Casting Time'' 1 minute
* ''Range'' 0 ft.
* ''Effect'' one nonmagical, nontechnological object of nonliving matter, up to 1 bulk/level; see text
* ''Duration'' see text
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You create a nonmagical, nontechnological, unattended object of nonliving matter. The volume of the item created can't exceed 1 cubic foot (or 1 bulk) per caster level. You must succeed at an appropriate [[Engineering]] or [[Profession]] check to make a complex item, and you can't create a consumable item.
''4th:'' When you cast creation as a 4th-level spell, it creates an object made out of vegetable matter (such as wood) that has an item level no greater than one-third your caster level. The duration is 1 hour per caster level.
''5th:'' When you cast creation as a 5th-level spell, it creates an object made out of vegetable matter or material of a mineral nature: crystal, metal, stone, or the like. The object can't have an item level greater than half your caster level. The duration depends on the hardness and rarity of the created object, as indicated on the following table.
<div class="table-wrapper">
|Hardness and Rarity Examples | Duration |h
|vegetable matter | 2 hours/level |
|stone, crystal, base metals | 1 hour/level |
|precious metals | 20 minutes/level |
|gems | 10 minutes/level |
|rare metals* | 1 round/level |
|* Includes adamantine, alchemical silver, mithral, and skymetal alloys. You can't use a 5th-level creation spell to create a cold iron item. |<|f
Although it appears to be little more than an oblong case full of electronics, a //creator capsule// is a tiny 3D printer, with a programmable interface and a supply of UPBs stored in an extradimensional space. As a full action, you can connect the creator capsule wirelessly to your [[comm unit]] or computer, then command it to print one or more nonmagical personal or technological items. Printing an item requires you to have the plans on the connected device or an infosphere connection through which you can download the blueprints.
A //creator capsule// takes 1 round to create an item, plus 1 round per bulk of the item above light. No individual printed item can have a bulk greater than 3. The //creator capsule// consumes itself during the printing process. Although the printer can be stopped as a move action, doing so renders the capsule useless for further printing. An item printed by the //creator capsule// is of average quality, and it has the statistics of an ordinary item of its type.
Based on its type, a creator capsule has the following cost and level limits on items it creates.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Max Cost | Max Level |h
|//creator capsule//, mk 1 | 4 | 2,000 | L | 1,000 | 2 |
|//creator capsule//, mk 2 | 8 | 9,000 | L | 4,500 | 6 |
|//creator capsule//, mk 3 | 12 | 38,000 | L | 19,000 | 10 |
</div>
You can grant your creature companion simple actions.
''Prerequisites:'' [[Survival]] 1 rank.
''Benefit:'' Once per round, you can take a standard action to grant your creature companion action a standard action, take a move action to grant it a move action, or take a swift action to grant it a swift action. Your creature companion can take a move action before or after the granted action. You can control your creature companion at a range of 30 feet.
Your control of your creature companion improves.
''Prerequisites:'' [[Creature Companion Adept]], [[Survival]] 4 ranks.
''Benefit:'' Your creature companion can take one reaction per round. In addition, when you use the [[Creature Companion Adept]] feat, you can grant your companion a standard action by taking a move action instead of a standard action. Alternatively, you can take a move action and a swift action to grant your companion a full action; if you do, it can take no other actions. You can control your creature companion at a range of 50 feet.
Regardless of the way you gain a creature companion, granting your companion additional actions requires the [[Creature Companion Adept]] feat. You can become progressively better at working with your creature companion by taking subsequent creature companion feats.
You can use the creature companion feats listed here only with a creature companion whose level is no greater than your ranks in [[Survival]].
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
Your bond with your companion deepens, allowing it to anticipate your commands.
''Prerequisites:'' [[Creature Companion Expert]], [[Survival]] 10 ranks.
''Benefit:'' Each round on your turn, after you act and only if you didn't grant your creature companion any actions, your creature companion can either take a move action or standard action in addition to its normal move action, or forgo its normal move action and make a full attack. It takes a –6 penalty to full attacks made using this ability. You can control your creature companion at a range of 80 feet.
Your creature companion can carry you as a mount if it is at least one size category larger than you. Mounting your creature companion requires you to be adjacent to it and takes a move action. You can attempt a DC 20 [[Survival]] check to mount your companion as a swift action instead; failure wastes the swift action. If you are knocked [[prone]] while mounted, you fall off your mount. The GM might determine that you can use other creatures as mounts, possibly with a DC that's 2–10 higher for Survival checks while mounted. Riding a creature without a [[saddle]] imparts a –5 penalty to your checks to ride.
!! Bulk
You can mount your creature companion as long as the total amount of bulk you're carrying doesn't exceed your carrying capacity. If you have the [[encumbered]] condition (or gain the [[overburdened]] condition) while mounted, your creature companion gains the same condition while you are riding it.
!! Combat
To use your creature companion as a mount during combat, you must either have the [[Combat-Trained Mount]] feat or succeed at a DC 20 [[Survival]] check to [[ride|Ride a Creature]] for each action you attempt to take (or have your creature companion take; see [[control mount in battle|Ride a Creature]]). The actions you can take while mounted are listed below; these are in addition to the actions you can normally take.
!!! Move Actions
The following are move actions you can take while mounted.
''Dismount:'' You dismount, moving into an empty space adjacent to your mount. This movement provokes attacks of opportunity as normal. This does not require a Survival check.
''Ride:'' You move your speed using the mount's speed (or one of its speeds, if it has more than one). This does not require a Survival check, but it does require you to use two hands, which you can't use to hold or wield items unless you succeed at a Survival check to use the [[guide with knees|Ride a Creature]] action. As part of this move action, you can attempt to increase your mount's speed using the [[spur mount|Ride a Creature]] action, or you can attempt to jump using the [[leap|Ride a Creature]] action. If you attempt the leap action, you use your Survival skill bonus to ride instead of your creature companion's [[Athletics]] bonus.
!!! Swift Actions
The following are swift actions you can take while mounted.
''Cover (DC 15):'' As a swift action, you can drop to the side of your mount and gain [[cover]].
''Fast Dismount (DC 20):'' As a swift action, you can dismount from your mount. If you fail the check, the swift action is wasted and you do not dismount.
''Fight from a Combat-Trained Mount (DC 10):'' If you and your mount are both able to attack in the same turn (if you have the [[Creature Companion Expert]] feat, for example), you must succeed at a Survival check to ride before either of you attempt to do so. If you fail this check, either you or mount can attack that turn, but not both.
!!! Reactions
The following are reactions you can take while mounted.
''Soft Fall (DC 15):'' If you are knocked [[prone]], you can attempt a Survival check to ride to reduce the damage you take from the fall by 1d6.
''Stay Mounted (DC 5):'' If you would fall off your mount for a reason other than being knocked prone, you can attempt a Survival check to ride to avoid falling off.
!! Speed and Movement
While you're riding your creature companion, your mount's speeds replace your own speeds, and you use them in place of your own when moving your speed, including when using abilities that allow you to move your speed (such as the operative's [[trick attack]]). When you use an action that includes movement, your mount uses the same action (even if it couldn't normally take that action otherwise). This counts as granting your creature companion an action. If you can grant your mount additional actions (such as with a creature companion feat), it's still limited to its maximum number of actions per turn.
!! Space and Reach
If your mount is exactly one size larger than you, you treat its space as your space for the purpose of reach. If your mount is more than one size larger than you, you must decide which square or squares of the mount's space you occupy and calculate your reach normally. You choose this location when you mount the creature companion, and you can move 5 feet to a different space on your mount as a move action.
Your creature companion can unleash its fury unbidden.
''Prerequisites:'' [[Creature Companion Master]], [[Survival]] 13 ranks.
''Benefit:'' Each round on your turn, after you act and only if you didn't grant your creature companion any actions, your creature companion can forgo its normal move action to make a full attack with a –4 penalty to its attacks. You can control your creature companion at a range of 120 feet.
<<list-links "[tag[Creature Companions]!list[Creature Companions]sort[title]]" class:index>>
<$list filter="[list[$:/StoryList]is[current]]" >
<$list filter="[tag[Creature Companions]list[Creature Companions]]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
</$list>
Controlling a creature companion in combat requires focus and coordination. You can control only one creature at a time, giving it commands it follows to the best of its ability, and it must be within 20 feet of you. The actions a creature companion can take are severely limited; granting it other actions requires the [[Creature Companion Adept]] feat.
!! Actions
On each round you control your creature companion, after you act and only if you didn't grant your creature companion any actions, it can take one move action (this does not require you to take an action). If a creature companion is able to take other actions (such as those you grant it using the Creature Companion Adept and related feats), it can take only the actions listed in the Creature Companion Actions section, unless specified otherwise. However it's controlled, each turn a creature companion can at most take a standard, move, and swift action, or take a full action. It can also take one reaction. A companion takes actions as soon as they are granted unless otherwise stated.
!!! Standard
@@.index
* [[Attack]]
* [[Fight Defensively]]
* [[Total Defense]]
@@
!!! Move
@@.index
* [[Crawl]]
* [[Guarded Step]]
* [[Move Your Speed]]
* [[Stand Up]]
@@
!!! Swift
@@.index
* [[Drop Prone]]
@@
!!! Full
@@.index
* [[Charge]]
* [[Fight Defensively]]
* [[Full Attack]]
* [[Run]]
* [[Withdraw]]
@@
!!! Reaction
@@.index
* [[Attack of Opportunity]]
@@
If you're riding your creature companion as a [[mount|Creature Companion Mounts]], it may also have other options in combat.
!! Injury and Death
Creature companions don't have Resolve Points or Stamina Points. Effects that would restore Stamina Points to a creature companion restore Hit Points instead. When you spend a Resolve Point to recover Stamina Points during a 10-minute rest, your creature companion regains Hit Points up to half its total. When a creature companion is reduced to 0 Hit Points, it is knocked unconscious and begins [[dying]]. Three rounds after it was knocked out, it dies unless it is stabilized or regains at least 1 Hit Point.
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Creature Rules' sort:'!tag[Xenoarchive]' >>
</div>
<<list-links "[tag[Creature Subtype Grafts]sort[title]]" class:index>>
<<list-links "[tag<currentTiddler>sort[title]]" class:index >>
Founded and operated by Triunite enthusiasts, CredenceCo designs magitech for pious clients of any faith, promising that by incorporating its augmentations, buyers become one step closer to their divine patrons. When you gain the augmentation, you can choose one 0-level spell from your class’s spell list. As long as you have a patron deity and faithfully uphold the deity’s teachings, you add that spell to your list of spells known. If the augmentation’s item level is 11 or higher, you instead choose and learn two 0-level spells.
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* NE Medium outsider (incorporeal)
* ''Init'' +6; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +16
!!! DEFENSE
* ''HP'' 112
* ''EAC'' 20; ''KAC'' 21
* ''Fort'' +9; ''Ref'' +7; ''Will'' +11
* ''Defensive Abilities'' [[incorporeal]]
!!! OFFENSE
* ''Speed'' 15 ft., climb 15 ft.
* ''Melee'' incorporeal touch +18 (1d12+8 C; critical inhabit)
* ''Offensive Abilities'' gloom spores, inhabit (DC 18)
!!! STATISTICS
* ''Str'' —; ''Dex'' +6; ''Con'' +3; ''Int'' –3; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Athletics]] +16, [[Stealth]] +21, [[Survival]] +16
* ''Feats'' [[Spring Attack]]
!!! ECOLOGY
* ''Environment'' any (Shadow Plane)
* ''Organization'' solitary or garden (2–7)
!!! SPECIAL ABILITIES
''Gloom Spores ([[Su]])'' A creature affected by a creeping shade's inhabit ability risks being poisoned by gloom spores when the creeping shade leaves its body. For every round past the first that a creeping shade has inhabited a creature's body, the creature takes a cumulative –1 penalty to the saving throw to resist the poison.
''Inhabit ([[Su]])'' When a creeping shade scores a critical hit on a living creature, it enters that creature's space (this doesn't provoke an attack of opportunity) and merges with the creature's body for 1d6+1 rounds. The creeping shade doesn't control the creature it inhabits, but does make the creature feel an overwhelming sense of melancholy. An inhabited creature can't benefit from morale bonuses. Every round after the first, an inhabited creature can attempt a DC 18 Fortitude save to eject the creeping shade from its body. In addition, a creeping shade can inhabit an adjacent, unconscious living creature as a full action if that creature fails a DC 18 Fortitude save. When a creeping shade leaves an inhabited creature's body (either if it is ejected or if the duration of the ability ends), it appears in an adjacent square of its choosing and regains 5d8 Hit Points, and the affected creature is subjected to [gloom spores.
!!! Gloom Spores
* ''Type'' poison (contact)
* ''Save'' Fortitude DC 18
* ''Track'' [[Wisdom|Wisdom Poison Track]] (special)
* ''Frequency'' 1/minute for 6 minutes
* ''Effect'' progression track is //Healthy—Weakened—Impaired—Confused—Comatose—Comatose//. The second //comatose// functions as an end state.
* ''Cure'' 1 save
</div>
Creeping shades are incorporeal, plantlike creatures originating on the Shadow Plane. A creeping shade lies in wait to strike at passing prey with its incorporeal touch, attempting to inhabit the creature and infect it with gloom spores. The victim usually falls comatose a few minutes later, after which it is killed by nearby predators, leaving the corpse behind to fertilize nearby plant life, including the creeping shade.
Your perfect musical cues can accentuate a moment of triumph and send a surge of adrenaline through an ally.
''Prerequisites:'' [[Crescendo of Violence]]
''Benefit:'' When an ally within 30 feet of you scores a critical hit against a significant foe, as a reaction you can spend 1 Resolve Point and a charge of a sonic weapon you’re holding. The ally regains Stamina Points equal to 3 × your level or 4 × the number of [[Profession]] (musician) ranks you have, whichever is higher.
Your skill with modulating the sounds of your sonic weapons into musical patterns borders on showboating but also inspires your allies.
''Prerequisites:'' Charisma 15 or [[Profession]] (musician) 5 ranks
''Benefit:'' When you score a critical hit with a weapon that deals sonic damage, in addition to any other critical hit effect you would apply, all allies within 30 feet of you gain a +2 morale bonus to your choice of attack rolls, skill checks, or saving throws until the beginning of your next turn.
<div class="statblock">
* ''CR'' 4; ''XP'' 1,200
* N Large magical beast
* ''Init'' +1; ''Senses'' bone tracker, [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +10
!!! DEFENSE
* ''HP'' 54
* ''EAC'' 16; ''KAC'' 19
* ''Fort'' +8; ''Ref'' +8; ''Will'' +3
!!! OFFENSE
* ''Speed'' 60 ft.
* ''Melee'' bite +13 (1d6+7 P plus 1 Con)
* ''Ranged'' venom spit +10 (1 Con)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' bone eater
!!! STATISTICS
* ''Str'' +3; ''Dex'' +1; ''Con'' +3; ''Int'' –2; ''Wis'' +1; ''Cha'' –1
* ''Skills'' [[Stealth]] +15, [[Survival]] +10
* ''Languages'' Kasatha (can't speak any language)
!!! ECOLOGY
* ''Environment'' warm deserts (Kasath)
* ''Organization'' solitary, pair, or pride (3–6)
!!! SPECIAL ABILITIES
''Bone Eater ([[Su]])'' A crest-eater's bite delivers a magical venom that dissolves certain minerals in its victim's body, liquefying that creature's bones. Each bite attack that deals damage also deals 1 Constitution damage. A target can negate this damage with a successful DC 13 Fortitude save.
''Bone Tracker ([[Ex]])'' A crest-eater's sense of smell is keenly attuned to the minerals it needs to survive. It can sniff out natural deposits of calcium, and it gains [[blindsense]] (scent) against creatures that have taken Constitution damage from its attacks in the past hour.
''Venom Spit ([[Su]])'' As a standard action, a crest-eater can make a ranged attack against the KAC of a single target within 30 feet, spitting its bone-liquefying venom. If struck, the target must succeed at a DC 13 Fortitude save or take 1 Constitution damage.
</div>
Terrifying predators that roam the deserts and canyons of Kasath, crest-eaters earned their moniker thanks to their highly specialized diets: the hulking beasts feed almost exclusively on bone, and when attacking kasathas, they usually tear the humanoids' heads from their bodies and then quickly and messily devour the bony crests within. A crest-eater has an advanced metabolism that processes the minerals it consumes to grow a large protrusion—a cross between antlers and a shell—from the crest-eater's head and back. This outgrowth isn't just made out of bone, however; it contains tiny fragments of reflective compounds that act like thousands of solar panels, thus providing the remainder of the nutrients the crest-eaters need to survive. As they age, the beasts grow more and more elaborate protrusions, increasing their surface area in order to store reserves of minerals for lean times. Crest-eaters also produce a venom that liquefies minerals, which can strip natural deposits of these resources from nearby rocks as easily as it melts the bones of their prey.
Crest-eaters have a muscular frame supported by four stout legs. The claws on a crest-eater's legs are somewhat blunt, having evolved for scrabbling over rocks. A pair of thick limbs attached to the creature's lower back area can function as another pair of legs, allowing it to easily navigate rocky terrain or distribute its bulk on shifting sands. However, the sharper claws on these extra appendages are mainly used for tearing through its prey's flesh to reach the bones. A crest-eater's vicious teeth are capable of delivering painful bites and injecting its devastating venom. Despite its rather reptilian appearance, the crest-eater shares many similarities to mammals, including a steady body temperature and the ability to bear live young.
Just as their biology skirts the edge of reptilian standards, so too does crest-eaters' behavior. They are exceptionally social and loving animals, forming small prides of unrelated adults to hunt prey, dig out mineral deposits, and guard one another while they sleep. Many bold young hunters have fallen after slaying a single crest-eater, only to find its half-dozen compatriots rising from the sand around them. Crest-eaters give birth to one or two young after a long pregnancy, during which the female grows increasingly ravenous for flesh and water, and an entire pride may take to hunting and aggressively defending water sources to feed a single pregnant mother's needs. Newborn crest-eaters can dissolve bones immediately, though they are cautious predators until they begin to grow their first antler-shell around 1 year later.
Crest-eaters that grow up in close proximity to other creatures often form close bonds with them, and thus they can be found traveling with small crowds of scavengers that pick parasites off their protrusions and snatch up any kills the mighty hunters leave behind. Despite the creatures' social nature, especially large males become increasingly aggressive as they age and are often driven from their prides and the most reliable sources of food. Though a bit past their prime, these crest-eaters are still very dangerous, and they usually become unpredictable loners that attack desert communities without fear. It sometimes takes the collective effort of several heroes to either put down or drive off one of these wild beasts. Such an endeavor is rarely accomplished without casualties or major injuries.
Crest-eaters occupy a place of fear and reverence in distant kasathan history. The humanoids' ancient ancestors saw the beasts as terrifying messengers of death, particularly because of their tendency to rip off a victim's head and leave the remainder of the body unmolested. Today, the crest-eater is still feared but better understood, and kasathan scientists have extensively studied the unique crystals the beasts grow. These are now the foundation for kasathan solar technology.
After millennia of kasathan contact with the wider galaxy, crest-eaters have spread to other worlds, both due to kasathan technology sometimes relying on the creatures' power-generating capabilities and as a result of other races employing crest-eaters as guard beasts, trophies to hunt, or exotic pets. The Idari even brought crest-eaters along on its long voyage, though these are kept carefully contained; rumors of escaped and feral crest-eaters living in the ship's ventilation shafts are assumed to be spurious.
A typical crest-eater is 14 feet from head to tail and is 6 feet tall at the shoulder, though this doesn't count its elaborate protrusions. An average crest-eater weighs more than 1,000 pounds.
!! Bone Cestuses
{{Bone Cestus}}
<div class="statblock">
* ''CR'' 10; ''XP'' 9,600
* N Large animal
* ''Init'' +8; ''Senses'' [[blindsense]] (scent) 60 ft.; ''Perception'' +19
* ''Aura'' algal gas (30 ft., Fortitude DC 17)
!!! DEFENSE
* ''HP'' 165
* ''EAC'' 23; ''KAC'' 25
* ''Fort'' +13; ''Ref'' +15; ''Will'' +9
!!! OFFENSE
* ''Speed'' 60 ft., swim 30 ft.
* ''Attack'' gore +22 (2d8+15 P) or slam +22 (3d4+15+15 B)
* ''Multiattack'' gore +16 (2d8+15 P), 2 slams +16 (3d4+15 B)
* ''Space'' 10 ft.; ''Reach'' 5 ft. (10 ft. with gore)
* ''Offensive Abilities'' [[ferocious charge]]
!!! STATISTICS
* ''Str'' +5; ''Dex'' +8; ''Con'' +3; ''Int'' –5; ''Wis'' +3; ''Cha'' –2
* ''Skills'' [[Athletics]] +24
* ''Other Abilities'' marshborn
!!! ECOLOGY
* ''Environment'' any marshes (Castrovel)
* ''Organization'' solitary, pair, or herd (3–12)
!!! SPECIAL ABILITIES
''Algal Gas ([[Ex]])'' See [[common swamp strider]]; the DC is 17.
''Flammable ([[Ex]])'' See [[common swamp strider]]; the [[burning]] damage is 2d8 F, and the bonus fire damage is 1d8 F.
''Marshborn ([[Ex]])'' See [[common swamp strider]].
</div>
You can take one action (usually defined by your role) per round of starship combat. Certain actions require a minimum character level or number of ranks in a certain skill. NPC crew members are assumed to have a number of ranks in the appropriate skill equal to the starship's tier. Class features or items that grant bonuses to or allow rerolls of the relevant skills can be used in starship combat. If a starship's tier is less than 1, treat it as 1 for this purpose.
!! Push
Push actions (indicated in an action's heading) are difficult to perform but can yield greater results. You can't perform a push action if the necessary system is malfunctioning or wrecked.
!! Changing Roles
You can switch between roles (or assume a role if you don't already have one), but this change must occur at the start of a round before the engineering phase. You can switch to the captain or pilot role only if that role would otherwise be vacant (or if the character in that role is unable to take actions).
!! Starship Combat Resolve
As your combat expertise grows, you gain extra resolve that can help with high-level crew actions. At 8th level and again at 16th level, you gain 1 Resolve Point at the start of any starship combat encounter. These points can exceed your normal pool of RP; unspent points gained this way are lost at the end of the encounter. NPC starships have RP equal to tier divided by 5, plus 3.
!! Other Actions in Starship Combat
While your role determines what actions you can take during a starship combat encounter, on occasion you might want to perform some other kind of action, such as casting a spell or using a class feature. The GM has the final say on what kind of regular actions you can take, but generally, you can take only a move or standard action in a single round, and you can take only a minor crew action during that round. You aren't assumed to be adjacent to any of your allies during starship combat, so the GM might also decide that you need to take an additional round to get close enough to an ally to affect him with an ability or spell. Any such action is resolved at the beginning of the round, before the engineering phase.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
<div class="tc-table-of-contents">
<<toc-selective-expandable 'Crew Actions'>>
</div>
!!! Stunts
<<list-links "[tag[Stunts]sort[title]]" class:index>>
Most starships larger than Tiny have places where their crew can eat, sleep, and bathe during long journeys through space. These quarters can range from hammocks strung between cargo containers to cozy chambers with custom furnishings and private bathrooms. Crew quarters consume a negligible amount of PCU, though amenities in fancier quarters require an operational power core to function.
!! Common
Common crew quarters are the most basic type. They consist of simple bunks (sometimes folding out from the side of a hallway) or other similarly austere places to rest. Crew members who sleep in common quarters usually keep their personal possessions in a footlocker. Common crew quarters also include a communal bathroom (which includes a military-style shower) and a tiny galley (big enough to prepare only the most basic of meals). Starships with crews numbering in the dozens or hundreds often have massive barracks where crew members sleep in shifts.
!! Good
Good crew quarters are a bit more upscale than common crew quarters. They consist of dormitory-style rooms that can hold one or two small beds (larger starships usually require lower-ranking crew members to share these quarters) and sometimes a personal closet or drawer space for each occupant. Good crew quarters also include one or two shared bathrooms with multiple sinks and shower stalls, and a dining space with an attached galley. Crews of larger starships eat in this dining space in shifts.
!! Luxurious
Luxurious crew quarters are the pinnacle of comfort. They consist of private rooms for each crew member, with personal bathrooms (including showers with high water pressure) and furnishings that match the resident's tastes. Some luxurious crew quarters also feature a kitchenette, gaming areas, or intimate meeting spaces.
<div class="table-wrapper">
|Crew Quarters | Cost (in BP) |h
|Common | 0 |
|Good | 2 |
|Luxurious | 5 |
</div>
These classy designer bracelets were made by Embroi’s famous Superbia fashion house. While wearing a pair of //crimson bangles//, once per day as a swift action, the wearer can tap the bracelets together to lock their current location into the //crimson bangles//’ kinetic memory. Provided the wearer is within 30 feet of this locked location, they can take a swift action to tap the bracelets together and teleport to the locked location. The //crimson bangles// can only lock to a single location each day, but the wearer can return to that location any number of times.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//crimson bangles// | 5 | 3,000 | — |
</div>
<div class="statblock">
* ''CR'' 10; ''XP'' 9,600
* N Huge magical beast
* ''Init'' +0; ''Senses'' [[blindsense]] (life) 200 ft., [[darkvision]] 60 ft., [[low-light vision]]; ''Perception'' +24
!!! DEFENSE
* ''HP'' 165
* ''EAC'' 23; ''KAC'' 25
* ''Fort'' +14; ''Ref'' +14; ''Will'' +9
* ''Immunities'' fire
!!! OFFENSE
* ''Speed'' 10 ft., burrow 50 ft., swim 30 ft.
* ''Melee'' tentacle +23 (2d10+18 B & F, plus [[swallow whole]])
* ''Space'' 15 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' scorching eruption, [[swallow whole]] (2d10+18 P & F, EAC 23, KAC 21, 41 HP)
!!! STATISTICS
* ''Str'' +8; ''Dex'' +0; ''Con'' +5; Int –4; ''Wis'' +3; ''Cha'' +0
* ''Skills'' [[Athletics]] +19, [[Survival]] +19
* ''Other Abilities'' molten drift, [[no breath]]
!!! ECOLOGY
* ''Environment'' glass substrate and surface of Weydana-5
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Molten Drift ([[Su]])'' A crimson helminth moves through glass or similar substances by creating a localized area of molten material. Treat this ability as [[earth glide]], except it only works in glass or similar materials, and the helminth leaves a visible trail in its wake.
''Scorching Eruption ([[Su]])'' As a full round action, a helminth can move up to double its burrow speed and burst to the surface; on its native planet or other similar environments, this creates a 30-foot-radius area filled with searing hot glass and razor shards. Creatures in this area take 5d6 fire damage and become [[entangled]]; creatures who succeed at a DC 17 Reflex save take half damage and are not entangled. Entangled creatures can free themselves by succeeding at a DC 20 Strength or [[Acrobatics]] check; attempting this check is a move action. After the helminth uses this ability, the ground within the area is difficult terrain, covered with slag and razor-sharp shards of glass. The DC of Acrobatics checks within this area increases by 5. A successful DC 20 Acrobatics check is required to run or charge across the area—creatures who fail this check take 1d4 piercing damage and their movement ends. A creature that falls [[prone]] in the area takes 2d6 slashing damage from the jagged shards (Reflex DC 17 half).
</div>
A predator native to the glass-like surface of Weydana-5, the crimson helminth is a magical beast with six clawed flippers and a head of six crystal-tipped tentacles that radiate around its mouth of inward-pointing teeth. The helminth is often seen from Weydana-5’s surface as it burrows, locking its tentacles into an arrowhead formation and generating blistering heat through the crystal tips, melting the glass as it moves.
Helminths swim gracefully through the molten glass they create in the planet’s crust, leaving beautiful spiraling trails as the material cools—trails that can observed from the planet’s surface, and which sometimes become home to other species seeking safe haven from the planet’s otherwise inhospitable climate. The helminth is an indiscriminate predator, which senses living prey before bursting to the surface in a spray of molten glass. Once they’ve revealed themselves, they immediately stuff their gullet with whatever they can catch, then dive once more, returning to their subterranean wanderings.
There are rumors of other helminth species, larger and with ties to elemental planes other than fire, but these rumors have yet to be substantiated.
The Drift Crisis cut you off from the place you called home. Whether you were visiting another planet or onboard a vessel that the Crash hurled light years across the cold vacuum of space, you find yourself among the many who desperately seek safety in a strange new land. You’ve seen and endured much, perhaps while searching for a new home in the turmoil of uncertainty.
!! Theme Knowledge (1st)
You must navigate civilizations that might not be at all like the one in which you were raised. This taught you a lot about the different ways that people across the galaxy live their lives. Reduce the DC to [[identify]] or [[recall knowledge]] about previously unfamiliar cultures or ways of life by 5. [[Survival]] is a class skill for you. If it’s a class skill from the class you take at 1st level, you instead gain a +1 bonus to Survival checks. In addition, you gain an ability adjustment of +1 to Constitution at character creation.
!! Stubborn Resilience (6th)
Whether you were stranded in an uncharted region of the galaxy or trapped behind enemy lines, you found yourself forced to travel extensively to find shelter. The journey exposed you to harsh situations, which you’ve grown to endure. You gain the [[Environmental Adaptation]] feat, whether you meet the requirements for it or not. If you already possess this feat, select a number of environmental conditions and weather conditions equal to half your Constitution modifier (rounded up) from those listed in the Environmental Adaptation feat and add them to those you already possess.
!! Care for Others (12th)
During your travels, you had to rely on others for safety and often returned the favor. You’ve learned the importance of caring for your fellow refugees and know how to knit their wounds when required. Once per day as a standard action, you can cast a 2nd-level //[[mystic cure]]// as a spell-like ability. At 16th level, this increases to twice per day.
!! Hang Your Hat (18th)
Many refugees don’t have the luxury to return to their home world and must forge a new life for themselves. While at times you find yourself longing for home, your new adopted home and family groups bring you a sense of comfort and stability that bolsters you and gives you a reason to fight on. Select a new home world for your PC, which can’t be the same as your character’s place of birth and upbringing. Up to twice per day, when you spend 10 minutes contemplating the positive aspects of your newfound home, you recover 1 Resolve Point. This doesn’t count as resting to regain Stamina Points. You must stipulate where this new home is when you reach this level; you aren’t able to change this selection once it has been made.
This short staff ends in reconfigurable wrench-like prongs suited for operating on heavy machinery, sawing through debris, and incapacitating robots gone haywire. Each crisis wrench has specially fitted compartments along its length that stores an [[engineering kit|Tool Kit]], and all crisis wrenches other than the tinker-class model also house an engineering specialty tool kit selected when purchasing the weapon. These kits are included in the weapon's price and bulk.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|crisis wrench, tinker-class | 1 | 315 | 1d6 B/S | [[stagger]] | 1 |[[analog]], [[lockdown]], [[modal]], [[professional]] (maintenance worker) |
|crisis wrench, scrapper-class | 6 | 4,250 | 1d10 B/S | [[stagger]] | 1 |[[analog]], [[lockdown]], [[modal]], [[professional]] (maintenance worker) |
|crisis wrench, engineer-class | 11 | 25,500 | 3d10 B/S | [[stagger]] | 1 |[[analog]], [[lockdown]], [[modal]], [[professional]] (maintenance worker) |
|crisis wrench, artificer-class | 16 | 169,000 | 7d10 B/S | [[stagger]] | 1 |[[analog]], [[lockdown]], [[modal]], [[professional]] (maintenance worker) |
</div>
Starship systems can take critical damage, causing them to become less functional and eventually stop working altogether.
Critical damage is scored whenever a gunnery check results in a natural 20 on the die and damage is dealt to the target ship's hull. The critical range is expanded to a natural 19 or 20 on the die if the target starship was the subject of a successful [[target system]] science officer action.
Critical damage is also scored whenever the target starship's hull takes damage that causes its total amount of damage to exceed its Critical Threshold or a multiple of that threshold. For example, a starship with 100 Hull Points and a Critical Threshold of 20 takes critical damage each time its total amount of Hull Point damage exceeds 20, 40, 60, 80, and 100 points (and so on). An individual attack does not need to deal more than 20 damage to score critical damage against this starship; it just needs to be the attack that pushes the starship's total damage above a multiple of its Critical Threshold.
A starship can take critical damage even when its total Hull Points are below 0.
!! Shields
A starship takes critical damage from an attack only if that attack deals damage to the ship's Hull Points, even if the result of the gunnery check is a natural 20. If the attack's damage only reduces a starship's Shield Points, no critical damage occurs.
!! Critical Damage Effect
When critical damage is scored, the attacking PC should roll on the table below to randomly determine which of the target starship's key systems is hit; that system gains a critical damage condition, with the effect listed on the table. If the system isn't currently critically damaged, it gains the glitching condition. If it is critically damaged again, its critical condition changes by one step of severity (glitching becomes malfunctioning; malfunctioning becomes wrecked). These conditions and their effects on crew actions are explained in Critical Damage Conditions.
To determine which system is affected, roll d% and consult the table below. If a system already has the wrecked condition (or in the case of the weapons array, if all weapon arcs have the wrecked condition), apply its critical damage to the next system down on the chart. If you reach the bottom of the chart, instead deal damage to one of the crew (as described below).
<div class= "table-wrapper">
| D% |System |Effect |h
| 1–10 |Life support|Condition applies to all captain actions |
| 11–30 |Sensors |Condition applies to all science officer actions |
| 31–60 |Weapons array |@@.constrained Randomly determine one arc containing weapons; condition applies to all gunner actions using weapons in that arc (a turret counts as being in all arcs)@@ |
| 61–80 |Engines |Condition applies to all pilot actions |
|81–100 |Power Core |@@.constrained Condition applies to all engineer actions except hold it together and patch; a malfunctioning or wrecked power core affects other crew members' actions.@@ |
</div>
!! Crew Damage
If the starship's core has the wrecked condition and further critical damage is dealt to the core, no critical damage conditions are applied to the ship. Instead, one of the crew (determined randomly) is injured, taking an amount of Hit Point damage equal to the Hull Point damage dealt by the attack (without the increase for starship weapons against humanoid targets). That crew member can attempt a DC 20 Reflex save to take only half damage.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
The following are the critical damage conditions and their effects, ordered by severity. These effects apply primarily to starship combat and rarely impact noncombat play (wrecked engines can still be used to get a starship to a safe place to repair, for example— though the GM might rule that it takes longer than normal).
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
<<list-links "[tag[Critical Hit Effects]sort[title]]" class:index>>
When you make an attack roll and get a natural 20 (the d20 comes up 20), you hit regardless of your target's AC. If the total result of your attack roll meets or exceeds the target's EAC or KAC (as appropriate for your attack), you've also scored a critical hit. You roll your damage twice, each time with all your usual bonuses and including any additional damage from special abilities, and then add the rolls together. Some weapons inflict a special effect on a target of a critical hit, in addition to dealing double damage.
If the total result of your attack is less than your target's relevant AC, your attack still hits on a natural 20, but it deals damage normally.
As a move action, you can add one of the following critical hit effects to the next spell you cast this turn that requires an attack roll: [[arc]], [[burn]], [[corrode]], [[deafen]], [[knockdown]], or [[stagger]]. Damage dealt by the arc, burn, or corrode effect equals 1d6 × the spell’s level. Any critical hit effect that allows for a saving throw uses your magic hack DC.
This weapon resembles a rifle with a crossbeam near the end of the barrel. A crossbolter uses mechanical power to fire arrows along the barrel. [[Grenade arrows]] can also be fired with a crossbolter. When a crossbolter is loaded with a grenade arrow, its usage is always considered 1.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|crossbolter, tactical | 2 | 475 | 1d10 P | 70 ft. | — | 1 arrow | 1 | 2 |[[analog]], [[unwieldy]] |
|crossbolter, dual | 8 | 8,250 | 2d10 P | 70 ft. | — | 4 arrows | 2 | 2 |[[analog]], [[unwieldy]] |
</div>
!! Heavy Crossbolter
Advanced, elite, and paragon crossbolters fire massive clusters of arrows and are considered heavy weapons.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|crossbolter, advanced | 11 | 21,900 | 4d10 P | 70 ft. | — | 12 arrows | 4 | 2 |[[unwieldy]] |
|crossbolter, elite | 14 | 71,400 | 6d10 P | 60 ft. | — | 30 arrows | 6 | 2 |[[unwieldy]] |
|crossbolter, paragon | 18 | 327,200 | 10d10 P | 60 ft. | — | 40 arrows | 6 | 2 |[[unwieldy]] |
</div>
The //cruel// fusion feeds on fear and despair. When you strike a target that is [[frightened]], [[panicked]], or [[shaken]] with a weapon with this fusion, the target is [[sickened]] for 1 round. When you make a successful attack that drops a foe (either by killing it or knocking it [[unconscious]]), you gain 5 temporary Hit Points that last for 10 minutes. Weapons with the [[nonlethal]] special property cannot benefit from the //cruel// fusion.
<div class="statblock">
* ''Size'' Huge
* ''Maneuverability'' average (+0 Piloting, turn 2)
* ''HP'' 180 (increment 25); ''DT'' 5; ''CT'' 36
* ''Mounts'' forward arc (1 capital), port arc (1 light), starboard arc (1 light), turret (1 heavy)
* ''Expansion Bays'' 6
* ''Minimum Crew'' 20; ''Maximum Crew'' 100
* ''Cost'' 60
These land vehicles use powerful propulsion methods that enable them to travel at high speeds on open terrain.
* ''Passengers:'' 3
* ''Adjustments:'' Increase price by 10%, decrease KAC by 1, increase Hit Points by 10%
* ''Cover:'' Improved cover
* ''Speed (Full):'' speed × 25
* ''Modifiers:'' +0 [[Piloting]], –2 attack (–4 at full speed)
You serve a good-aligned deity, or you feel a connection to the ideals of justice, mercy, and righteousness. You are dedicated to defending the weak, and destroying evil and tyranny. This connection can be taken only by characters of good alignment.
* ''Associated Deities:'' Iomedae, Sarenrae
* ''Associated Skills:'' [[Diplomacy]] and [[Mysticism]]
* ''Spells:'' 1st—//[[reflecting armor]]//, 2nd—//[[shield other]]//, 3rd—//[[haste]]//, 4th—//[[death ward]]//, 5th—//[[resistant aegis]]//, 6th—//[[greater resistant armor]]//
!! Weapon Proficiency (1st)
Crusaders receive more martial training than most mystics, focusing on weapons favored by their deities. You gain proficiency with advanced melee weapons, and at 3rd level you gain [[weapon specialization]] with them. If you are already proficient with advanced melee weapons, you instead gain one bonus combat feat you meet the prerequisites for.
!! Sworn Protector (3rd)
At the start of each turn, you can designate one ally within 30 feet of you as being under your protection. As a reaction when an attack hits the selected ally, you can make one melee or ranged attack against the enemy who made the attack. If your attack hits, it deals no damage, but that enemy gains the [[off-target]] condition until the end of their next turn.
!! Smite Evil (6th)
Once per day as a move action, you can infuse one weapon you touch, granting it the //[[holy]]// weapon fusion. If the weapon scores a critical hit against an evil creature, it applies the [[wound]] critical hit effect in addition to any other critical hit effect the weapon has. If the weapon already has the wound critical hit effect, it instead gains the [[severe wound]] or [[stagger]] critical hit effect (your choice). The weapon retains these benefits for 1 minute per mystic level. You can activate smite evil additional times per day by expending 1 Resolve Point each time after the first.
!! Sacred Weapon (9th)
Once per day, you can spend 10 minutes to add one of the following weapon fusions to one weapon of your choice: //[[axiomatic]]//, //[[holy]]//, //[[merciful]]//, or //[[returning]]//. The weapon retains this fusion for 24 hours or until you use this ability again.
!! Divine Protection (12th)
You gain a +2 divine bonus to saving throws against fear effects and against diseases, including magical and supernatural diseases. In addition, whenever you succeed at a saving throw against a disease, you are cured of that disease.
!! Radiant Aura (15th)
As a move action, you can expend 1 Resolve Point to create a 60-foot emanation centered on you that lasts 1 hour. This aura provides the benefits of your divine protection to creatures of your choice inside the area.
!! Guardian Angel (18th)
If damage reduces you to 0 Hit Points, even if you would die, you can expend 3 Resolve Points to stay alive and conscious with 1 Hit Point. You can use this ability as a reaction when another creature you can see drops to 0 Hit Points, expending 3 Resolve Points to allow that creature to stay alive and conscious with 1 Hit Point. Once you use this ability, you can do so again only after you rest for 8 hours.
When ending a flying or jumping movement, the creature can land on targets that are at least three size categories smaller than itself. Targets are automatically knocked [[prone]], take the listed damage, and are [[pinned]]. Each crushed target can attempt to escape the pin normally on its turn, and the pin ends automatically if the crushing creature moves out of the target's square. A crushed target does not take damage from the crush more than once, unless the crushing creature moves fully off that creature and then back onto it.
//Format:// ''Offensive Abilities'' crush (4d6+8 B).
//Guidelines:// Use the same damage amount as for the creature's standard melee attack.
As a standard action, you can increase the effects of gravity on the internal organs or workings of a target within 30 feet, causing it to have difficulty maintaining its normal functionality. The target must succeed at a Fortitude save or become [[staggered]] for 1 round. This revelation also affects constructs. You can maintain this effect as a move action each round, but the target can attempt a new saving throw each round to end the effect. Once a creature succeeds at this save or the effect ends, you can't target that creature with crush again for 24 hours.
When you are attuned or fully attuned, you can spend 1 Resolve Point to also [[stun]] the target for 1 round. Maintaining crush on subsequent rounds extends the staggered effect, but not the stunned effect.
<div class="statblock">
* <<levels>>
* ''School'' necromancy (death)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one living creature
* ''Duration'' instantaneous
* ''Saving Throw'' Fortitude partial
* ''Spell Resistance'' yes
</div>
You manipulate the energy that swirls around the target's head, pulling it inward and potentially crushing its skull. You must make a ranged attack against the target's EAC to ensure this spell hits the necessary weak spots in the target's head, but you can add your key ability score modifier to this attack roll instead of your Dexterity modifier if it is higher. If you hit and the target fails a Fortitude saving throw, it takes 18d8 damage. If the target succeeds at its saving throw, it instead takes 4d8 damage. The target might die from damage even if it succeeds at its saving throw; in this case, the spell is not a death effect.
This spell has no effect against living creatures that don't have an anatomical head.
Your weapons destroy the tools and energy your foes wield against you. As a move action, you can grant a weapon you wield, including your [[solar weapon]], the [[sunder]] weapon special property. This benefit lasts for 1 round or until you leave graviton mode. When you are attuned or fully attuned, your weapon gains the [[fatigue]] critical hit effect. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the fatigue effect.
name:rotary cannon
range:1 hex
speed:—
damage:3d8
pcu:10
cost:8
special:[[ripper]]
<div class="statblock">
* ''CR'' 5; ''XP'' 1,600
* N Large vermin
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +11
!!! DEFENSE
* ''HP'' 70
* ''EAC'' 17; ''KAC'' 19
* ''Fort'' +9; ''Ref'' +5; ''Will'' +4
!!! OFFENSE
* ''Speed'' 30 ft., burrow 50 ft.
* ''Melee'' bite +14 (1d6+10 P; critical [[wound]])
!!! STATISTICS
* ''Str'' +5; ''Dex'' +3; ''Con'' +2; ''Int'' —; ''Wis'' +0; ''Cha'' –3
* ''Skills'' [[Athletics]] +16, [[Acrobatics]] +11
* ''Other Abilities'' [[mindless]]
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or pair
</div>
A dedicated team of xenobiologists have posited a connection between the [[miasma fly]] and another creature native to Weydana-2, the cryllapede. Miasma flies congregate when temperatures in their environment dip significantly, arriving in great swarms. After devouring enough nutrients to power metamorphosis—a process that takes only a few days of constant gorging—miasma flies shed their wings, find shelter within crystal formations, and form a chrysalis nearly indistinguishable from the surrounding rock. In a few weeks, the creatures emerge in a new form: a large predatory insect known as a cryllapede, with a chitinous segmented body that mimics the appearance of Weydana-2's crystalline landscape. Cryllapedes use their sensitive, antennae-like legs to detect the movements of their preferred prey, the ruminant species of Weydana-2. Once they've located a herd, they burrow into the ground, pinpoint the exact location of a target, and erupt from the earth in an ambush attack. Cryllapedes lay their eggs in half-devoured corpses. Though they aren't normally aggressive to humanoids, cryllapedes will attack if threatened or desperate for food.
Cryo dragons prefer a strong defense over an aggressive offense and tend to think in terms of protecting their assets rather than damaging a foe's. They appreciate slow, calm moments, and they never get bored.
* ''CR:'' 3+
* ''Required Creature Type and Subtype:'' Dragon (technological).
* ''Suggested Alignment:'' Any lawful.
* ''Traits:''
** [[blindsense]] (vibration) 60 feet; [[darkvision]] 120 feet
** [[frightful presence]] (CR 14+, 60 feet + 10 feet per CR)
** [[DR]] 5/adamantine (CR 13+; increase to DR 10/adamantine at CR 15, DR 15/adamantine at CR 17, DR 20/adamantine at CR 19); [[immunity]] to cold; [[vulnerable]] to electricity
** climb speed of 30 feet
** [[breath weapon]] (cone 15 feet + 5 feet per 2 CR, 1d6 C + 1d6 per CR, usable every 1d4 rounds)
** cold beam (see below)
* //Cold Beam ([[Ex]]):// A cryo dragon can fire cold beams from their mouth as a ranged attack that targets EAC and has a range increment equal to their breath weapon's maximum range and the [[stagger]] critical hit effect. If the cryo dragon is CR 8 or higher, attacks with the cold beam benefit from [[flash freeze]].
Cryo grenades release a blast of supercooled chemicals on impact, which immediately coalesce into freezing particles.
<div class="table-wrapper">
|Grenade | Level | Price | Range | Capacity | Bulk |Special |h
|cryo grenade I | 6 | 600 | 20 ft. | drawn | L |[[explode]] (1d8 C, [[staggered]] 1 round, 10 ft.) |
|cryo grenade II | 10 | 2,350 | 20 ft. | drawn | L |[[explode]] (2d8 C, [[staggered]] 1 round, 15 ft.) |
|cryo grenade III | 14 | 9,400 | 20 ft. | drawn | L |[[explode]] (4d8 C, [[staggered]] 1 round, 20 ft.) |
|cryo grenade IV | 18 | 54,100 | 20 ft. | drawn | L |[[explode]] (6d8 C, [[staggered]] 1 round, 20 ft.) |
</div>
Cryo weapons generate blasts of supercooled gas that can damage or incapacitate a target. The gas is kept within a charged cryochamber attached to the weapon. While primitive models simply sprayed these freezing chemicals like a flamethrower, modern models use a containment beam to deliver deadly frozen particles to targets at impressive ranges. Most cryo weapons automatically replenish their reservoirs of reactive chemicals by drawing and processing various gases from the atmosphere, needing only batteries to maintain their ammunition supply.
One of the most popular lines of cryo weapons are zero weapons, including zero cannons, pistols, and rifles. In common parlance, avalanche-class cryo weapons are the coldest and most dangerous, followed in descending order by blizzard-class, hailstorm-class, and frostbite-class cryo weapons.
This high-tech chamber allows biological organisms to enter a form of stasis via a rapid freezing process and be sustained in pods for a long duration. Cryo-chambers can be set to keep an organism in stasis for a set duration, indefinitely, or until certain conditions are met, such as arrival at a navigational milestone or if the vessel comes under attack. During the days before Drift travel, most starship crews used these chambers to survive the months-long trips between destinations. Some exploration ships still use cryo-chambers in lieu of crew quarters, particularly those that regularly travel in the Vast. The Azlanti Star Empire has developed its own variation on the cryo-chamber, which is more compact but virtually unknown outside of Azlanti space.
A cryo-chamber can hold up to eight Medium or smaller creatures or four Large creatures in stasis for as long as the systems have adequate power. A cryo-chamber can instead be outfitted to hold a single Huge or Gargantuan creature, and two cryo-chambers can be combined to hold a single Colossal creature.
While in stasis in a cryo-chamber, a creature no longer advances on affliction tracks, and doesn't suffer from starvation, thirst, or sleep deprivation. Placing a creature in stasis or removing it from stasis takes 1 hour, after which the creature is [[sickened]] for 1 day unless it succeeds at a DC 25 Fortitude save.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|cryo-chamber | 10 | 5 |
</div>
The haft of a cryopike is a long aluminum or carbon-steel shaft with an adjustable rubber grip. A cryopike emits a blast of supercooled gas from its tip that acts as a freezing blade.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|cryopike, tactical | 5 | 3,360 | 1d8 C | — | 2 |[[powered]] (capacity 40, usage 2), [[reach]] |
|cryopike, advanced | 12 | 34,800 | 2d8 C | [[stagger]] | 2 |[[powered]] (capacity 40, usage 2), [[reach]] |
</div>
Cryospikes began as fire-extinguishing equipment, but they have since been weaponized and now serve a variety of roles. The weapon discharges a spike of hyper-cooled fluid that can be configured to put out a small fire or deal a burst of cold damage to its target. Most cryospike users integrate the apparatus's maze of polymer tubing and coolant reservoirs into their armor to keep it always close at hand. The personal cryospike is based on a model originally designed for use in powered armor prototypes (as such early designs are prone to fires caused by engineering faults). Residential cryospikes are typically employed by firefighting crews, while industrial cryospikes is most often kept on hand in massive starship-engineering bays.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|cryospike, personal | 2 | 1,100 | 1d4 C | — | L |[[extinguish]], [[integrated]] (2 slots), [[powered]] (capacity 20, usage 2) |
|cryospike, residential | 9 | 13,700 | 3d4 C | — | L |[[extinguish]], [[integrated]] (2 slots), [[powered]] (capacity 20, usage 2) |
|cryospike, industrial | 15 | 114,000 | 9d4 C | — | L |[[extinguish]], [[integrated]] (2 slots), [[powered]] (capacity 20, usage 2) |
</div>
<div class="statblock">
* ''Tier'' 12
* Colossal seahellion
* ''Operators'' 2–6; ''PP'' 9 (2/turn, max 18)
* Speed 40 ft., swim 60 ft.
* ''Senses'' [[blindsense]] (vibration) 30 ft., [[darkvision]] 120 ft., [[low-light vision]]
!!! DEFENSE
* ''HP'' 139; ''SP'' 27; ''Hardness'' 8
* ''EAC'' 30; ''KAC'' 35
* ''Fort'' 14; ''Ref'' 12
* ''Immunities'' construct immunities
!!! OFFENSE
* ''Base Attack Bonus'' +10
* ''Melee'' chainwhip (upper limb—10d4+20 B)
* ''Ranged'' missile battery (frame—10d4+12 F&P)
* ''Space'' 30 ft.; ''Reach'' 30 ft.
* ''Strength'' +8
!!! SYSTEMS
* ''Power Core'' mk 4 eternal (corpsegnawer core)
* ''Lower Limbs'' quadruped
* ''Upper Limbs'' assault arms (+1 melee, +0 ranged)
* ''Auxiliary'' entry hatch, plasma-shock circuits, plow plating, weapon core (acid, electricity)
</div>
''System:'' All legs
Crypt marrow replaces the bone marrow of your legs or equivalent tissue with necromantically enhanced tissue. Within hours of the operation, the fetid ichor of the crypt marrow interacts with and enhances your living blood. Subtract the necrograft's mark from any bleed damage you take. If this reduces your damage from bleeding that round to 0 or less, the bleed condition ends. Additionally, you gain an enhancement bonus equal to the necrograft's mark to saving throws against disease and effects that cause bleeding, unless the effect specifies it functions against undead.
Mk 3 or mk 4 crypt marrow allows you to spend 1 Resolve Point as a swift action to ignore the effects of the [[fatigued]] condition for a number of rounds equal to the necrograft's mark. Mk 5 crypt marrow allows you to spend 1 Resolve Point as a swift action to ignore the effects of the [[exhausted]] or [[fatigued]] condition for 5 rounds. This doesn't eliminate the underlying source of the condition, but these rounds count toward the condition's duration. If you are affected by another effect that would cause you to be exhausted or fatigued while ignoring such an effect using your crypt marrow, you become exhausted or fatigued as normal.
<div class="statblock">
* ''Tier'' 7
* Large destroyer
* ''Speed'' 6; ''Maneuverability'' average (turn 2); ''Drift'' 1
* ''AC'' 21; ''TL'' 19
* ''HP'' 170; ''DT'' —; ''CT'' 34
* ''Shields'' medium 100 (forward 30, port 25, starboard 25, aft 20)
* ''Attack (Forward)'' heavy laser net (5d6), plasma cannon (5d12)
* ''Attack (Port)'' gyrolaser (1d8)
* ''Attack (Starboard)'' gyrolaser (1d8)
* ''Attack (Turret)'' light EMP cannon (special)
* ''Power Core'' Arcus Maximum (200 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' basic computer, basic medium-range sensors, [[crew quarters]] (common), mk 4 defenses, mk 5 armor; ''Expansion Bays'' [[cargo hold]], [[escape pods]], [[life science lab]], [[medical bay]] (modified)
* ''Modifiers'' +2 [[Computers]]
* ''Complement'' 20 (minimum 6, maximum 20)
!!! CREW
* ''Captain'' [[Bluff]] +19 (7 ranks), [[Computers]] +21 (7 ranks), gunnery +19, [[Intimidate]] +19 (7 ranks), [[Piloting]] +19 (7 ranks)
* ''Engineer (1 officer, 6 crew)'' [[Engineering]] +14 (7 ranks)
* ''Gunner (1 officer, 3 crew)'' gunnery +14
* ''Pilot (1 officer, 2 crew)'' [[Piloting]] +14 (7 ranks)
* ''Science Officer (1 officer, 4 crew)'' [[Computers]] +16 (7 ranks)
</div>
Ominous Crypt Warden destroyers form the backbone of any Corpse Fleet armada. A Crypt Warden resembles two fused scythe blades made of bone, with a single powerful cannon running down the center. Made for frontal engagements, these ships intimidate enemies with their sharpened prows, shrugging off lesser attacks with their shields while returning fire with intense blasts of plasma when their EMP cannons don't immediately disable their foes. These ships are also one of the few Eoxian-designed ships to include a medical bay as a standard amenity—though the services rendered within are tailored to undead, with necromantic facilities that repair the ship's unliving crew.
<div class="statblock">
* <<levels>>
* ''School'' conjuration
* ''Casting Time'' 1 standard action
* ''Range'' 30 ft.
* ''Area'' cone-shaped burst
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Reflex half
* ''Spell Resistance'' no
</div>
You force unstable magic into the ground, causing jagged crystals to erupt in the area. Creatures in the area and in contact with the ground when the spell first takes effect take 2d8 piercing damage. The crystals remain for the spell’s duration, making the affected area difficult terrain that deals 1d4 piercing damage to a creature any time they move into an affected square on foot.
<div class="statblock">
* <<levels>>
* ''School'' conjuration (electricity)
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Duration'' 1 minute/level
* ''Saving Throw'' Reflex partial
''Spell Resistance'' no
</div>
You create three electrified crystal proximity mines under the ground within range. Each mine must be within 30 feet of at least one of the other mines. Each mine occupies one 5-foot square and remains for the duration or until triggered. When a creature enters a space adjacent to a mine, that mine immediately explodes, dealing 2d8 piercing damage and 2d8 electricity damage to creatures in a 10-foot-radius burst centered on the mine. A creature can spot and disable a crystal mine as a trap with successful [[Perception]] and [[Engineering]] checks respectively (DC = 15 + your caster level + your key ability score modifier).
A creature wielding a crystal spear can tighten its grip on the spear to engage the crystal's growth, giving the weapon extra reach. The new growth is brittle and collapses on contact, returning the spear to its original size and shape.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|crystal spear, tactical | 3 | 1,600 | 1d6 P | – | 1 |[[analog]], [[block]], [[reach]], [[thrown]] (20 ft.), [[underwater]] |
|crystal spear, sentinel | 11 | 25,500 | 4d6 P | – | 1 |[[analog]], [[block]], [[reach]], [[thrown]] (20 ft.), [[underwater]] |
|crystal spear, zero-edge | 18 | 390,000 | 11d6 P | – | 1 |[[analog]], [[block]], [[reach]], [[thrown]] (20 ft.), [[underwater]] |
</div>
The creature's crystalline body refracts light. It takes half damage from weapons with the word "laser" in their names.
This case attaches to a limb and expands to show disks inscribed with detailed charts and illustrations of key concepts of [[Life Science]], [[Mysticism]], or [[Physical Science]]. The skill must be chosen upon item creation and can’t be changed. Meditating for an hour while holding the codex’s crystal handles makes the charts appear on your skin in crystalline writing for 24 hours. While consulting these charts, you gain an insight bonus to the appropriate skill equal to the item’s mark. You can benefit from only one crystalline codex at a time.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|crystalline codex mk 1 | 3 | 1,400 | L |
|crystalline codex mk 2 | 7 | 7,000 | L |
|crystalline codex mk 3 | 11 | 25,000 | L |
|crystalline codex mk 4 | 15 | 115,000 | L |
|crystalline codex mk 5 | 19 | 600,000 | L |
</div>
Cthonic creatures are native denizens of the Elemental Plane of Earth or underground environments, and they have adapted to exist in dirt and rock.
* ''CR:'' 1+
* ''Grafts:'' add the earth subtype graft (burrow speed should equal creature's fastest movement speed)
* ''Traits:''
** [[blindsense]] (vibration) if CR 7 or less, and [[blindsight]] (vibration) if CR 8 or greater (in either case, with a range equal to creature's burrow speed)
** natural melee attacks bypass [[DR]]/[[cold iron]]
** if the creature is from the Elemental Plane of Earth, it gains the extraplanar subtype when it isn't on that plane
You can craft food or drink in half the time it would normally take, your [[custom microlab]] counts as professional's tools for [[Profession]] (cook) checks, and you can use your [[Life Science]] skill in place of [[Profession]] (cook) for checks other than those to earn a living. If you gain an insight bonus to Life Science or Profession (cook) checks, you apply that insight bonus to both skills.
This marvel of modern culinary preparation is a small cube with a control panel on one side and a hatch on another. Using chemical reactions combined with high pressures, a culinary synthesizer converts UPBs into edible foodstuffs, allowing you to craft normal food and drink without using the [[Life Science]] skill. Culinary synthesizers are the source of much of the mass-produced food consumed in the Pact Worlds.
A culinary synthesizer comes preprogrammed with a variety of simple meals. You enter the type of meal you want into the synthesizer's control panel and add an amount of UPBs equal to the meal's price into the cube's transformation chamber; the synthesizer reconstructs the UPBs into the desired meal. More advanced culinary synthesizers can be programmed to create intoxicants and other food products (such as field rations and R2Es), as well as individual foodstuffs and ingredients, including analogues of animal products, vegetable products, spices, and more; this requires a number of UPBs equal to the final price of the food product or ingredient. You can then combine these foodstuffs and ingredients into full meals using the [[craft food or drink]] task of the Life Science skill.
A culinary synthesizer is a technological item that is usually plugged in to draw power from the local energy grid, but most models come equipped with a manual turn crank that enables them to function when not connected to an external energy source. A culinary synthesizer plugged into an energy grid can create a number of meals (or individual food products) equal to its level in 1 minute. When you power it using the turn crank, a synthesizer can convert 1 UPB into food for each minute that it is cranked.
The quality of food and meals a synthesizer can create depends on its model, as described below.
* ''Mk 1:'' You can create only poor-quality meals.
* ''Mk 2:'' You can create up to common-quality meals, minor intoxicants, and any other food or drink with a price of 3 credits or less.
* ''Mk 3:'' You can create up to good-quality meals, superior intoxicants, and any other food or drink with a price of 10 credits or less.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|culinary synthesizer, mk 1 | 1 | 400 | 1 |
|culinary synthesizer, mk 2 | 3 | 1,200 | 1 |
|culinary synthesizer, mk 3 | 5 | 2,500 | 2 |
</div>
Members of the Order of the Culling Shadow sometimes still use shadowstaves for hand-to-hand combat, but they’ve also developed a less discriminate weapon dubbed a culling ray. This black metallic rod has a distinct pistol-like grip and serrations running along the barrel that resemble the spikes of a vicious animal; the culling ray projects a wide field of energy that flays the skin and tissue of any creature unlucky enough to find itself caught in its beam—and then sets them on fire. Energy from a culling ray can cause a breakdown in the target’s molecular structure.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|culling ray, lesser | 8 | 8,850 | 1d12 A & F | 30 ft. | [[irradiate]] | 20 charges | 1 | 2 |[[blast]], [[ignite]] 1d6 |
|culling ray, standard | 12 | 34,500 | 2d12 A & F | 30 ft. | [[irradiate]] | 20 charges | 2 | 2 |[[blast]], [[ignite]] 3d6 |
|culling ray, greater | 18 | 350,000 | 4d12 A & F | 30 ft. | [[irradiate]] | 40 charges | 4 | 2 |[[blast]], [[ignite]] 5d6 |
</div>
Your life's work is to ferret out cults and free those who have fallen into their clutches. You've studied their methods, and you know that they hide in plain sight more often than not, and that confronting them requires a combination of keen intellect, scrupulous attention to detail, and a fair share of defensive—and sometimes offensive—training. You may work for a legitimate agency like the Veskarium's Division of Disloyal Organizations or the church of Abadar, you might pursue the cults for your own purposes, or you could even work directly for a cult yourself to eliminate the competition.
!! Theme Knowledge (1st)
You're obsessed with cults and know where to find them. Reduce the DC of [[Culture]] checks to [[recall knowledge]] about cults and of [[Diplomacy]] checks to [[gather information]] about cults by 5. [[Sense Motive]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to Sense Motive checks. In addition, you gain an ability adjustment of +1 to Wisdom at character creation.
!! Conspiracy Web (6th)
You can spend 10 minutes to lay out the evidence you've gathered about a specific cult, as long as, at the GM's discretion, that evidence is enough to specifically identify that organization. This helps you prepare against that cult's tactics and methods, but doesn't count as a resting to regain Stamina Points. You gain a +2 circumstance bonus to [[Perception]] and [[Sense Motive]] checks against members of that cult and a +1 circumstance bonus to saving throws against its members' spells and effects. This bonus lasts until you create a new conspiracy web. You can benefit from only one conspiracy web at a time.
!! Flash Deprogramming (12th)
The process of deprogramming a cult member is long and arduous, but you've learned tricks to grant a moment of lucidity to even the most entrenched members. When attempting a [[Diplomacy]] check to [[change a creature's attitude|Change Attitude]], you can spend 1 Resolve Point to do so as a standard action rather than taking a full minute. In addition, when you use this ability on a creature under the effects of a charm or compulsion effect whose save DC is lower than the result of your Diplomacy check, that effect is suppressed for 1 minute. The effects of this ability are temporary, but repeated applications could help a cult member begin a journey along the road to recovery.
!! Inspiring Preparation (18th)
When you take 10 minutes to prepare to face a specific cult using the conspiracy web ability, you recover 1 Resolve Point. Alternatively, you can take 10 minutes to study a conspiracy web you've already created to recover 1 Resolve Point; this doesn't count as resting to regain Stamina Points. You can recover Resolve Points in these ways up to twice per day.
You served as a hooded, faceless adherent to a religion or organization that remains hidden from public view—usually because its aims are illegal or immoral. Although your time in a cult is most likely behind you—or, at least, that's what you insist whenever the subject arises—you remain keenly aware of signs of cult activity and inured to physical hardship by exposure to mind-expanding substances combined with sleepless nights of unending ritual.
!! Theme Knowledge (1st)
You cataloged the symbols, members, and indoctrination techniques of the cult you joined, and you can generalize these to hidden cults of any kind. Reduce the DC of [[Culture]] and [[Mysticism]] checks to [[recall knowledge]] about hidden cults and secretive religions, including knowledge about their beliefs, hierarchy, and symbols, by 5. Reduce the DC of [[Diplomacy]] checks to [[gather information]] about hidden cults and their enigmatic members (usually considered obscure or secret knowledge or mysterious or obscure individuals) by 5. [[Disguise]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to Disguise checks. In addition, you gain an ability adjustment of +1 to Constitution at character creation.
!! Cult Infiltrator (6th)
Once you have discovered a hidden cult, you can quickly learn to slip into the mindset of its members and pretend to be one of them. If you spend 10 minutes conversing with a member of a hidden cult and succeed at a DC 25 [[Culture]] check, typical followers of that cult have a starting attitude of indifferent toward you. You also gain a +2 bonus to [[Bluff]], [[Diplomacy]], and [[Intimidate]] checks against such followers.
!! Exceptional Endurance (12th)
Your exposure to drugs and poisons during your time with the cult has left you inured to their effects. Once per day, you can reroll a Fortitude saving throw to resist the effects of a disease, drug, or poison. You must decide to use this ability after rolling but before learning the outcome of your first roll.
!! Memories of Devotion (18th)
Reflecting on your experience within or against the galaxy's cults provides you with inner reserves of strength. Up to twice per day, you can deliberate about your time as a cultist—either by speaking to another person or by recording private audio logs—for 10 minutes to regain 1 Resolve Point; this time doesn't count as resting for the purpose of regaining Stamina Points.
You can tap into the local zeitgeist to win friends and influence people.
''Benefit:'' Once per day after spending 1d4 hours in a settlement, you can attempt a DC 15 [[Culture]] check to [[recall knowledge]] about local customs, fads, sports teams, or other local phenomena. If you succeed at this check, you gain a +2 bonus to [[Diplomacy]] checks to [[gather information]] in that settlement, as well as to [[change the attitude|Change Attitude]] of its residents. This benefit can't apply multiple times to the same settlement.
This expansion bay serves as a training facility and database for agents preparing to infiltrate a group or species. Clothing and personal items can be crafted in half the normal time at a cultural preparation facility, though the crafter must still provide the necessary raw materials. The facility's computer system also trains personnel in the languages and accents, cultural behaviors, social norms, and even body language and facial expressions of the group the users expect to infiltrate. To use this aspect of a cultural preparation facility, a creature chooses a single species or cultural group and then spends three 8-hour sessions (which can be over the course of several days) within the facility. After this time, for 1 day, the creature has a +2 circumstance bonus on Culture checks relating to the chosen species or cultural group. In addition, the creature can replace one of the languages it knows (except for Common, their racial tongue, or the language of their home planet) with a language spoken by the chosen species or cultural group. At the GM's discretion, the cultural preparation facility might not be able to teach a rare or unusual language.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|cultural preparation facility | 3 | 2 |
</div>
As long as you have enough time, you can take 20 on [[Culture]] checks to recall knowledge, even if you don't have access to a computer terminal or other means of research.
You are a student of the vast number of known cultures in the galaxy, and you have a deep and rich understanding of the undercurrents of cultures and language in general. Each time you take a rank in Culture, you learn to speak and read a new language.
<$list filter="[tag<currentTiddler>tag[Tasks]]">
<$macrocall $name="collapse" tiddler={{!!title}}/>
</$list>
When you strike a creature with a //cunning// weapon and deal damage, you can attempt an [[Engineering]], [[Life Science]], or [[Mysticism]] check to [[identify]] the creature as appropriate (this takes no action). You gain a +2 circumstance bonus to this check. If you succeed, in addition to learning useful information about the creature, you gain a +1 circumstance bonus to the next saving throw you must attempt against that creature’s abilities within the next minute.
When you attempt an initial [[Disguise]] check, you can forgo rolling your [[expertise]] die. Instead, the first time a creature would pierce your disguise with a [[Perception]] check, treat its result as if it had rolled a natural 1 on its [[Perception]] check. This benefit applies only once per disguise. At 9th level, this ability also applies against the second creature who pierces your disguise.
Once every 1d4 rounds, the creature can attempt the [[target system]] science officer action using a skill bonus equal to its good skill bonus.
You manipulate the entropy of microorganisms and toxins within your body, causing them to break down quickly. When you succeed at a saving throw against a disease or poison, you treat it as two consecutive successes for the purposes of curing that disease or poison.
This large technomagical device can create strong currents in water. It's often used for the short-distance transport of material in underwater excavations, but it has limitless applications. A //current generator// takes a full action to activate, at which point it creates a strong current in a line of a length that depends on the mark of the generator. Creatures that start their turn in or enter the area must succeed at a Fortitude saving throw (DC = 10 + item level of the generator) or be moved 10 feet in the direction of the line, away from the //current generator//. Swimming through the area requires an [[Athletics]] check to swim as though in stormy conditions; the DC of this check is 10 higher if moving in the opposite direction of the current, and 5 higher otherwise.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage | Line |h
|//current generator//, mk 1 | 5 | 2,750 | 2 | 100 | 10/hour | 50 ft. |
|//current generator//, mk 2 | 10 | 17,000 | 2 | 100 | 10/hour | 100 ft. |
|//current generator//, mk 3 | 15 | 95,000 | 2 | 100 | 10/hour | 300 ft. |
</div>
<div class="statblock">
* ''Type'' curse; ''Save'' Will DC 20
* ''Effect'' In combat and other stressful situations, the victim is affected as if by a //[[slow]]// spell and is immune to effects that would increase its speed.
* ''Cure'' The victim must [[hustle|Overland Movement]] for 4 consecutive hours each day for 1 week; it must perform this movement to reach a specific destination.
</div>
<div class="statblock">
* ''Type'' curse; ''Save'' Will DC 20
* ''Effect'' Each week, the victim loses 10% of their net worth through strange mishaps.
* ''Cure'' The victim must donate 20% or more of their net worth selflessly, not just to remove the curse.
</div>
<div class="statblock">
* ''Type'' curse; ''Save'' Will DC 20
* ''Effect'' The victim treats each hour as a day for [[starvation and thirst]] and is immune to effects that prevent the need for sustenance or that remove starvation or thirst.
* ''Cure'' The victim must drink only water and eat only flavorless gruel for 1 month.
</div>
<div class="statblock">
* ''Type'' curse; ''Save'' Will DC 20
* ''Effect'' After failing an ability check, attack roll, saving throw, or skill check, the victim takes a –2 penalty to that rolls of that type for 1 minute (treat each individual skill check, ability check, and saving throw separately) and can't try again on rolls of that type. This means the victim can't take 20.
* ''Cure'' The victim must spend 1 month humbly and obediently apprenticing to a master in one of its fields of expertise.
</div>
<div class="statblock">
* ''Type'' curse; ''Save'' Will DC 20
* ''Effect'' Each combat, whenever the victim would take its first hostile action, it is instead [[confused]] for 1d4 rounds.
* ''Cure'' The victim must take no hostile actions for 1 month of active adventuring.
</div>
<$list filter="[list[$:/StoryList]is[current]]">
Curses are magical afflictions and usually have a single effect, though some curses use tracks like diseases and poisons do. Removing a curse requires either using //[[remove affliction]]// or fulfilling a special condition that varies by curse (and sometimes differs between individual applications of the same curse).
</$list>
<<list-links "[tag[Curses]sort[title]]" class:index>>
This graceful, curving blade further increases the drama inherent in sword fighting. Carbon steel blades bite deeply, causing bleeding wounds. The blade of an ultrathin curve blade looks delicate, but it is as hard as carbon steel and keeps a fine edge. Buzzblade curve blades vibrate when powered, tearing organic flesh and causing additional bleed damage. Dimensional slice curve blades have only a narrow visible blade area, surrounded by a solid aura; these are the sharpest and most dangerous curve blades on the market.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|curve blade, carbon steel | 4 | 2,230 | 1d10 S | [[bleed]] 1d6 | 2 |[[analog]] |
|curve blade, ultrathin | 10 | 18,100 | 3d10 S | [[bleed]] 2d6 | 1 |[[analog]] |
|curve blade, buzzblade | 16 | 184,300 | 8d10 S | [[bleed]] 5d6 | 2 |[[powered]] (capacity 40, usage 2) |
|curve blade, dimensional slice | 20 | 815,000 | 12d10 S | [[bleed]] 6d6 | 2 |[[powered]] (capacity 40, usage 2) |
</div>
When you deliver your [[entropic shot]] through a small arm weapon, you can spend one or more Entropy Points and choose a space that is within a number of feet equal to 5 × the number of Entropy Points expended. Treat that square as the point of origin for your attack, determining cover and other modifiers as though you were attacking from that space.
You have developed a technique to use your enemies' gravity fields against them, creating a shining ricochet. When you make a ranged attack with your [[solar flare]] as a standard action and hit, you can use a move action to make a second ranged attack with your solar flare. This second attack is made at a –8 penalty (–6 if you're attuned or fully attuned) and must be made against a different target than the first attack. You determine line of sight and the range of this attack starting from one corner of the space occupied by the target of the first attack. The second attack is treated as an attack in a full attack for the purposes of abilities that reduce the penalties for full attacks. You must have a solar flare to select this stellar revelation.
As a reaction, you can expend one of your biohacks to protect an ally attuned to your [[custom microlab]] who is about to take falling damage. The target must be adjacent to you or within the first range increment of a ranged injection weapon you're wielding. The target treats the fall as if it were 20 feet shorter, plus an additional 10 at 5th level and every 3 levels thereafter.
At 5th level, you can spend 1 Resolve Point when you use this theorem to instead target an ally who is about to take bludgeoning damage from an attack or spell. The ally reduces the damage taken by an amount equal to twice your key ability score modifier. At 10th level, this amount increases to three times your key ability score modifier, and at 15th level, this amount increases to four times your key ability score modifier. Once a creature has benefited from this use of cushion the blow, they cannot benefit from it again until they take a 10-minute rest to recover Stamina Points.
You manipulate your nanites to slow your descent and cushion you from falls. While your [[sheath array]] is active, you treat falls as 20 feet shorter. You can use a [[nanite surge]] as a reaction to instead treat falls as 60 feet shorter for 1 round.
You have created a small, customized kit consisting of medical supplies, testing materials, and pharmaceutical compounds, which you can use to evaluate medical conditions and perform several additional tasks described below. You can configure your custom microlab to take the shape of anything that can fit in your hand or similar appendage. Alternatively, you can add it to an armor upgrade slot or to an augmentation system in your brain or an arm; it never takes up an armor upgrade slot or occupies a system in your body, so you can still use that slot or system for an armor upgrade or augmentation as normal. You must have your custom microlab on your person to use it, but you can configure it so it doesn't need to be in your hand to function.
Your custom microlab counts as a [[basic medkit]] and a [[chemalyzer]] and can be used for any purposes applicable to those items. As long as you are in possession of your custom microlab, you can use [[Physical Science]] or [[Life Science]] instead of [[Mysticism]] to make [[serums]], though these serums are not magic items, can be identified using Life Science or Physical Science rather than Mysticism, and do not require a //[[detect magic]]// spell to attempt such a check to identify.
As long as you have your custom microlab, as a move action you can target a creature within your line of sight and within the microlab's range (60 feet at 1st level) and attempt a special skill check to [[identify|Identify Creature]] it. If the creature is living, this is a Life Science check. If it is unliving, it's a Physical Science check. The DC of this check is determined by the creature's rarity, as presented on the [[Creature Rarity table|Identify Creature]]. You can attempt this check untrained regardless of the DC, and you always treat your die roll result as a 20.
You can also attune your custom microlab to a number of individual creatures equal to 3 + your key ability modifier. This takes 10 minutes, which you can combine with the time needed to prepare your [[biohacks]] for the day, and the creatures must be present, willing, and able to cooperate with the scan. If you attune your microlab to creatures in excess of this number, the oldest attunements beyond your maximum number end. Otherwise, attunement lasts 24 hours, after which changes in environment and the target's condition require the microlab be re-attuned. Under some circumstances, you can deliver biohacks to attuned creatures using ranged injection weapons without making an attack roll.
At 5th level, your custom microlab can function as an [[advanced medkit]]. At 9th level, it functions as a [[medical lab]] (with no increase to its bulk), and its range increases to 90 feet. At 17th level, its range increases to 120 feet.
If your custom microlab is damaged, destroyed, lost, or stolen, you can kitbash a new one from any medkit or chemalyzer with 1 hour of work. You can have only one custom microlab at a time. If you create a new custom microlab, your old one functions as a normal item of whatever type you made it from.
You have created a customized toolkit you can use to hack systems and items. Your custom rig can be configured to take up an upgrade slot on your armor or can be installed as a cybernetic augmentation system in your brain (though it can be combined with a [[datajack]] for the same price as installing a datajack normally), your eyes, or an arm. Alternatively, you can configure it to be a handheld device, meaning that you must retrieve it and hold it to use it effectively. While using this rig, you always count as having the appropriate tool or basic kit for any [[Computers]] or [[Engineering]] skill check you attempt. Some mechanic tricks and drone mods require the use of a custom rig. In addition, you can use your custom rig as a personal [[comm unit]]. Finally, if you have a [[drone]], you can use your custom rig to communicate over an encrypted channel with your drone to issue commands to its AI or directly control it at a range of 2,500 feet.
If your custom rig is damaged, destroyed, lost, or stolen, you can kitbash a new one from any engineering kit, hacking kit, or other technological toolkit, reconfiguring the materials into a new custom rig with 1 hour of work. You can have only one custom rig at a time. If you create a new custom rig, your old one functions as a normal toolkit of whatever type you made it from and can no longer be used with your mechanic tricks.
The following tables provide base statistics for creating your vehicle, such as AC, speed, and starting price. The level determines the item level of the vehicle and its base statistics, which are modified further in the subsequent steps. Record each of these statistics for the level of your vehicle.
* ''Level:'' The item level of your vehicle.
* ''Price:'' The base price of the vehicle; it is modified by further templates. Apply changes in the order you apply the templates.
* ''Speed:'' The vehicle's base speed. Land vehicles can move only along the ground, air vehicles have fly speeds, and water vehicles have swim speeds.
* ''EAC:'' The vehicle's Energy Armor Class.
* ''KAC:'' The vehicle's Kinetic Armor Class.
* ''HP:'' The vehicle's Hit Point total. Its Break Threshold equals half the vehicle's Hit Points, unless otherwise stated by a template.
* ''Hardness:'' The vehicle's [[hardness]]. Additional grafts can increase the hardness up to twice this starting value, though vehicle modifications like [[adamantine plating]] can increase the hardness beyond this limit afterward. A vehicle's hardness is always at least 5, even if a graft would reduce it below this value.
* ''Collision Damage:'' The vehicle's base collision damage, which can be altered by grafts and later modifications.
* ''Collision DC:'' The vehicle's base collision DC.
''Modifiers:'' The vehicle's modifiers to [[Piloting]] checks and attack rolls, with a larger modifier to attack rolls listed in parentheses for when the vehicle is traveling at full speed.
''Modification Slots:'' The number of modification slots the vehicle has.
!! Other Statistics
Several other statistics, described below, are derived from grafts rather than the vehicle's level.
* ''Adjustments:'' These are modifications to the vehicle's statistics.
* ''Cover:'' The amount of cover the vehicle provides.
* ''Passengers:'' The number of passengers the vehicle can comfortably carry, in addition to the pilot.
* ''Special:'' Unique effects or prerequisites that apply to the vehicle.
* ''Speed (Full):'' The vehicle's full speed, primarily determined by the [[vehicle type graft|Vehicle Type Grafts]].
* ''Speed (Travel):'' The vehicle's overland speed used for noncombat movement, expressed in miles per hour. Except where otherwise noted, this speed equals the vehicle's full speed divided by 10.
<div class= "table-wrapper">
|Level | Price | Speed | EAC | KAC | HP | Hardness | Collision<br/>Damage | Collision<br/>DC | Modification<br/>Slots |h
|1 | 700 | 25 | 12 | 14 | 12 | 5 | 4d4 B | 10 | 1 |
|2 | 1,800 | 25 | 13 | 15 | 20 | 5 | 5d4 B | 11 | 1 |
|3 | 2,600 | 25 | 14 | 16 | 30 | 5 | 6d4 B | 12 | 1 |
|4 | 4,000 | 25 | 15 | 17 | 40 | 5 | 5d6 B | 13 | 1 |
|5 | 6,000 | 25 | 17 | 19 | 55 | 5 | 5d8 B | 13 | 2 |
|6 | 8,500 | 30 | 18 | 20 | 75 | 6 | 6d8 B | 14 | 2 |
|7 | 13,000 | 30 | 19 | 21 | 95 | 7 | 6d10 B | 15 | 2 |
|8 | 19,000 | 30 | 20 | 22 | 120 | 8 | 7d10 B | 16 | 2 |
|9 | 27,000 | 35 | 21 | 23 | 135 | 9 | 8d10 B | 16 | 2 |
|10 | 36,000 | 35 | 23 | 25 | 150 | 10 | 9d10 B | 17 | 3 |
|11 | 50,000 | 35 | 24 | 26 | 165 | 11 | 10d10 B | 18 | 3 |
|12 | 73,000 | 40 | 25 | 27 | 185 | 12 | 11d10 B | 19 | 3 |
|13 | 100,000 | 40 | 26 | 28 | 205 | 13 | 12d10 B | 19 | 3 |
|14 | 150,000 | 40 | 27 | 29 | 230 | 14 | 14d10 B | 20 | 3 |
|15 | 230,000 | 45 | 29 | 31 | 255 | 15 | 15d10 B | 21 | 4 |
|16 | 345,000 | 45 | 30 | 32 | 280 | 16 | 17d10 B | 22 | 4 |
|17 | 520,000 | 45 | 31 | 33 | 310 | 17 | 18d10 B | 22 | 4 |
|18 | 760,000 | 50 | 32 | 34 | 340 | 18 | 20d10 B | 23 | 4 |
|19 | 1,150,000 | 50 | 33 | 35 | 370 | 19 | 23d10 B | 24 | 4 |
|20 | 1,750,000 | 50 | 35 | 37 | 400 | 20 | 25d10 B | 25 | 5 |
</div>
Designing a new vehicle involves choosing the vehicle's item level, which determines many of the vehicle's base statistics. From there, apply several templates to adjust those statistics and make the vehicle fit your concept. Whatever you design, you can augment it further using [[vehicle modifications]]. The following provides an overview of the vehicle-design process.
!! Step 0: Vehicle Concept
Before you start designing your vehicle, you should have a clear idea of what the purpose of this vehicle is. Is the vehicle a fast transport, a powerful gunship, or an invulnerable tank? Why was it designed? What task was it created to perform? Who created it? A racing vehicle designed by goblins will sport a very different set of abilities than a Veskarian assault tank.
!! Step 1: Array
Choose the level of the vehicle, then locate and use the starting statistics in [[Custom Vehicle Array|]].
!! Step 2: Vehicle Type Graft
Choose and apply one of the [[vehicle type grafts|Vehicle Type Grafts]] based on your vehicle's general shape, such as a cycle, flying vehicle, tank, or walker. Apply any adjustments that template provides. The vehicle type graft has a significant impact on your vehicle's final statistics.
!! Step 3: Vehicle Size Graft
Determine the vehicle's size. Choose a [[vehicle size graft|Vehicle Size Grafts]] and apply any adjustments to your starting statistics. Large vehicles have no adjustments, as Large is the default size for most vehicles. Small creatures sometimes use Medium vehicles.
!! Step 4 (Optional): Vehicle Origin Graft
Is this custom vehicle created by a large corporation for wide distribution, a hand-made vehicle, or an experimental vehicle? You can [[choose one graft|Vehicle Origin Grafts]] that best describes your vehicle and apply it.
!! Step 5 (Optional): Special Grafts
The [[templates in this section|Special Vehicle Grafts]] describe rarer types of vehicles, such as those that are built from scrap, designed for off-road travel, or include an auto-pilot. Apply up to two of these grafts if they help to describe your vehicle.
<<list-links "[list<currentTiddler>]" class:index>>
This //gimmick// grants you a bonus to any caster level checks you make to overcome targets’ [[spell resistance]] with the channeled spell, based on the //gimmick’s// model. This bonus does not stack with that provided by the [[Spell Penetration]] or [[Greater Spell Penetration]] feats.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Caster Level Bonus |h
|//cutting gimmick//, apprentice | 2 | 750 | L | +1 |
|//cutting gimmick//, expert | 6 | 4,200 | L | +2 |
|//cutting gimmick//, master | 10 | 18,500 | L | +3 |
</div>
<div class="statblock">
* ''Type'' poison (contact)
* ''Save'' Fortitude DC 16
* ''Track'' [[Constitution|Constitution Poison Track]]
* ''Onset'' 1 minute
* ''Frequency'' 1/round for 6 rounds
* ''Effect'' Related to its use in extracting metals, cyanide is effective against [[elementals]] with the earth subtype, bypassing their natural [[immunity]] to poison.
* ''Cure'' 2 consecutive saves
</div>
<div class="table-wrapper">
|Substance | Level | Price |h
|cyanide | 6 | 600 |
</div>
You've had some form of cybernetic augmentation since you were very young, and you see further augmentation as a path to self-improvement. You might be a verthani from the Augmented caste, a steelskin orc seeking to distinguish yourself from mainstream society, or anyone else inspired by the possibilities technology offers. Either way, you strive to master your current cybernetics and seek to further upgrade yourself whenever the opportunity presents itself.
!! Theme Knowledge (1st)
You enthusiastically study the field of cybernetics and seek to keep abreast of new applications and experimental technologies. Reduce the DCs of [[Engineering]] checks to [[identify|Identify Technology]] cybernetic augmentations and of [[Life Science]] checks to [[recall knowledge]] about cybernetic augmentation techniques, as well as corporations and other research facilities involved in the production of and experimentation with cybernetic augmentations, by 5. [[Computers]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to Computers checks. In addition, you gain an ability adjustment of +1 to Intelligence at character creation.
!! Self-Hacker (6th)
Your constant experimentation has blurred the lines between your body and your augmentations. Once per day as a full action, you can overclock one of your cybernetic augmentations to regain a number of Stamina Points equal to the augmentation's item level; you must have a cybernetic augmentation installed in your body to use this ability.
!! Hardened Systems (12th)
You understand the potential vulnerabilities of cybernetics and have tinkered extensively with your own to make them more resilient. The DC to hack your cybernetic augmentations via magic or technological means increases by 5, thanks to the devious security countermeasures you have added to them. Additionally, your cybernetic augmentations grant you electricity [[resistance]] 5; this resistance stacks with one other source of energy resistance.
!! Master Modder (18th)
You feel energized whenever you demonstrate the improved capabilities of your cybernetically enhanced body. Up to twice per day, when you have succeeded at a significant task in a way that crucially relied upon abilities granted by your cybernetics (GM's discretion), you can spend 10 minutes testing and performing system maintenance on those augmentations to regain 1 Resolve Point; this doesn't count as resting to regain Stamina Points.
Cybermedicine is the study of integrating biological and technological material and understanding their interactions.
''Booster:'' You boost a living creature or construct with a nanite-infused substance that causes both living creatures and constructs to heal more efficiently. If that creature would benefit from any effect that restores Hit Points, increase the number of Hit Points restored by 50% or by an amount equal to your key ability score modifier, whichever is lower.
''Inhibitor:'' You deliver a nanite solution to a living creature or construct, interfering with its healing or repair. Whenever the creature would regain Hit Points from an effect, it must succeed at a Fortitude save or regain no Hit Points from the effect. For persistent healing effects like [[regeneration]], the creature must attempt a new saving throw against the inhibitor each round to regain Hit Points, though the inhibitor doesn't suppress such abilities altogether. This is a poison effect and ignores a construct's immunity to poison.
!! Breakthrough
Cybermedicine provides the following breakthrough ability.
''Override Biology:'' As a standard action, you create and deliver a formula packed with nanites that flood a living creature's body, granting it construct-like traits. The target gains the [[no breath]] universal creature ability as well as a +2 enhancement bonus to saving throws against disease, mind-affecting effects, poison, and sleep (unless those effects specifically target constructs).
Made of ultralight materials, this fully cybernetic arm fuses to your spinal column, exoskeleton, or equivalent body structure and functions as a full arm. You can hold an additional hand's worth of equipment. This lets you have more items at the ready, but it doesn't increase the number of attacks you can make in combat. You must have a Strength score of 12 to use a cybernetic arm effectively.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|cybernetic arm, single | 11 | 24,750 | spinal column |
|cybernetic arm, dual | 14 | 70,150 | spinal column |
</div>
Your drone can be improved with one cybernetic or magitech augmentation, selected from only one of the following systems: arm, brain, ears, eyes, hand, legs, or throat. If the augmentation has an item level that is 4 or more levels lower than your ranks in [[Engineering]] (for cybernetics augmentations) or [[Mysticism]] (for magitech augmentations), you can create and install the augmentation yourself at no cost. You can change such self-built augmentations once per day with 1 hour of work. If the augmentation is not 4 or more levels lower than your appropriate skill ranks, you must acquire and pay for the augmentation (including changing or replacing the augmentation) normally.
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* N Large construct (magical, technological)
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft., [[low-light vision]], x-ray vision; ''Perception'' +18
!!! DEFENSE
* ''HP'' 125
* ''EAC'' 19; ''KAC'' 23
* ''Fort'' +7; ''Ref'' +7; ''Will'' +5
* ''Defensive Abilities'' [[integrated weapons]]; ''DR'' 5/adamantine or [[wound]]; ''Immunities'' [[construct immunities]], magic
!!! OFFENSE
* ''Speed'' 40 ft.
* ''Melee'' LFD [[pulse gauntlet]] +19 (3d6+14 B & So; critical [[knockdown]])
* ''Ranged'' corona [[artillery laser]] +15 (2d8+8 F; critical [[burn]] 1d6)
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' berserk, haste circuit
!!! STATISTICS
* ''Str'' +6; ''Dex'' +2; ''Con'' —; ''Int'' —; ''Wis'' +0; ''Cha'' –2
* ''Other Abilities'' comm, [[mindless]], [[unliving]]
* ''Gear'' 2 LFD [[pulse gauntlets]] with 4 batteries (20 charges each), corona [[artillery laser]] with 4 high-capacity batteries (40 charges each)
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary or gang (2–4)
!!! SPECIAL ABILITIES
''Berserk ([[Ex]])'' When a cybernetic golem takes damage that reduces it to half its maximum Hit Points or fewer, and whenever it takes damage while it has half its maximum Hit Points or fewer, it must attempt a DC 15 Will saving throw. On a failure, the golem goes berserk. While berserk, the golem uses its actions to make a full attack or to move and attack. If it can't reach or shoot a creature, it attacks objects. The golem can attempt a DC 15 Will saving throw at the end of each of its turns to end the berserk state. If the golem's creator communicates with the golem to calm it, via comm unit or from within 60 feet, and succeeds at a DC 10 Charisma check, the golem receives a +2 circumstance bonus to this saving throw.
''Comm ([[Ex]])'' A golem can receive wireless communications (and thus commands from its creator) at planetary range.
''Haste Circuit ([[Su]])'' A cybernetic golem can use a swift action to gain the benefit of the //[[haste]]// spell. This effect lasts for 1 round, and then the circuit shuts down and must recharge for 1 round before being activated again. The golem can use its circuit up to 10 rounds per day.
''Magic Immunity ([[Ex]])'' A golem is immune to any spell or spell-like ability that allows [[spell resistance]], unless the spell specifically lists constructs in its Targets entry. In addition, certain spells and effects function differently against the golem as follows:
@@.special
* The golem can be affected by //[[discharge]]// or //[[greater discharge]]// but has a unique reaction to the spells. If the golem fails a saving throw against either spell, it becomes [[confused]] for 1d4 rounds instead of suffering the spell's normal effect. The golem can attempt a Fortitude save at the end of each of its turns, ending the condition on a success.
* Magical effects that deal cold damage slow (as the //[[slow]]// spell) the golem for 3 rounds (no save). If the golem has a haste circuit and it is active, this effect counters the haste circuit but has no other effect.
* The golem automatically fails saving throws against weapons and magical effects that deal electricity damage. However, such an effect merely breaks any slow effect on the golem and heals it for 1 Hit Point per 3 damage the effect would have dealt. Any damage that exceeds the golem's maximum Hit Points is stored as charges for its weapons, at a rate of 1 charge per Hit Point the golem would have gained. Any additional damage is ignored.
@@
''X-Ray Vision ([[Ex]])'' As a move action, the golem can grant itself x-ray vision, which functions like an [[x-ray visor]]
</div>
A cybernetic creature has been augmented by technological implants (although the same simple template graft can be used to represent creatures augmented by biotech).
* ''CR:'' 1/2+
* ''Armor:'' If the creature is CR 3–7, add one armor upgrade with an item level equal to or less than the creature's CR. If it is CR 8+, add two armor upgrades, each with an item level equal to or less than the creature's CR.
* ''Weapon:'' Add a ranged weapon of a level no greater than the creature's CR + 1; this weapon can't be disarmed. A creature with the combatant array should get a longarm, and a creature with the expert or spellcaster array should get a small arm. Add the creature's CR to damage dealt with its weapon. The ammunition of such weapons is recovered once per day after the creature rests for 8 hours.
<<list-links '[tag[Cybernetics]]' class:index >>
Cycles are vehicles that the pilot (and sometimes a passenger) ride directly on top of, and they can have a wide variety of uses.
* ''Passengers:'' 1 (can't be increased by other grafts);
* ''Adjustments:'' Decrease price by 10%, decrease EAC and KAC by 2, decrease Hit Points by 10%
* ''Cover:'' None
* ''Speed (Full):'' speed × 20
* ''Modifiers:'' +2 [[Piloting]], –1 attack (–3 at full speed)
While many inexperienced solarians master their powers through trial and error, the traditional method to gain knowledge of the Cycle is to be taught. Cycle scholars share their insights with initiates, demonstrating advanced solarian techniques and bringing out the best in their pupils. Some Cycle scholars teach from a sense of duty or obligation, while others embrace the opportunity to induct a new generation of solarians into their ancient traditions. While many Cycle scholars prefer a relatively sedentary life teaching at a cosmonastery—or even leading one—others prefer to take an apprentice and travel the galaxy, teaching through heroic example.
The Cycle scholar grants alternate class features at 6th, 12th, and 18th level.
!! Cycle Instruction (6th)
You can teach others the ways of the Cycle. Select one 2nd-level stellar revelation; you can't use this revelation yourself, and it isn't counted when determining if you have disproportionate revelations, but you are considered to have it for the purpose of this ability.
Once per day, you can spend 10 minutes instructing a creature in the ways of the Cycle. You can combine this with a 10-minute rest to regain Stamina Points. This is a sense-dependent and language-dependent effect. The creature gains the ability to use one of your 2nd-level stellar revelations for 1 round, using it as if the creature were attuned, but not fully attuned. If you have more than one applicable revelation from which to choose, the creature you instruct can choose the revelation when it uses the revelation.
When you reach 10th level, the creature you instruct can choose to use any one of your stellar revelations up to 6th level. When you reach 14th level, it can choose to use any one of your stellar revelations up to 10th level. When you reach 16th level, it can choose to use any one of your stellar revelations up to 14th level. Each time you gain a level, you can change the stellar revelation you have selected for this ability, selecting any stellar revelation of a level you grant access to.
!! Encourage Students (12th)
You bolster the courage of those around you. You can take a standard action to grant a number of other creatures equal to your Charisma modifier and within 30 feet of you temporary HP equal to your character level; these temporary HP last for 1 minute. Affected creatures are also immune to fear for as long as they have temporary HP from this power, plus 1 additional round. After using this ability, you must rest for 10 minutes to regain Stamina Points before you can use it again. This a sense-dependent and language-dependent effect.
!! Thoughts Into Action (18th)
You can instantly mobilize those around you, leading them into action. Once per day, you can take a standard action to grant a number of other creatures equal to your Charisma modifier and within 30 feet of you an additional move action. An affected creature can use this move action during its next turn, can use the extra move action between other actions, and can even use it before or after a full action. The creature can't also benefit from any other abilities that grant additional move actions, such as the [[hurry]] envoy improvisation. This a sense-dependent and language-dependent effect.
<div class="statblock">
* ''CR'' 4; ''XP'' 1,200
* CG Small outsider (chaotic, good)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +10
!!! DEFENSE
* ''HP'' 43
* ''EAC'' 15; ''KAC'' 16
* ''Fort'' +5; ''Ref'' +5; ''Will'' +9
!!! OFFENSE
* ''Speed'' fly 15 ft. ([[Su]], perfect)
* ''Spell-like Abilities'' (CL 4th)
** 2nd (3/day)—//[[song of the cosmos]]// (DC 17), //[[zone of truth]]// (DC 17)
** 1st (6/day)—//[[charm person]]// (DC 16), //[[illusory starfield]]// (DC 16), //[[mind link]]//
** At will—//[[daze]]// (DC 15), //[[detect affliction]]//
!!! STATISTICS
* ''Str'' +1; ''Dex'' +5; ''Con'' +0; ''Int'' +1; ''Wis'' +2; ''Cha'' +3
* ''Skills'' [[Acrobatics]] +10, [[Diplomacy]] +15, [[Mysticism]] +10, [[Survival]] +10
* ''Languages'' Common
* ''Other Abilities'' cyclical forms
!!! ECOLOGY
* ''Environment'' any (Cynosure)
* ''Organization'' solitary, pair, or constellation (3–12)
!!! SPECIAL ABILITIES
''Cyclical Forms ([[Su]])'' A cynogerm has three distinct forms: a seedling, a blossoming flower, and a butterfly. It constantly cycles through these forms, and can take a move action to adopt any one of them. Make the following adjustments based on the cynogerm’s current form.
@@.special
* ''Seedling:'' A cynogerm in seedling form can fling motes of pollen imbued with potent psychic energy. This is an attack with a range of 30 feet and an attack modifier of +9 inflicting 1d4+4 damage; this is a mind-affecting effect.
* ''Flower:'' Once a day as a full action, a cynogerm in flower form can shake itself and throw off pollen that causes creatures within a 30-foot-radius burst to fall asleep and slip into peaceful dreams for 1d6 minutes (DC 15 Will save negates). This is a mind-affecting effect.
* ''Butterfly Form:'' A cynogerm in butterfly form grows wings and gains a supernatural fly speed of 60 feet (perfect), [[spaceflight]] (Mysticism), and [[void adaptation]].
@@
</div>
Flocks of cynogerms, minor heralds of Desna, flit throughout Cynosure and carry messages into the wider cosmos at the command of the goddess of dreams. These extraplanar messengers scatter like dandelion seeds in the wind to take root in strange locales, where they seed messages that bloom in mortal hearts, inspiring them to greatness or calling them to Cynosure.
Cynogerms begin their lives as seeds planted in vast gardens in Cynosure, where they’re tended by azatas and other good outsiders loyal to Desna. They graduate from their gardens once their infancy ends and they’re strong enough to travel the stars on their own. In keeping with their origins, cynogerms constantly cycle through their three forms, which they can also adopt at will. Their appearance slowly morphs between a dandelion-like seed, a vivid flowering plant, and a colorful butterfly with a wingspan as large as an eagle’s.
Most cynogerms don’t reveal their true names to strangers, but those lucky enough to become acquainted with one might be entrusted with such information. Cynogerms choose their own names, combining colors and musical terminology and often incorporating imagery from dreams. Cynogerm names range from “Crimson Coda” to more elaborate affairs such as “Flight Over Cyan Seas.”
As your connection to your nanites grows, the swarm's ability to break down and reassemble your body strengthens, gradually making you more machine than mortal. You receive a +1 circumstance bonus to saving throws against bleed, disease, poison, and sleep effects. In addition, you gain a 10% chance to treat a critical hit against you as a normal hit; it deals normal damage and doesn't apply any critical hit effect. This percentage doesn't stack with similar effects.
At 10th level, the circumstance bonus to saving throws increases to +2, and the chance to treat a critical hit against you as a normal hit increases to 20%. At 16th level, the circumstance bonus to saving throws increases to +3, and the fortification percentage increases to 30%.
Disembarkment suits, or d-suits, are designed for spacefarers who expect to leave their ship and visit a planet's surface. Most d-suits are jumpsuits or flight suits worn under reinforced breeches, heavy boots, and a thick jacket. A helmet or rebreather and a utility belt with an attached holster complete the outfit.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br/>Bonus | KAC<br/>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br/>Slots | Bulk |h
|d-suit I | 5 | 2,980 | +5 | +6 | +5 | — | — | 1 | L |
|d-suit II | 7 | 6,900 | +8 | +9 | +5 | — | — | 2 | L |
|d-suit III | 9 | 13,300 | +11 | +12 | +6 | — | — | 3 | L |
|d-suit IV | 13 | 45,800 | +16 | +17 | +6 | — | — | 4 | L |
|d-suit V | 17 | 244,300 | +20 | +21 | +7 | — | — | 5 | L |
</div>
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' conjuration (summoning)
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Area'' 20-ft.-radius spread
* ''Targets'' all creatures in the cloud
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Will negates
* ''Spell Resistance'' no
</div>
You summon a concentrated cloud of Daegoxian spores, which renders living creatures docile and agreeable. Any creature that enters the cloud or begins its turn within the cloud must succeed at a Will save or be [[fascinated]] for 1d4 rounds. A creature that succeeds at this save is immune to the effects of //Daegoxian spore cloud// for 24 hours.
Daemons are fiends, or evil outsiders, native to Abaddon.
* ''Traits:''
** [[immunity]] to acid, death effects, disease, and poison
** [[resistance]] 5 to cold, electricity, and fire (CR 3+; increases to 10 at CR 7, 20 at CR 11, 30 at CR 15)
** [[summon allies]]
** [[telepathy]]
Summoned daemons come from Abaddon to spread disaster and ruin with the desire to extinguish all mortal life and feast on the resulting soul energy. Their monstrous forms are covered in vicious-looking spikes, and they have long, lean limbs that bend at odd angles.
* ''Type:'' outsider (daemon, evil, extraplanar)
* ''Alignment:'' change to NE
* ''Traits:''
** base speed increases to 30 ft.
** [[immunity]] to acid, death effects, disease, and poison
** [[resistance]] equal to creature's CR to cold, electricity, and fire
** if base stat block has [[DR]], change to DR/good
* ''Skills:'' add [[Intimidate]] and [[Mysticism]]
* ''Languages:'' Abyssal, Common, and Infernal
* ''Attack:'' the summoned creature gains a spike ranged attack, which has a range of 30 ft.
<div class="table-wrapper">
| CR | Attack Adjustment |h
| 1/3 |add ''Ranged'' spike +2 (1d4 P) |
| 1 |add ''Ranged'' spike +6 (1d6+1 P) |
| 3 |add ''Ranged'' spike +9 (1d6+3 P) |
| 5 |add ''Ranged'' spike +12 (1d8+5 P) |
| 7 |add ''Ranged'' spike +15 (2d8+7 P) |
| 11 |add ''Ranged'' spike +21 (3d10+11 P) |
</div>
Originating from the desolate plane of Abaddon, daemons strive to end all life in existence—even destroying themselves after snuffing out or consuming every other soul. A daemon's favorite method of killing often shapes their form and abilities. Traditional daemons might embrace more conventional means of inflicting death, though newer daemons have adapted to the galaxy's evolving technology.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
The thinness and lightness of daggers make them easy to carry or conceal. Ultrathin daggers have sharp, double-edged blades. Zero-edge daggers have blades—crafted with quantum technology—that are so fine, their edges blur. The blade of a molecular rift dagger looks translucent, as if it's made of glass, and its vibrating particles allow the dagger to slice through almost any substance. Most daggers are available with fixed, folding, or retractable blades.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|dagger, ultrathin | 12 | 32,800 | 4d4 S | — | L |[[analog]], [[operative]], [[thrown]] (20 ft.) |
|dagger, zero-edge | 14 | 64,400 | 6d4 S | — | L |[[analog]], [[operative]], [[thrown]] (20 ft.) |
|dagger, molecular rift | 17 | 275,000 | 10d4 S | — | L |[[analog]], [[operative]], [[thrown]] (20 ft.) |
</div>
If your attack hits, you deal damage. Damage first reduces a target's current Stamina Points and then the target's Hit Points (see [[Injury and Death]]). In most cases, the type of weapon used determines the amount of damage you deal, though specialization in groups of similar weapons (see the [[Weapon Specialization]] feat) and other abilities can increase that amount. Some weapons and abilities may add further effects in addition to dealing damage.
!! Strength Modifier
When you hit with a melee or thrown ranged weapon, add your Strength modifier to your damage roll's result. However, do not add your Strength modifier to the damage of your grenades and nonthrown ranged attacks.
!! Multiplying Damage
Sometimes you multiply your damage by some factor, such as on a [[critical hit]]. In this case, you do not literally multiply your damage roll result by that factor. Instead, you roll the damage (adding all modifiers) the number of times specified and total the results. If you multiply damage more than once, each multiplier applies to the original, unmultiplied damage. Thus, doubling damage twice is equivalent to rolling the damage (adding all modifiers) three times—once for the original damage and once for each doubling.
!! Minimum Damage
If penalties reduce a damage result to less than 1, a hit still deals 1 [[nonlethal damage]].
!! Ability Damage
Certain creatures and magical effects can cause temporary or permanent [[ability damage]], which lowers a particular ability score and can reduce its modifier, therefore affecting a range of statistics and rolls..
!! Stamina and Hit Points
Whenever you take damage, it first reduces your Stamina Points (SP). Any damage you take beyond your Stamina Points reduces your Hit Points (HP). When your Hit Point total reaches 0, you fall unconscious and are [[dying]], and you lose 1 Resolve Point (RP) each round unless you are stabilized. When your Resolve Points reach 0 but you would lose additional Resolve Points from dying or for any other reason, you're dead. For example, if you have 6 Stamina Points and take 9 damage, your Stamina Points are reduced to 0, you lose 3 Hit Points, and all subsequent damage reduces your HP until you regain Stamina Points. See [[Injury and Death]] for more information.
When a gunner hits with an attack, she rolls the damage dealt by the weapon she is using and determines which quadrant of the targeted starship she hits. A starship's shield quadrants are the same as its firing arcs. Damage is first applied to any shields the target starship has in the quadrant hit by the attack, depleting a number of Shield Points equal to the amount of damage dealt. If that quadrant's Shield Points reach 0, that shield is entirely depleted and any excess damage is applied to the target starship's Hull Points. If the ship doesn't have shields or if its shields in that quadrant have already been depleted, apply all damage directly to the target's Hull Points.
If a starship has a Damage Threshold, any attack that would deal damage to its Hull Points equal to or less than this Damage Threshold fails to damage the ship's Hull Points. If the damage is greater than the Damage Threshold, the full amount of damage is dealt to the ship's Hull Points.
If a ship is reduced to 0 or fewer Hull Points, it is disabled and it floats in its current direction of travel at a rate of half its speed until it is repaired, rescued, or destroyed. Crew members aboard such ships are not in immediate danger unless their life-support system is wrecked, but they might eventually die from starvation and thirst if they have no way to repair the ship.
If a ship ever takes damage that exceeds twice its Hull Points, it is destroyed and can't be repaired. All systems stop functioning, and the hull is compromised. The crew might initially survive, but without protection, they won't live very long.
!! Shooting Starships
Starship weapons and regular PC-level weapons work on different scales and aren't meant to interact with each other. If characters choose to shoot at a starship with their laser rifles (or cast a spell on it) while it is on the ground, the GM should treat the starship as an object (a particularly massive one, at that). At the GM's discretion, if starship weapons are ever brought to bear against buildings or people, they deal Hit Point damage equal to 10 × their listed amount of damage. However, starship weapons are never precise enough to target a single individual (or even small group) and can, if the GM decides, be simulated as deadly hazards instead of weapon attacks.
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
Some creatures have the ability to instantly heal damage from attacks or ignore blows altogether; this is referred to as the damage reduction special ability. Damage reduction (DR) applies to kinetic damage—any bludgeoning, piercing, or slashing damage—that a character takes, regardless of that damage's source. It does not apply against damage with no damage type or any other damage type, including acid, cold, electricity, fire, or sonic, though these can be mitigated by [[energy resistance]].
The numerical part of a creature's damage reduction is the amount of bludgeoning, piercing, and slashing damage the creature ignores from each attack. Weapons made from a certain material, magic weapons (any weapon with a weapon fusion), and weapons imbued with a specific alignment often can overcome this reduction. This information is separated from the damage reduction number by a slash. For example, DR 5/cold iron means that you take 5 fewer damage from weapons that are not made from cold iron, DR 5/magic means you take 5 fewer damage from weapons that are not magic, and so on. If a dash follows the slash ("DR 5/—"), then the damage reduction is effective against bludgeoning, piercing, or slashing damage from any weapon, though some attacks have their own ability to overcome DR. Ammunition fired from a projectile weapon with a magic fusion or alignment is treated as a magic weapon or having the listed alignment for the purpose of overcoming damage reduction.
Sometimes, multiple types of weapon materials or alignments are indicated after the value of DR, indicating that the damage reduction can be overcome in multiple ways or requires a specific combination of effects to be overcome. For example, DR 5/lawful or magic means any weapon that is of a lawful alignment or that is magic can overcome the damage reduction. In contrast, DR 5/lawful //and// magic means only weapons that are both of a lawful alignment and magic overcome the damage reduction.
Whenever damage reduction completely negates the damage from an attack, it also negates most special effects that accompany the attack, such as an injury-based disease, an operative's [[debilitating trick]], and poison delivered via an injury. Damage reduction does not negate ability damage, ability drain, energy damage dealt as part of an attack, or negative levels, nor does it affect poisons or diseases delivered by contact, ingestion, or inhalation. Attacks that deal no damage because of the target's damage reduction do not disrupt spells.
If you have damage reduction from more than one source, the two forms of damage reduction do not stack unless the sources granting the damage reduction specifically note otherwise. Instead, you get the benefit of the best damage reduction in a given situation. Rarely, an effect specifies that it increases a creature's existing damage reduction.
Sometimes damage reduction represents instant healing, while in other cases it reflects the creature's tough hide or body. In either case, you can see that a conventional attack hasn't been effective.
//Format:// ''DR'' 10/magic.
The fleet's thick armor reduces incoming damage by 1 per damage die rolled.
<div class= "table-wrapper">
|Ability | BP Cost | Fleet Type |h
|damage threshold | 3 | [[capital|Capital-Class Fleet]] |
</div>
Some areas of space are actively damaging to starships. These damaging zones can represent hazards such as electrically charged nebulae, hull-eating bacteria, or the chaotic corona near the surface of a star. Depending on the nature of the damaging zone, it might encompass part or all of the combat grid, in a variety of shapes and sizes.
At the end of each round of starship combat, all starships in a damaging zone take damage from the hazard, distributed evenly across all quadrants. As a crew action during the helm phase, a science officer can align the starship's shields to specifically protect against the active hazard (DC = 10 + 1-1/2 × the starship's tier), negating any damage to shielded quadrants; quadrants with depleted shields can't be protected in this way. In general, damaging zones should deal at most roughly 1d6 damage per tier of the PCs' starship each round.
''Hull-Eating Bacteria:'' While several massive species have adapted to the void of space, bacteria and other microparasites have also adapted to interstellar life by feeding off one of the most readily available substances: starship hulls. Infestations can last for decades as the tiny creatures feed on the remnants of derelict ships and debris fields. In areas with hull-eating bacteria and similar threats, unshielded quadrants of a starship's hull each take between 1d6 and 7d6 damage per round, ignoring DT. Once a quadrant of a ship has been exposed, it continues to take damage each round at the end of the engineering phase, even if shields are later restored to that quadrant. As a crew action during the engineering phase, a starship's engineer can vent plasma, superheat the hull, or perform a similar action to destroy the infestation (DC = 10 + 1-1/2 × the starship's tier).
''Nebula:'' This large and diffuse area of gas is generally not hazardous to starships, but depending on the exact nature of the nebula, it can cause any number of adverse effects. Represent a nebula with 10–20 contiguous hexes. These hexes might conceal a ship, forcing gunners to use unreliable sensor information to target a starship inside the nebula, which gives attacks against ships in the nebula a 20% miss chance. Alternatively, corrosive gases might eat away at the starship (as hull-eating bacteria. Or electrical storms may have erupted inside the nebula after being exposed to the technology of a starship, giving the nebula an attack each round against any starships inside (as solar flare).
''Proton Storm:'' Stars can emit streams of high-intensity protons capable of ripping starships apart. To represent a proton storm, draw multiple parallel lines throughout the combat grid, 5 to 10 hexes long and 3 to 5 hexes apart. Starships can fly through these marked areas, and the lines don't block starship attacks, though tracking weapons that would fly through a proton storm are immediately destroyed. However, the storms represent significant danger: the protons have such high energy that they bypass starship shields. Each time a starship flies through or ends its movement in a marked hex, it takes damage directly to its Hull Points equal to 1d6 + an additional 1d6 for every 2 tiers of the starship.
''Star Corona:'' Flying near a star without specific protection is never a good idea. If unprotected, a starship can take between 1d6 and 20d6 damage each round from the heat given off by a star's corona, depending on the intensity of the star and the distance to the star's surface. Some stars also discharge radiation that bypasses normal defenses and can affect the crew on board (see [[Radiation|Radiation (space hazard)]]).
The people known throughout the galaxy as damais are survivors of a shattered planet who are at once hardy yet fragile, savvy yet foolish, prescient yet solipsistic. Their planet is ancient even on the scale of the vast universe, and yet for damais, modern history is merely 200 years old.
Life on Daimalko, their dry, rocky planet in Near Space, transformed when an event called the Awakening wracked the land with earthquakes, evaporated the world's oceans, and withered its greenery. Worse, the cataclysm awakened the terrible colossi at the heart of the people's legends. Some of these monstrosities were [[kyokors]], though many were other, equally horrific beasts, and all rose from their slumber beneath the seabed to destroy most of the planet's inhabitants in short order.
Prior to this disaster, the people of Daimalko were split between two advanced, warring societies: the holy Queendom of Ykarth, which claimed a divine mandate from the empyreal lord Duellona, and the psychic Confederation of Volkaria. But the Awakening drove most of the surviving damais underground, regardless of their allegiance, where they huddled in caverns they came to collectively call the Refuge. Nearly 150 years passed as the remaining damais and their descendants grappled with the cultural trauma of the Awakening. Originally a fragile people threaded with natural ribbons of psychic energy, empathic magic, or braids of both, damais adapted into the hardy and resourceful people they are today.
About 50 years ago, a wise leader in one of the deepest and largest pockets of the Refuge resolved to reunite damais for good. Reirali Kokolu sought to build solidarity among the refugees despite the fact that the colossi still rampaged on the surface above. At great personal risk, she traversed the lightless caverns to make contact with other refugee settlements, inviting their leaders to travel with her until they'd contacted each surviving damai and formulated a plan to keep them connected to one another, even if only spiritually.
Near the end of the leaders' journey, they stumbled upon a curious cache of rune-scribed orbs. Though most of the leaders thought the objects mere baubles, useless remnants of the planet's lost civilizations, Reirali Kokolu felt compelled to commune with the orbs. At first, touching them conveyed blasts of overwhelming emotion, fits of magical hubris, unnatural physical strength, and the darkest dread. However, after studying them at length—and convincing the other damai leaders to do the same—Kokolu found that the orbs, when bonded to a user, subtly conveyed vital information about the marauding colossi, such as their physical locations at any given time. Users of these orbs even seemed able to subtly influence the beasts' behavior, though doing so caused tremendous stress, both mentally and physically. Communing with the orbs also fused the leaders to each other emotionally. As they learned to wield the orbs' power, the leaders came to realize that with just a little concentration, they could inhabit each others' minds and hearts. These damai leaders became the first Guardians.
Invigorated with the powers they'd unlocked, the Guardians returned to their respective settlements in the Refuge. Some died mysteriously along the way, and to this day it is unclear why, despite numerous attempts to discover the fates of these Guardians and any motive or meaning behind their deaths. However, the rest returned to their enclaves. While some used the orbs merely to fortify their settlements, terrified of the power of the colossi they felt through their artifacts, other Guardians began ushering small colonies of damais aboveground, carefully using their bonded orbs to shield their people from harm. Now, the underground settlements have approached a stability that is just shy of thriving, though the aboveground colonies still struggle, thanks both to their youth and to colossi attacks that their Guardians have failed to thwart.
Daimalkan Guardians command great power, found both within them and through their orbs, but they are no less mortal than their kin, who age much as humans do. Thus, each Guardian carefully chooses and trains her successor over about a dozen years, using her wits, her wisdom, and her bonded orb, which she transfers to her charge when the time is right.
Though some whisper that the magic flowing through the leaders is somehow tied to the force that sparked the Awakening, trust in the Guardians is nearly universal in damai settlements. Despite their different approaches to survival, the Guardians and everyday damais recognize how deeply tied to each other they are—or without the bonds of their people, damais would have nothing except the colossi that slaver for their end.
The average damai has gray skin, stands 6 feet tall, and weighs around 175 pounds.
!! Racial Traits
* ''Ability Adjustments:'' +2 Cha, +2 Dex, –2 Wis
* ''Hit Points:'' 2
* ''Size and Type:'' Damais are Medium humanoids with the damai subtype.
* ''Low-Light Vision:'' Damais have [[low-light vision]].
* ''Scrappy:'' Generations of living together in underground shelters and under the constant threat of enormous creatures have taught damais to work together against all odds. Once per day, as long as an ally is within 10 feet, a damai can reroll a failed attack roll or saving throw.
* ''Survivor:'' Damais have ingrained survivalist senses and gain a +2 racial bonus to [[Stealth]] and [[Survival]] checks. This bonus increases to +3 w when a damai is underground.
!!! Alternate Ability Adjustments
* ''Cerebral:'' Though many damais rely on strong personality to pursue their fortunes, some find themselves naturally more capable in soaking up knowledge, and they apply it to practical use in their daily lives. Damai legend claims that these cerebral, frail members of their species, once far more numerous, were responsible for the magnificent advancements in science, technology, and magic that far predated Daimalko's Awakening. A cerebral damai's ability adjustments are +4 Intelligence, –2 Constitution.
!!! Alternate Racial Traits
* ''Brazen Bravado:'' Many damais rely on their incredible force of personality and in-the-moment ingenuity to get themselves out of scrapes, rather than on the survival skills common among their fellows. Damais with this racial trait gain a +2 racial bonus to [[Bluff]] and [[Sense Motive]] checks. In addition, when they aid another creature using one of these skills, the aid another bonus they provide increases to +3. This replaces survivor.
* ''Empathic Imprint:'' Some damais are born with an innate connection to the feelings and moods of those around them, and they can focus this empathy to glean insights that others normally could not. Once per day, a damai with this racial trait can cast //[[mindlink]]// as a spell-like ability. The caster level for this effect equals the damai's level. This replaces survivor.
<div class="statblock">
* ''CR'' 6; ''XP'' 2,400
* NE Large aberration
* ''Init'' +0; ''Senses'' [[blindsense]] (vibration) 60 ft., [[darkvision]] 60 ft., sense detection (planetary); ''Perception'' +13
* ''Aura'' undetectable radiation (medium, 20 ft., DC 14)
!!! DEFENSE
* ''HP'' 90
* ''EAC'' 18; ''KAC'' 20
* ''Fort'' +8; ''Ref'' +8; ''Will'' +7
* ''Defensive Abilities'' [[void adaptation]]; ''Immunities'' radiation
''Weaknesses'' [[vulnerable]] to acid
!!! OFFENSE
* ''Speed'' 40 ft., burrow 30 ft., climb 40 ft.
* ''Melee'' jaws +16 (1d8+11 P)
* ''Ranged'' superheated spine +13 (1d10+6 P & F; critical [[burn]] 1d6)
* ''Space'' 10 ft.; ''Reach'' 5 ft.
* ''Spell-Like Abilities'' (CL 6th)
** Constant—//[[nondetection]]// (self only)
!!! STATISTICS
* ''Str'' +5; ''Dex'' +0; ''Con'' +3; ''Int'' –4; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Athletics]] +18 (+26 to climb), [[Stealth]] +13, [[Survival]] +13
* ''Other Abilities'' undetectable radiation
!!! ECOLOGY
* ''Environment'' any underground or vacuum (Diaspora)
* ''Organization'' solitary, pair, or infestation (3–12)
!!! SPECIAL ABILITIES
''Sense Detection ([[Su]])'' A Damiaran maggot can innately sense distance and direction to any creature in planetary range that has identified it or detected it, or any of its kind, by any means, including via magic, technology, or any senses, natural or otherwise.
''Superheated Spine ([[Ex]])'' As a ranged attack action, a Damiaran maggot can shoot a superheated spine from its back. This projectile has a range increment of 30 feet. A Damiaran maggot has a maximum of 16 spines it can shoot in this way and regrows 1d4 spines per day.
''Undetectable Radiation ([[Su]])'' A Damiaran maggot is radioactive, and the radiation it emits is also under the effects of its constant //[[nondetection]]// spell-like ability. For purposes of determining the DC of caster-level checks and [[Perception]] checks to detect the radiation, it is considered part of the creature.
</div>
Damiaran maggots are large, worm-like creatures that once lived deep beneath the surface of Damiar, one of two planets that collided and formed the Diaspora. Now, they infest countless planetoids across the asteroid field, making an already dangerous environment that much more so. Extremely territorial, they viciously compete with all other life-forms they meet, leaving any given celestial body only when it becomes clear they’re outmatched.
Damiaran maggots have a supernatural ability to sense when anyone nearby has detected them—and where those observers are—making them nearly impossible to track down when they don’t want to be found. Their predators are therefore scarce. The only creatures Damiaran maggots immediately flee from are surnochs, which possess an instinct that drives them to seek out and devour any Damiaran maggots they encounter.
More than one hapless explorer has mistaken a Damiaran maggot’s vermin-like appearance for a larger variety of asteroid louse. To canny observers, the superheated metal spines that grow along its back set it apart from such vermin. All attempts to study Damiaran maggots in depth have failed, as the creatures either devour or evade most researchers who try to observe them. However, xenobiologists have determined that a Damiaran maggot is the larval stage of some bigger, more intelligent creature, though no known record exists of what that creature might be, how long it takes to mature, or what role it once played in Damiar’s ecosystem.
This arthropod burrows its many tiny legs into a host's flesh to sip on various hormones, especially epinephrine. These extremely aggressive symbiends bond almost exclusively to predators and are popular among pirates and warlords, as the constant trickle of adrenaline they create results in vicious, fearless soldiers. Bloodshot eyes, bulging veins, and a tendency to froth at the mouth make it easy to identify hosts of Damoritosh's arms.
* ''Required Creature Type:'' aberration, animal, dragon, humanoid, magical beast, or monstrous humanoid
* ''Required Array:'' combatant
* ''Traits:''
** EAC and KAC increase by 1
** +4 morale bonus to [[Athletics]] and [[Intimidate]] checks
** unarmed strikes deal lethal damage, don't count as [[archaic]], and gain a unique weapon specialization that adds 1-1/2 × CR or character level to damage
* ''Abilities:'' frothing rage 1/day
* //Frothing Rage ([[Ex]]):// As a swift action, the creature gains a number of temporary Hit Points equal to the host's CR or character level and gains the ability to make three attacks when making a full attack, though each attack takes a –5 penalty (instead of a –4 penalty). The rage lasts for a number of rounds equal to the host's CR or character level, after which the host is [[fatigued]] for 10 minutes.
* ''Drawbacks:'' –2 penalty to Intelligence-based skill checks, [[Diplomacy]] checks, and Will saving throws against effects with the emotion descriptor
* ''Systems:'' brain, arms (all)
* ''Suggested Ability Score Modifiers:'' Strength, Constitution
You can dampen the entropic release of energy in violent effects. As a reaction when you are in the area of a damaging effect, you can spend 1 Entropy Point to cause it to deal only half damage to all creatures in the area.
At 6th level, if the effect allows a save and you succeed, you can spend 1 additional Entropy Point to allow creatures that successfully save against the effect to take no damage.
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 reaction
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' one spell
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You siphon magical energy from a spell, casting //dampen spell// as a reaction when you observe the triggering spell being cast within range. This spell has no effect on magic items but can affect spells they cast. The spell slot you use to cast //dampen spell// determines the options you have for dampening the targeted spell. To have any effect, you must attempt a dispel check (1d20 + your caster level) with a DC equal to 11 + the spell’s caster level. If you successfully dampen a spell, the caster can cease casting, losing the action used for casting rather than the spell slot. This spell has no effect on artifacts or deities.
''1st:'' If you cast //dampen spell// using a 1st-level slot, choose one of the following effects.
* //Contract:// Halve the spell’s range. If the targeted spell can no longer reach its target, the caster can choose a new target within the new range and continue casting.
* //Exclude:// An area or multitarget spell excludes one target of your choice.
* //Mistarget:// Make the spell go off-target as if it’s a thrown weapon that missed its grid intersection.
* //Shorten:// If the spell’s duration is measured in rounds or minutes, halve that duration (round down, minimum 0 or 5 rounds for 1 minute rounded down). You can’t shorten a spell that has a duration measured in longer increments.
''2nd:'' If you cast //dampen spell// using a 2nd-level slot, choose one of the following effects.
* //Reduce:// Halve the area or number of targets the spell can affect.
* //Shorten:// If the spell’s duration is measured in hours, halve that duration (round down, minimum 30 minutes for 1 hour rounded down). You can’t shorten a spell that has a duration measured in longer increments.
* //Weaken:// Halve the spell’s damage or healing done.
On a critical hit, a weapon with the //dampening// fusion can suppress any vibration‑based [[blindsense]] the target has for 1d4 rounds. The target can negate this effect with a successful Fortitude save. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the //dampening// effect.
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one creature
* ''Duration'' 1 minute/level
* ''Saving Throw'' Will (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
The target becomes encased in a field that dampens sounds and vibrations. For the duration of the spell, the target has total concealment against creatures whose only sense is [[blindsense]] (sound) or blindsense (vibration) and can attempt [[Stealth]] checks to hide from creatures whose only sense is [[blindsight]] (sound) or blindsight (vibration) with a +10 circumstance bonus to their checks. All sounds the target makes intentionally are muffled, increasing the DC of [[Perception]] checks to hear them by 5.
<div class="statblock">
* <<levels>>
* ''School'' evocation
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Effect'' up to four lights
* ''Duration'' 1 minute (D)
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You create up to four lights that resemble small headlights or flashlights. The //dancing lights// must stay within a 10-foot-radius area in relation to each other but otherwise move as you desire: forward or back, up or down, straight or turning corners, or the like. The lights can move up to 100 feet per round. A light winks out if the distance between you and it exceeds the spell's range.
You can have only one dancing lights spell active at a time. If you cast this spell while another casting is still in effect, the previous casting is dispelled.
You specialize in missions requiring courage and athleticism.
* ''Associated Skills:'' [[Acrobatics]] and [[Athletics]]. You can attempt an Acrobatics check to make a [[trick attack]].
* ''Specialization Exploit:'' [[versatile movement]]
* ''Terrain Attack ([[Ex]]):'' At 11th level, when you and a foe are both balancing, climbing, flying, or swimming, you automatically succeed at any [[Bluff]] check required to make a trick attack against that foe.
When you fail an [[Acrobatics]] or [[Athletics]] check, you can spend 1 Resolve Point to either reroll the check and use the new result or add 5 to your result and use the new value to determine whether you succeed at the check. You can't use this ability on trick attack attempts. Once you've used this ability, you can't use it again until you've taken a 10-minute rest to recover Stamina Points.
When calculating the [[Athletics]] check DC to jump, treat the total distance you’re trying to jump as though it were reduced by an amount equal to half your land speed bonus granted by the [[quick movement]] operative ability. As long as your jump brings you in contact with a solid surface like a wall or large piece of debris, you can spend 1 Resolve Point to immediately jump again from that surface as part of the same move action as though you had a running start; only after resolving this second jump do you fall if not on a surface that can support you.
This //aeon stone// grants you a +2 insight bonus to [[Perception]] and [[Sense Motive]] skill checks.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//dark blue rhomboid// | 10 | 18,000 | — |
</div>
By transforming your own body into dark matter, you briefly cease to interact with physical objects. Once per day when you are attuned or fully attuned, you can activate this power as a swift action to become [[incorporeal]] until the beginning of your next turn.
As a move action, you can draw on the properties of dark matter to increase your density, allowing you to resist physical damage. You gain [[damage reduction]] 1/—. This increases to DR 2/— at 6th level and increases by 1 again every 3 solarian levels thereafter. This benefit lasts for 1 round or until you leave graviton mode.
When you are attuned or fully attuned, your DR from dark matter is equal to half your solarian level.
Your understanding of the secrets of dark matter enables you to generate the mysterious substance. When you're fully graviton-attuned, you can take a standard action to create regions of darkness. You can fill one 5-foot square with darkness for each solarian level you have. This effect lasts 1 round per solarian level; you can take a swift action to end the effect. The darkness must be continuous and unbroken when formed, and the dark matter can't be moved. The darkness blocks all sight, even darkvision, but you can see through it.
Your sensitivity to dark matter allows you to navigate in lightless conditions. You gain [[darkvision]] with a range of 60 feet.
//Darksight goggles// are a magical innovation made to aid vision and counter magical darkness without the telltale signs created by technology, such as ultraviolet lasers. The goggles count as a worn magic item unless you install them in armor, taking up one [[upgrade slot|Armor Upgrades]]. While wearing these goggles, you gain [[low-light vision]] as well as [[darkvision]] with a range of 60 feet. In addition, the darkvision these goggles provide allows you to see in color. If you already have darkvision, //darksight goggles// increase its range by 30 feet.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//darksight goggles// | 4 | 2,100 | L |
</div>
Darkvision is the ability to see with no light source at all, out to a range specified in the creature's description. Darkvision is black and white only (colors cannot be discerned). It does not allow characters to see anything that they could not see otherwise—when a creature has darkvision, invisible objects and creatures are still invisible, and illusions are still visible as what they seem to be. Likewise, darkvision subjects a creature to [[gaze]] attacks normally. The presence of light does not affect darkvision.
//Format:// ''Senses'' darkvision 60 ft.
//Guidelines:// Darkvision has a range of 60 feet for most creatures or 120 feet in exceptional cases.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Range'' touch
* ''Targets'' one creature or camera
* ''Duration'' 1 hour/level
* ''Saving Throw'' Will negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
The target gains the ability to see 60 feet even in total darkness. //Darkvision// is black and white only but otherwise like normal sight.
These replacement eyes allow you to see in total darkness, giving you [[darkvision]] with a range of 60 feet. They operate by sending out low-powered ultraviolet lasers that are then detected by receptors within the capacitors. When your capacitors are in operation, their lasers can be detected by creatures that have darkvision capacitors or can otherwise see ultraviolet light.
Advanced darkvision capacitors have the benefits of a [[wide-spectrum ocular implant]]. Long-range darkvision capacitors function like advanced capacitors but provide a darkvision range of 120 feet.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|darkvision capacitors, standard | 3 | 1,750 | eyes |
|darkvision capacitors, advanced | 8 | 9,000 | eyes |
|darkvision capacitors, long-range | 13 | 48,950 | eyes |
</div>
A //darkwater grenade// contains compressed, altered water molecules like a [[diaspora wyrm]] produces. Its [[explode]] special property produces a 10-foot-radius spread of light-absorbing mist, obscuring most sight and providing total concealment. This grenade works underwater and in a vacuum. A creature that has [[darkvision]] treats the field within 5 feet as if it provides only concealment. Magical light from a source of a higher level or CR than the grenade's negates the effect if the two interact. The mist lingers for 10 minutes, but a light wind or current disperses it in 1 minute, a moderate in 4 rounds, and strong in 1 round.
<div class= "table-wrapper">
|Weapon | Level | Price | Range | Capacity | Bulk |Special |h
|//darkwater grenade// | 6 | 1,400 | 20 ft. | drawn | L |[[explode]] (total concealment, 10 ft.) |
</div>
As a reaction when you are hit by an attack but before the attack's damage is resolved, you can spend 2 RP to teleport up to 10 feet away. This movement does not provoke attacks of opportunity. If your new location would cause you to be an invalid target for the triggering attack (for example, because you are out of range of a melee attack or the attacker no longer has line of effect to you), the attack is treated as a miss.
When Akiton's economy began to collapse in the wake of the thasteron bust, scrappy frontier townspeople were left to cobble together their necessities from whatever they had on hand and defend what resources they had from outside raiders. Dart cannons were created by these inventive souls, who reconfigured their depreciated mining equipment and less critical medical supplies into a weapon to stave off looters and thieves. These wide-barreled cannons fire a barrage of magnetically accelerated darts that contain barbed cores rather than toxins or medicinals. While this prevents the darts from being used to inject substances, the barbs can lodge in a target's body, dealing lasting damage. Dart cannons tend to see use in environments with some level of gravity, as no one wants to deal with the aftermath of a dart cannon's discharge in a zero-g environment. This weapon is available in light, tactical, heavy, advanced, elite, and paragon models.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|dart cannon, light | 2 | 690 | 1d8 P | 120 ft. | [[embed]] 1d6 | 50 darts | 10 | 2 |[[unwieldy]] |
|dart cannon, tactical | 5 | 2,800 | 1d12 P | 130 ft. | [[embed]] 1d8 | 50 darts | 10 | 2 |[[unwieldy]] |
|dart cannon, heavy | 8 | 9,650 | 2d12 P | 140 ft. | [[embed]] 1d8 | 50 darts | 10 | 2 |[[unwieldy]] |
|dart cannon, advanced | 11 | 22,300 | 3d12 P | 150 ft. | [[embed]] 1d10 | 50 darts | 10 | 2 |[[unwieldy]] |
|dart cannon, elite | 15 | 118,000 | 6d12 P | 150 ft. | [[embed]] 2d12 | 50 darts | 5 | 2 |[[unwieldy]] |
|dart cannon, paragon | 19 | 584,000 | 9d12 P | 150 ft. | [[embed]] 3d12 | 50 darts | 5 | 2 |[[unwieldy]] |
</div>
These light metal shafts each have a pointed tip and a reservoir to hold toxins or other appropriate substances that are typically liquid or viscous. While most combatants rely on darts to deliver toxins to enemies, particularly desperate or overworked field medics sometimes employ darts to conveniently deliver antitoxins, healing serums, and other beneficial drugs across a crowded battlefield. In these cases, medics often practice to improve their aim to ensure that this strategy is effective when employed.
<div class="table-wrapper">
|Ammunition | Level | Price | Charges/Cartridges | Bulk |Special |h
|darts | 1 | 20 | 25 | L |— |
</div>
<div class="statblock">
* ''Tier'' 10
* Large heavy freighter
* ''Speed'' 8; ''Maneuverability'' average (turn 2); ''Drift'' 3
* ''AC'' 23; ''TL'' 25
* ''HP'' 160; ''DT'' —; ''CT'' 32
* ''Shields'' medium 140 (forward 40, port 30, starboard 30, aft 40)
* ''Attack (Forward)'' heavy hacksaw arm (10d6; 1 hex), light ship tether (2d6; 1 hex)
* ''Attack (Port)'' light particle beam (3d6; 10 hexes)
* ''Attack (Starboard)'' light particle beam (3d6; 10 hexes)
* ''Attack (Aft)'' vortex mouth mines (7d12; 3 mines)
* ''Power Core'' Pulse Orange (250 PCU); ''Drift Engine'' Signal Major
* ''Systems'' basic medium-range sensors, crew quarters (common), mk 4 armor, mk 6 defenses, mk 2 trinode computer, security (anti-hacking systems, antipersonnel weapon [ifritclass [[blaze rifle]]]); ''Expansion Bays'' [[brig]], [[cargo holds]] (3), [[escape pods]] (2), [[smuggler's compartment]], [[tech workshop]]
* ''Modifiers'' +2 to any three checks per round, +2 [[Computers]] (sensors only)
* ''Complement'' 12 (minimum 6, maximum 20)
!!! CREW
* ''Captain'' [[Bluff]] +24 (10 ranks), [[Diplomacy]] +19 (10 ranks), gunnery +15 (10th level), [[Intimidate]] +19 (10 ranks), [[Piloting]] +19 (10 ranks)
* ''Engineer (1 officer, 3 crew)'' [[Engineering]] +19 (10 ranks)
* ''Gunners (2)'' gunnery +15 (10th level)
* ''Pilot'' [[Piloting]] +19 (10 ranks)
* ''Science Officer (2 officers, 1 crew each)'' [[Computers]] +19 (10 ranks)
</div>
The Griffon's reputation almost always precedes it. Modeled off the antiquated Blue Crow produced by the [[Norikama Syndicate]] to recover battle scrap to recycle into the company's own starship frames, Dashadz Industries modeled the Griffon to vastly expand the Blue Crow's frame and supercharge its recovery tools, most infamously adding a rotating saw as much as 30 feet in diameter for breaking apart hulls and disarticulating weapon arrays. The utilitarian starship resonated less with the Veskarium's military and more with freelance wreckers, and the Griffon—often derisively referred to as the "Vulture"—swiftly became synonymous with ruthless pirates, unscrupulous captains, and hungry crews all too eager to pick over starship carcasses.
In reality, most Griffon crews are simply independent salvage operators surviving in an often-cutthroat business with notoriously high turnover rates. Though the Griffon's storage is substantial, most starships are still too large for one wrecker to haul off on their own; most salvagers call in backup from nearby Griffon owners after finding a huge derelict vessel. In good times, this maintains a healthy professional network, warm camaraderie, and healthy rivalry. But when salvage is lean, many crews are quick to misdirect their competitors, attack them outright, or worst of all, lay mines near viable salvage to disable any other vessels that come to investigate the wreckage. These grim circumstances often see the secondary market flooded with Griffon components, many of them suspiciously looking like they were torn from their former owners with prejudice.
Captains who can consistently turn a profit can sustain a Griffon for decades, and it's traditional to begin decorating the hull after a year of continuous operation. Artists specializing in these particular hull designs often float between crews or frequent stations and contractor union hubs, doing work on commission for crews and captains that have earned their ink. Some ships even pass through the hands of multiple captains with the crew mostly intact, creating a legacy on the hull that can be seen and read by those that know how.
Headquartered in the Veskarium, Dashadz Industries originally focused on heavy warships. However, its stakeholders foresaw the imminent treaty with the Pact Worlds, and began pivoting towards civilian vessels. The company refit its previous fleet, charging exorbitant fees to transform warships into comfortable—albeit heavily armed—transport vehicles. It now also builds smaller ships that, while not meant for warfare, are capable of it, such as [[Griffon salvage vessels|Dashadz Griffon]] that can disassemble a ship just as easily as they cut through space junk.
Early in the transition to its new business model, Dashadz employed skittermanders as cheap labor. However, the company found that these creatures had a very different understanding of safety features, resulting in dangerous surprises for travelers and crews alike. The company has yet to work out all of these bugs but has quashed most of the negative press and now excludes skittermanders from most engineering positions. Instead, Dashadz has turned to pahtra, ijtikri, and other designers to ensure the comfort (and safety) of their guests.
<div class="statblock">
* ''Tier'' 6
* Medium explorer
* ''Speed'' 8; ''Maneuverability'' good (turn 1); ''Drift'' 1
* ''AC'' 21; ''TL'' 21
* ''HP'' 65; ''DT'' —; ''CT'' 13
* ''Shields'' light 80 (forward 20, port 20, starboard 20, aft 20)
* ''Attack (Forward)'' light plasma cannon (2d12; 5 hexes)
* ''Attack (Port)'' light laser cannon (2d4; 5 hexes)
* ''Attack (Starboard)'' garbage ejection system (1d6; 5 hexes)
* ''Attack (Aft)'' mini-nuke mines (5d8; 10 hexes)
* ''Attack (Turret)'' coilgun (4d4; 20 hexes)
* ''Power Core'' Pulse Red (175 PCU); ''Drift Engine'' Signal Basic
* ''Systems'' budget medium-range sensors, crew quarters (common), extra light weapon mount (aft), mk 5 armor, mk 6 defenses, mk 3 duonode computer, security (antipersonnel weapon [advanced [[rail gun]]]); ''Expansion Bays'' [[cargo hold]], [[escape pods]], [[medical bay]], [[passenger seating]]
* ''Modifiers'' +3 to any 2 checks per round, +1 [[Piloting]]
* ''Complement'' 5 (minimum 1, maximum 6)
!!! CREW
* ''Captain'' [[Bluff]] +13 (6 ranks), [[Diplomacy]] +13 (6 ranks), gunnery +11 (6th level), [[Intimidate]] +13 (6 ranks), [[Perception]] +13 (6 ranks), [[Piloting]] +14 (6 ranks)
* ''Engineer'' [[Engineering]] +13 (6 ranks)
* ''Gunner'' gunnery +11 (6th level)
* ''Pilot'' [[Piloting]] +19 (6 ranks)
* ''Science Officer'' [[Computers]] +13 (6 ranks)
</div>
The Dashadz Wayfarer is an attempt to bridge the gap between military and civilian ships within the Veskarium. Based on schematics for a military transport vessel designed prior to the Pact Worlds-Veskarium alliance, this highly mobile craft is primarily utilized for transporting both goods and passengers across short distances. Though the Wayfarer lacks firepower by typical vesk standards, it's been a hit with many solo explorers who prize the ship's defensive capabilities and speed. As one of the first vesk-made vessels in widespread use in the Pact Worlds following the peace, the subsequent seven generations of Wayfarer have become emblematic of "safe" Veskarium ships in the eyes of their former foes. A few enterprising vesk and ijtikri tour guides operate profitable businesses out of their Wayfarers, offering affordable and scenic interplanetary tours of the Veskarium to Pact Worlds sightseers—though these jaunts are notorious for encountering trouble thanks to their pilots' fearless stunts.
The Wayfarer has unique quirks that endear it to enthusiasts while providing skeptics with plenty of ammunition for criticism. Originally a design flaw exacerbated by inconsistent construction, the gen-2 Wayfarer's garbage ejection unit doesn't just eliminate waste; it violently blasts compacted cubes of detritus into space behind the starship. Early on, the company struggled to combat the barrage of jokes about the hair-trigger feature. However, by the third-generation model, Dashadz had embraced the ejection system, acknowledging it in still-popular advertisements that encouraged buyers' mischievous sides—especially because it plays to vesk beliefs that anything can be a weapon.
Hinged, removable bucket seats built into the Wayfarer's expansion bays make the craft ideal for passenger transport, though smugglers sometimes use them to disguise secret compartments. While Dashadz insists the inclusion of makeshift hideaway compartments wasn't intentional, Pact Worlds outlaws often purchase Wayfarers for this feature. Surprisingly, other Veskarium manufacturers have begun to incorporate Dashadz's innovations into their own ship designs.
You gain [[Diversion]] as a bonus feat. If you already have this feat, you gain a different feat that lacks prerequisites. When you use the Diversion feat to allow multiple allies to hide, you take a –3 penalty to your [[Bluff]] check for every ally after the first. You gain a bonus to Bluff checks to create a [[diversion]] equal to any attack roll bonuses you have that specifically apply to resolving [[dirty trick]] combat maneuvers. You must have [[Improved Combat Maneuver]] (dirty trick) to select this vanguard discipline.
You use your charm and technical know-how to gather intelligence on anyone and anything.
''Associated Skills:'' [[Computers]] and [[Diplomacy]]. You can attempt a Diplomacy check with a +4 bonus to make a trick attack by using intel you’ve gathered in advance.
''Specialization Exploit:'' [[Intelligence Network]]
''Brokering Expertise ([[Ex]]):'' At 11th level, you gain the [[fast hack]] and [[well informed]] envoy expertise talents. Any time you would be required to forgo your expertise die to use these talents, you instead forgo your [[operative's edge]] bonus to your Computers or Diplomacy check.
This purplish-black cube, about 4 inches on each side, is based on the data cores of [[protocite speakers]]. It can store information and protect it from punishment and erasure. A data core is tough (AC 11, hardness 35, 55 HP) and can hold as much information as a computer's large secure-data module. The core doesn't require energy, but another computer must be used to write to the drive or read it. Once you write data to the data core, it can only be read or, with a successful DC 19 [[Computers]] or [[Engineering]] check, erased. Erasing data renders that core section unmodifiable, so the core can hold less and less information the more that is erased from it.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|data core | 3 | 1,200 | L |
</div>
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 standard action
* ''Range'' touch
* .''Targets'' one computer or secure data module
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
When you cast this spell, attempt a [[Computers]] or [[Mysticism]] check; you gain access to the data in the computer or any of its secure data modules with a DC to hack equal to or less than the result of your check. You cannot add to, alter, or delete this data, but you remember it perfectly for 2d4 minutes, after which it fades from your mind. The computer does not register your spell as an attempt to access the computer, regardless of the success or failure of your skill check.
A data link enables the rapid exchange of data between squadron ships. When two or more starships in the same squadron have this system and are within 20 hexes of each other, those starships' computers automatically sync. Any starship in this network can calculate its sensors' distance to a target using the distance of the starship in the network closest to the target.
In addition, if a crew member aboard a starship in the network successfully takes the [[scan]] action against an enemy vessel, all vessels in the network automatically receive the information. Any crew member that takes the [[target system]] or [[lock on]] science officer actions can choose to apply the action's effects to a networked starship's attacks, rather than its own. A science officer can also apply the effects of these actions to one or more additional starships by increasing the DC of the [[Computers]] check by 2 per additional starship (e.g. increase the DC by 6 to grant the bonus to four starships in the network).
<div class= "table-wrapper">
|System | PCU | Cost (in BP) |h
|data link | — | 2 |
</div>
Aballonian vessels have a complex communications net, allowing them to share sensor data and tactical plans. A ship must have this system to participate in a data net, and a participating ship can go no further than long range from the closest vessel and remain in the net.
Ships with a data net determine their sensor distance to a target by counting the hexes between the target and any vessel participating in the network. In addition, if any vessel in the data net successfully performs a scan, target system, or lock on action against a target, all vessels in the net share that information and bonus. If the vessel was targeting a system, only the first critical damage is applied to the targeted system. Multiple lock-on bonuses do not stack. These shared bonuses apply even if the ship that performed the initial action is destroyed or disabled.
<div class="table-wrapper">
|System | PCU | Cost (in BP) |h
|data net | 5 | 3 |
</div>
This cybernetic includes a programmable data port that allows you to access different types of computers and digital storage media. Any handheld computer can be inserted directly into the port, while larger systems need to be connected by an adapter cable. Having the system connected directly to your nervous system obviates the need for an interface to access data on a system. Actually operating the system requires you to use the [[Computers]] skill as usual. Some closed systems don't allow data access or require you to do some rewiring to connect with a datajack (usually an [[Engineering]] check).
Advanced datajacks make it easier to process and send information through the datajack. With a high-density datajack, you gain a +1 circumstance bonus to Computer checks when accessing a system via your datajack. An accelerated datajack instead provides a +2 bonus.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|datajack, standard | 2 | 625 | brain |
|datajack, high-density | 5 | 2,600 | brain |
|datajack, accelerated | 8 | 8,525 | brain |
</div>
Datapads are among the most common handheld computers and are ubiquitous in homes, manufacturing settings, and offices. Datapads require at least one hand to use. Nearly all datapads also incorporate a [[comm unit]] (which includes a microphone and speaker) along with several other functions, such as infosphere connectivity and data storage. Datapads can record simple audio and video (though not in high enough resolution to serve as proof of recorded events in most courts of law), store thousands of hours of recordings, play games, track time and set time-based alarms, act as word processors, and perform numerous other minor data processing and entertainment functions.
All datapads have light bulk, and most are tier 1 computers with the miniaturization upgrade. Tier 2 and higher datapads are generally used only by the wealthy elites or technological sophisticates due to the additional miniaturization technology involved, but they are more powerful than many stationary computers while still fitting comfortably in one hand. Datapads can have computer modules and countermeasures installed at the usual additional costs. For example, most datapads in military or industrial use have the hardened upgrade.
Saboteurs and spies frequently disguise eavesdropping devices or explosives as ordinary datapads, knowing that the datapads' universal use means they won't raise suspicion.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|datapad | 2 | 55 | L | 20 | 1/hour |
</div>
<<section 'Sun-Scrapper Beetle'>>
<<section 'Core-Diver Beetle'>>
Dawn beetles incubate deep within stars before hatching, burrowing up to their star's middle layer, and seeking out debris to disassemble and recycle into brood chambers. The pressure deep within a star compresses and smooths the beetles' silicon-based bodies to an iridescent sheen as they slowly tunnel through the plasma, giving each a uniquely beautiful carapace. With scissor-like mandibles that can punch through steel and spiky claws able to tear through stone, dawn beetles are notorious among mechanics, though Sarenrae's followers revere these beetles for their tenacity.
A dawn beetle's life cycle consists of two principal stages: sun-scrapper early on, then core-diver near the end of its life. True to their name, sun-scrappers industriously scrabble about the middle layers of stars, chasing after any asteroids, derelict wrecks, and other debris that has survived the heat of entering the sun and dissecting and gathering the wreckage into large junk spheres. Sun-scrappers chew and mix the debris with special saliva that vastly raises the material's melting point, allowing these spheres to remain mostly solid despite the heat. Once a beetle's collection becomes too large to carry in its jaws, it instead pushes the mass backward with its hind legs as it searches for more material. These collectors periodically gather in crews for safety or, rarely, to push about a single massive scrap ball. When a sun-scrapper's sphere grows so enormous that it sinks toward the star's core, the beetle digs out a burrow in the sphere that repels heat so capably that terrestrial creatures and treasures can sometimes survive inside.
Of course, proper debris rarely lasts long after colliding with the sun. When stymied in their search, dawn beetles seek out sunspots, angle themselves toward distant stars, and wait for a solar flare. The eventual explosion hurls the beetles through space at tremendous speeds. Some crash into other stars, where they begin their hunt anew. Others reach far-flung planets, where the beetles quickly scavenge the most promising scrap around. Though these intrepid colonists mean living creatures no harm, the beetles not only devastate buildings and vehicles, but they also periodically misidentify and capture live prey who they stubbornly try to incorporate into their junk balls. Core-divers on tectonically active planets can even burrow into their new homes' molten cores and successfully hatch a new generation. Unfortunately, dawn beetles that miss their targets float haplessly and indefinitely, in rare cases colliding with unsuspecting starships and space stations that they adopt as their new homes.
Thanks to their plodding compliance, dawn beetles are rather easy to domesticate. With the proper saddle to dissipate the heat, a rider can direct their mount like a living tractor, pushing objects and demolishing structures. Unscrupulous space pirates even hide within their mounts' scrap spheres while sending out distress signals, waiting for unsuspecting starships to approach before emerging to have their beetles burrow into their prey. Other thrill seekers exploit the beetles' navigation abilities, using planetary gravity to slingshot them toward a distant destination, or ride the beetles bareback through space as part of rodeo competitions.
Some of Sarenrae's faithful consider dawn beetles a sacred animal. Acolytes take them as mounts and follow them through the galaxy, trusting in their patron's power to deliver them safely to other worlds to spread the Dawnflower's healing. They believe those who can ride core-divers bareback without being burned are especially blessed. The Sarenites of the Burning Archipelago maintain small herds of the beetles on the surface, training them to recycle the settlement's waste. However, these beetles periodically become too greedy, and the Archipelago's security must fend off hundreds of the scavengers.
!! Sun-Scrapper Beetle Companions
<div class="statblock">
* ''Levels'' 2–16
* Large vermin
* ''Senses'' [[darkvision]] 60ft
* ''Good Save'' Fort; ''Poor Saves'' Ref, Will
* ''Speed'' 20 ft., burrow 10 ft.
* ''Melee Attack'' bite (P)
* ''Space'' 10 ft. ''Reach'' 5 ft.
* ''Ability Modifiers'' Con, Str
* ''Other Abilities'' [[solar adaptation]], [[void adaptation]]
!!! SPECIAL ABILITIES
''Junk Fortress ([[Ex]])'' A sun-scrapper beetle gains the [[Barricade]] feat. When you're mounted on your sun-scrapper beetle companion, you and your companion benefit equally from the cover granted by Barricade.
''Scrap ([[Ex]])'' A sun-scrapper beetle gains a +4 racial bonus to [[sunder|Sunder (combat maneuver)]] combat maneuvers.
''Solar Slingshot ([[Ex]])'' See [[sun-scrapper beetle]].
Dawn beetles make agreeable companions so long as their keepers periodically remind them not to disassemble nearby vehicles and architecture. A sun-scrapper becomes anxious unless regularly provided junk and a place to store it, but properly bribed, it remains content to live with others for years. Core-divers, on the other hand, rarely remain on the surface long enough to serve as long-term companions.
This warm tea infused with magical spices functions like a [[serum]] and fortifies the mind and spirit when imbibed. Cafes near the Radiant Cathedral are often filled daily with Sarenite clerics enjoying this beverage while talking about the confluence of science and religion. Drinking this brew grants you a +2 insight bonus to [[Diplomacy]], [[Mysticism]], and [[Physical Science]] checks for 1 hour, and during that time you can attempt checks to [[recall knowledge]] with Mysticism and Physical Science untrained.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//Dawnflower melange// | 5 | 475 | — |
</div>
This beautiful ring is made of tiny copper and gold petals that blossom into a flower that cradles a brilliant topaz, and although these rings are most often attributed to Sarenrae’s faith, secular versions also exist. As a standard action while holding or touching a light-producing object with the ringed hand, you can increase the light level produced by the object by one step (to a maximum of bright light) until the end of your next turn. If you spend 1 Resolve Point when activating the ring, you instead increase the light level produced for 1d4 minutes. If you break contact with the light-producing object, this effect ends.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|//Dawnflower ring// | 3 | 1,450 | – |
</div>
<div class="statblock">
* <<levels>>
* ''School'' enchantment (mind-affecting, pain)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one living creature
* ''Duration'' 1 round/level
* ''Saving Throw'' Will half, see text
* ''Spell Resistance'' yes
</div>
You launch an opponent’s mind forward in time, forcing them to experience a day’s events in a moment. The target takes 4d8 damage and becomes [[fatigued]] for the duration, or they become [[exhausted]] for the duration if already fatigued. The target can attempt a Will saving throw to halve the damage dealt by this spell and negate the fatigued condition.
The drow of House Xicton commonly brew //daywalker serum//, which is an oily, effervescent liquid that tastes like water. When you drink this serum, you ignore the effect of your [[light blindness]] weakness for 1 hour.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//serum, daywalker// | 3 | 200 | — |
</div>
<div class="statblock">
* <<levels>>
* ''School'' enchantment (compulsion, mind-affecting)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one humanoid creature of CR 3 or lower
* ''Duration'' 1 round
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
This spell short-circuits the mind of a humanoid creature with a CR of 3 or lower so that it is [[dazed]] (unable to take actions, but taking no penalty to AC). Humanoids of CR 4 or higher are not affected. After a creature has been dazed by this spell, it is immune to it for 1 minute.
<div class="statblock">
* <<levels>>
* ''School'' enchantment (compulsion, mind-affecting)
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' one living creature of CR 5 or lower
</div>
This spell functions like //[[daze]]//, but it can affect any one living creature of any type up to CR 5. Creatures of CR 6 or higher are not affected.
You are unable to act normally. You can take no actions but have no penalty to your AC. A dazed condition typically lasts 1 round.
You are unable to see well because of overstimulation of your eyes. You take a –1 penalty to attack rolls and sight-based [[Perception]] checks.
Dazzlers are a form of crowd control used primarily for civil peacekeeping. While the weapons use lasers to damage and sometimes blind targets, the beams are carefully calibrated to avoid inflicting lethal injury. Built on similar principles to the smaller [[compliance ray]], dazzlers also tend to bear the colors of local law-enforcement groups. However, the similarities end there, as the dazzler is a bulky device usually carried with the help of a shoulder strap, with its business end covered by dozens of glassy bulbs surrounded by a conical shield. Downplaying this somewhat disturbing appearance, dazzler manufacturer ATech holds up the weapons as an important tool for safe peacekeeping and spreads the weapons wherever AbadarCorp is found. Dazzlers come in flash, strobe, and sunspot models.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|dazzler, flash | 3 | 1,420 | 1d10 F | 120 ft. | [[blind]] | 20 charges | 2 | 2 |[[nonlethal]] |
|dazzler, strobe | 8 | 9,420 | 2d12 F | 150 ft. | [[blind]] | 20 charges | 2 | 2 |[[nonlethal]] |
|dazzler, sunspot | 14 | 71,500 | 4d12 F | 150 ft. | [[blind]] | 20 charges | 2 | 2 |[[nonlethal]] |
</div>
<div class="statblock">
* <<levels>>
* ''School'' evocation
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Effect'' popping, distracting flares within a 10-ft.-radius
* ''Duration'' 1 round
* ''Saving Throw'' Fortitude negates
* ''Spell Resistance'' yes
</div>
You evoke fist-sized pockets of existence from multiple realities, creating chemical reactions that result in up to a dozen flares. These flares appear at once, and they do so within a 10-foot-radius spread. You choose the flares' colors, including colorless, and they make popping noises as they flicker in and out of reality. This popping can be as quiet as a human's whisper or as loud as up to 20 humans shouting. You can cause the flares to emit a sulfurous or ozone smell as they pop. These distracting flares impose a –2 penalty on [[Perception]] checks attempted in the area.
If you cast this spell while another casting of //dazzling flares// is still in effect, the previous casting ends.
As a reaction when you spend 2 or more MP, you can perform a flashy display that [[dazzles]] adjacent enemies for 1 round (Reflex negates). If you have spent 4 or more MP since the end of your last turn when you activate this adaptation, you can cause one of the dazzled creatures to instead be [[blinded]] for 1 round. Once you use this adaptation you can’t do so again until you have rested 10 minutes to regain Stamina Points.
For your [[debilitating trick]], you can attempt to temporarily suppress one magic item or deactivate one weapon, piece of equipment, or armor upgrade worn or carried by the target. Roll 1d20 + your operative level; the DC is equal to 10 + the item level. If you succeed, you deactivate the device (or suppress the item's magical properties) until the beginning of your next turn. The device's owner can spend a move action and attempt an [[Engineering]] check (for technological devices) or a [[Mysticism]] check (for magic items) against your operative exploit DC to try to reactivate the device.
You can instead use this debilitating trick to temporarily deactivate a construct that has either the magical subtype (such as a golem) or the technological subtype (such as a robot). You don't need to attempt a check, but the creature can attempt a Fortitude save to negate the debilitating effect. If it fails, it's [[stunned]] until the beginning of your next turn. Once you've used this ability to attempt to deactivate a construct, that creature is immune to your deactivating shot for 24 hours.
You are dead when you have 0 Hit Points, are not [[stable]], and have no Resolve Points remaining but would lose RP due to dying or taking damage while [[dying]]. You can also die from Constitution ability damage or ability drain, negative levels, or by taking massive damage.
When you are dead, your soul leaves your body and you are unable to act in any way. You can't benefit from normal or magical healing, but you can be restored to life via magic or technology capable of such a feat. Your dead body decays normally unless it is preserved, but anything that restores you to life also restores your body either to full health or to its condition at the time of death (depending on the spell or device that's reviving you). Either way, you need not worry about decomposition, rigor mortis, and other conditions that affect dead bodies after you are resurrected.
You are hollow inside.
''Gift:'' You gain a +2 insight bonus to [[Bluff]] checks and saving throws against mind-affecting effects. If another creature attempts to read your mind (such as with //[[detect thoughts]]//) and you succeed at the saving throw, you can render that creature [[shaken]] for 1 round as a reaction. You can do the same to a creature that fails a [[Bluff]], [[Diplomacy]], or [[Intimidate]] check against you by directing your lifeless gaze at it. This is a mind-affecting fear effect. A creature affected by your deadened emotions becomes immune to it for 24 hours.
''Stain:'' Reduce any morale bonus you receive by 1.
<div class="statblock">
* ''CR'' 12; ''XP'' 19,200
* CN Large magical beast
* ''Init'' +5; ''Senses'' [[blindsight]] (vibration) 60 ft., [[sense through]] (blindsight [vibration]) 60 ft., [[sightless]]; ''Perception'' +27
!!! DEFENSE
* ''HP'' 185
* ''EAC'' 26; ''KAC'' 28
* ''Fort'' +16; ''Ref'' +16; ''Will'' +11
* ''Defensive Abilities'' [[regeneration]] 5 (electricity)
!!! OFFENSE
* ''Speed'' 30 ft., burrow 15 ft., climb 30 ft.
* ''Melee'' bite +22 (3d8+20 B plus [[swallow whole]]) or claw +26 (3d6+20 S plus [[grab]])
* ''Multiattack'' 3 claws +20 (3d6+20 S plus [[grab]])
* ''Offensive Abilities'' singular attraction, [[swallow whole]] (3d8+20 B, EAC 26, KAC 24, 46 HP)
* ''Spell-Like Abilities'' (CL 12th)
** 1/day—//[[cosmic eddy]]// (DC 19), //[[greater invisibility]]// (self only), //[[passwall]]//
* ''Space'' 10 ft.; ''Reach'' 5 ft. (10 ft. with claws)
!!! STATISTICS
* ''Str'' +8; ''Dex'' +5; ''Con'' +4; ''Int'' –3; ''Wis'' +1; ''Cha'' –2
* ''Skills'' [[Athletics]] +27, [[Stealth]] +22
* ''Other Abilities'' [[compression]], feast, [[void adaptation]]
!!! ECOLOGY
* ''Environment'' any (Apostae)
* ''Organization'' solitary or tangle (2–8)
!!! SPECIAL ABILITIES
''Feast ([[Su]])'' Whenever a creature the deadfall stalker has swallowed dies or loses or spends a Resolve Point while dying, the deadfall stalker's [[regeneration]] increases by 10 during the following round (maximum 25).
''Singular Attraction ([[Ex]])'' A deadfall stalker easily transfers grabbed prey into its maw. A deadfall stalker can use its swallow whole ability to swallow a creature even if that creature wasn't [[grappled]] or [[pinned]] by the deadfall stalker's bite attack.
</div>
Loosely resembling a spider, a deadfall stalker's body hosts a black hole singularity it uses to capture, crush, and digest prey. Each of these subterranean predators skitters ably on its host of legs—the number of appendages ranges from 12–31 but doesn't impact their creatures' mobility and is unrelated to their age. A stalker's strange, spherical body has phalanxes of hairy appendages. Rather than eyes, a deadfall stalker relies on its legs' thousands of bristles, using them to sense the faintest vibrations even through thin atmosphere or stone. Those who survive encounters with these beasts sometimes report the soft tapping of a nearby stalker as it hauntingly raps on nearby surfaces to listen for echoes and prey.
As ambush hunters, deadfall stalkers quietly patrol their territory on the lookout for prey to catch unawares. They're adept at creeping up on targets, yet their favored tactic involves using //[[passwall]]// to strike from a completely unexpected direction. Once in range, a deadfall stalker scrabbles to pin down its prey with its legs before passing the immobilized meal into its jawless maw, which relies on suctioning force to crush and swallow food whole. The internal singularity and the organ that shelters it occupy roughly half the stalker's abdomen, and in addition to creating the gravity fields that circulate the creature's blood, the singularity acts as a powerful gizzard that pulverizes virtually anything the deadfall stalker swallows. The beast draws sustenance from the energy released by its prey's disintegrating atomic bonds and periodically excretes hyperdense waste pellets.
When a deadfall stalker accumulates too much matter, its singularity grows too powerful to remain housed safely in the creature's body. Within a few days, the stalker finds a safe place, hunkers down, and locks its limbs against one another in order to tear itself apart, undergoing binary fission. In addition to creating two healthy deadfall stalkers, each with half the number of legs as the original, this process snaps the singularity in half, releasing a powerful shock wave that registers on seismometers, breaks windows, and occasionally triggers cave-ins. The two halves barely acknowledge each other before skittering off to go their separate ways, gradually growing a full set of legs over the next several months.
Deadfall stalkers typically live solitary existences. However, they are fairly gregarious when meeting others of their kind, often linking claws and patting each other's joints with remarkable tenderness before settling into a huddled tangle of limbs. They can remain this way for days on end. Because deadfall stalkers reproduce asexually, it's unclear why the creatures perform this soothing ritual, yet they seem to enjoy each other's company and purposefully seek out occasional companions. If lonely, these beasts need only seek out trails that lack dust entirely to find each other, for their singularities quietly vacuum up loose debris wherever they walk. Thankfully, this same trail helps other creatures avoid the stalkers. In at least three documented cases, however, these beasts have sought out other species for company—in each case chasing down, capturing, and then delicately grooming their distressed companion before releasing them wordlessly several hours later.
The discovery of deadfall stalkers came only within the last century, when a half-orc expedition into Apostae's interior unsealed a vault with walls dozens of feet thick. A torrent of deadfall stalkers fell upon the spelunkers, and the drow who received the distress calls responded by sealing off that stretch of tunnels, thinking that sufficient to stem the strange threat. However, deadfall stalkers have since infiltrated several other sections of the planet, bypassing all but the thickest barricades. Within a month, the creatures had spread beyond the drow houses' ability to contain the threat, and deadfall stalkers have become a deadly reality for those delving the planet's depths.
Thankfully, deadfall stalkers can barely sense their surroundings on Apostae's airless surface, which discourages the creatures from venturing too far into the open. Those that do become hopelessly lost, often compressing themselves into a tight mass before entering a period of hibernation. This survival technique occasionally results in stalkers hiding in surface ruins, or getting lodged into starship hulls and inadvertently hitching rides across the galaxy. These accidental stowaways adapt easily to new worlds, yet they inexplicably reproduce far slower on other planets than they do on Apostae. As much as this peculiarity baffles researches, it's welcome news to the distant worlds that wish to avoid being overrun.
The few biologists and behaviorists who've studied deadfall stalkers and lived to report their findings have discovered that the creatures don't espouse particularly complex belief systems, yet this information hasn't stopped the Cult of the Devourer from obsessing over them. Feaster sects in particular relish any opportunities to lure deadfall stalkers into populated areas, all while forming a perimeter to eliminate any bystanders who try to flee the scene. Other worshippers—especially the cult's recruiters—have tried to tame the deadfall stalkers to turn them into dreadful mounts or living tanks. Devourer cultists have even attempted to transport deadfall stalkers to other planets, often with disastrous results. Collectively, these destructive missions rarely go as planned, as the escaped beasts often inflict just as much havoc on their captors as they might once have on the cultists' intended targets.
!! Singularity Cannons
{{Singularity Cannon}}
Your can strike your enemies' weak points and deal more damage.
''Prerequisites:'' Base attack bonus +1.
''Benefit:'' When you take the attack or full attack action with weapons (including a [[Solarian's|Solarian]] [[solar manifestation]], but not spells or other special abilities of any kind), you can take a –2 penalty to your attack rolls. If you do, those attacks deal additional damage equal to half your base attack bonus (minimum 1).
At the start of the gunnery phase, you can take a –2 penalty to your gunnery checks until the end of the round. If you do, the first of your attacks that hits and deals damage also deals additional damage equal to your base attack bonus.
You can make an upcoming attack or effect sound so terrifying and dangerous that its targets are actually more likely to be affected by it.
''Prerequisites:'' Cha 19, [[Bluff]] 10 ranks.
''Benefit:'' As a full action, you can describe in great detail how powerful and effective a specific action taken by you or an ally is going to be. You must select a specific character to boast about, and a specific weapon, item, spell, or ability to be used. Attempt a [[Bluff]] check against all foes within 60 feet of you, using the same DC you would use if attempting to [[demoralize]] them with [[Intimidate]]—roll a single check and compare the result to the DC for each target. Each target your check succeeds against takes a –1 penalty to AC and a –2 penalty to saving throws against the action you boasted about until the end of your next turn. Once you have attempted to use this ability against a creature, it is immune to your use of this feat for 24 hours. This is a sense-dependent, language-dependent ability.
The target must succeed at a Fortitude saving throw or be [[deafened]] for 1d4 minutes.
You can't hear. You take a –4 penalty to initiative checks and opposed [[Perception]] checks, and you automatically fail Perception checks based on sound. Characters who remain deafened for a long time grow accustomed to these drawbacks and can overcome some of them.
With the //deafening// fusion, a weapon releases a blast of low- frequency sonic energy on impact. The weapon gains the [[deafen]] critical hit effect. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the deafen effect. Only weapons that deal bludgeoning, piercing, slashing, or sonic damage can benefit from a //deafening// fusion.
If you are unaware of a creature, aware of a creature's presence, or aware of a creature's location, that creature is considered to be "unseen" for you. A stationary unseen creature has a +40 bonus to [[Stealth]] checks, but this bonus is reduced to +20 if the unseen creature moves (and these bonuses are negated for potential observers with [[blindsense]]). An unseen creature benefits from total [[concealment]] (50% miss chance) against attacks. In addition, you are considered [[flat-footed]] against an unseen creature's attacks.
If you are unaware of a creature or aware only of its presence, you cannot directly attack it. You must first succeed at a [[Perception]] check to search for the creature's location, which then allows you to become aware of the creature's location (if using an imprecise sense) or to observe the creature (if using a precise sense). If an unseen creature makes a melee attack against you from a space adjacent to you, you automatically determine its location, though this doesn't stop it from moving after the attack.
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' necromancy
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one willing living creature
* ''Duration'' 10 minutes/level
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You infuse the target with necromantic energy, physically altering their form into an amalgam of life and undeath.
For the duration of the spell, the target becomes immune to the following effects (unless such an effect specifies it works against undead creatures): bleed, death effects, disease, energy drain, exhaustion, fatigue, negative levels, nonlethal damage, and poison. This immunity does not apply to such effects currently affecting the creature. The creature also gains a +4 enhancement bonus to saving throws against the following effects: mind-affecting, paralysis, and stunning effects; ability damage; ability drain; and any effect that requires a Fortitude saving throw (unless the effect works on objects or is harmless). For effects that target creatures by type, the target creature counts as both its own type and undead (whichever type allows an ability to affect them for abilities that affect only one type, and whichever is worse for abilities that affect both types). When the spell ends, the above effects end and the target gains the exhausted condition.
<div class="statblock">
* ''CR'' 14; ''XP'' 38,400
* NE Huge undead (incorporeal)
* ''Init'' +8; ''Senses'' [[blindsense]] (life), [[darkvision]] 60 ft.; ''Perception'' +25
* ''Aura'' [[frightful presence]] (30 ft., DC 20)
!!! DEFENSE
* ''HP'' 250; ''RP'' 5
* ''EAC'' 28; ''KAC'' 30
* ''Fort'' +16; ''Ref'' +16; ''Will'' +12
* ''Defensive Abilities'' [[incorporeal]]; ''Immunities'' [[undead immunities]]
!!! OFFENSE
* ''Speed'' 40 ft., fly 40 ft. ([[Su]], average)
* ''Melee'' incorporeal slam +27 (8d6+14 B plus collect soul [DC 20])
* ''Space'' 15 ft.; ''Reach'' 5 ft.
!!! STATISTICS
* ''Str'' +0; ''Dex'' +8; ''Con'' —; ''Int'' +0; ''Wis'' +4; ''Cha'' +6
* ''Skills'' [[Intimidate]] +25, [[Pilot]] +30, [[Survival]] +25
* ''Languages'' Abyssal, Common, Infernal (can't speak any language)
* ''Other Abilities'' death racer, soulbound boost
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Collect Soul ([[Su]])'' When a death cruiser deals damage to a creature with its incorporeal slam attack, it can spend 1 RP to immediately attempt to collect the creature's soul, affecting that creature as //[[snuff life]]// (Fortitude DC 20 partial). Creatures suffering from a fear effect take a –4 penalty to this save. The soul of a creature slain by this ability is trapped inside the death cruiser. A trapped soul can be restored to life only by //[[miracle]]//, //[[warp reality]]//, or //[[wish]]//. A creature that succeeds at its save is immune to that death cruiser's collect soul ability for 24 hours.
''Death Racer ([[Su]])'' A death cruiser has many characteristics of a vehicle, including full speed 650 feet and overland speed 75 mph (ground and fly). It obeys the tactical vehicle and vehicle chase rules, using its own [[Piloting]] skill to pilot itself and treating its CR as its vehicle level. A death cruiser using the [[race]] maneuver when starting from a full stop doesn't increase the DC of Piloting checks by 5. At the beginning of any of its turns, a death cruiser can choose to suppress its [[incorporeal]] ability until the beginning of its next turn; when it does, it gains a collision attack that deals 15d10 bludgeoning damage (Reflex DC 18 half) and [[hardness]] 20.
''Soulbound Boost ([[Su]])'' When the death cruiser has trapped a soul with collect soul, all of the death cruiser's movement speeds double (including the speeds listed in the death racer ability). This does not affect its collision attack damage, and the doubling occurs before applying any other effects that increase its speed.
</div>
These spectral vehicles materialize without warning to snatch up the souls of mortal victims. Though each death cruiser has a unique appearance, and each one manifests in a different way, their behavior is predictable: they chase their prey with frightening efficiency, collect the soul of their target, and carry it off. Sometimes, however, a death cruiser can be driven off or challenged to a race; if beaten in a race, the cruiser abandons the pursuit of its target, at least for a time. Tales of chilling encounters with death cruisers have made their way through the Vast, and ancient records describe similar phantasms that take the form of archaic modes of transportation.
Weapons with the death field special property deal normal damage to shields, but they always deal minimum damage to Hull Points. Each time the weapon hits, a wave of negative energy floods the target starship. If the target has active shields on the quadrant hit, living creatures aboard the target take damage equal to the number of dice the death field weapon special property has. If the quadrant has no shields, roll the dice associated with the property once. Each living creature aboard the target vessel takes that amount of damage. This damage bypasses [[resistances]] and [[damage reduction]]. Undead aboard a targeted vessel instead heal an amount equal to the damage rolled.
As part of any attack you make, you can add the [[operative]] weapon special property to your unarmed attacks. When you do this, it loses the [[archaic]] weapon special property. When you do this, if you would normally add 1-1/2 times your character level to damage as a special form of specialization (such as from a racial trait such as a vesk's natural weapons), you instead add only your character level to damage. This is true regardless of how many abilities or effects you have modifying your specialization that apply to your unarmed attacks.
When the creature reaches 0 Hull Points, it perishes violently. This functions as a [[self-destruct system]] but can't deal more than the creature's maximum high weapon damage (see [[Step 2: Array]]).
<div class="statblock">
* <<levels>>
* ''School'' necromancy
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one living creature
* ''Duration'' 1 minute/level
* ''Saving Throw'' Will negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
The target gains a +4 morale bonus to saving throws against all spells and effects with the death descriptor. The target can attempt a save to negate such effects even if one is not normally allowed. The target can't gain negative levels and is immune to any negative energy effects. This spell does not remove negative levels the target has already gained, but it does remove the penalties from negative levels for the duration of its effect.
//Death ward// does not protect against other sorts of attacks, even if those attacks might be lethal.
You have been affected by the energies of death and negative energy. You are not undead, but you have an affinity for the dead and undead that is inexplicable to most living creatures. You may have suffered an attack from an undead creature when very young, or you may have been exposed to strange radiation, dimensional rifts, or magic that caused a weak but permanent link between you and the Negative Energy Plane. You survived this formative experience, but not without some change.
!! Theme Knowledge (1st)
Thanks to your experiences with the undead and the growing power of the grave within your form, you have an instinctive understanding and recognition of negative energy and undead. You can use [[Perception]], rather than [[Mysticism]], to [[recall knowledge]] about undead and negative energy effects when you first observe them. Perception is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to Perception checks. In addition, you gain an ability adjustment of +1 to Constitution at character creation.
!! Dread Vitality (6th)
You draw dark strength from the spark of negative energy within you, and you gain a fraction of the resistances that undead creatures have. You gain a +1 bonus to saving throws against disease, exhaustion, fatigue, mind-affecting effects, paralysis, poison, sleep effects, and stunning.
!! Inured to the Grave (12th)
Your body, always somewhat cool to the touch despite how much warm clothing you wear, becomes resistant even to extreme cold. You gain cold [[resistance]] equal to your level. If you already have greater cold resistance from some other source, that cold resistance instead increases by an amount equal to half your level.
!! Life Eater (18th)
If you are close to a sapient creature when its life is snuffed out, you can draw part of the released energy into your death-infused body, fueling your vitality. The first time each day when a living creature with an Intelligence score of 3 or more dies within 10 feet of you, you regain 1 Resolve Point. You need not be the one to deal the killing blow.
Additionally, anytime you are [[unconscious]] and a living creature with an Intelligence score of 3 or more dies in a space adjacent to you, as a reaction you can spend the appropriate number of Resolve Points to [[stabilize]] or, if you are already stable, you can spend 1 Resolve Point to stay in the fight
<div class="statblock">
* ''Tier'' 1
* Tiny fighter
* ''Speed'' 12; ''Maneuverability'' good (turn 1)
* ''AC'' 17; ''TL'' 16
* ''HP'' 35; ''DT'' —; ''CT'' 7
* ''Shields'' basic 30 (forward 10, port 7, starboard 7, aft 6)
* ''Attack (Forward)'' light particle beam (3d6), light plasma torpedo launcher (3d8)
* ''Power Core'' Micron Ultra (80 PCU); ''Drift Engine'' none
* ''Systems'' basic short-range sensors, mk 1 duonode computer, mk 4 armor, mk 3 defenses
* ''Modifiers'' +1 to any two checks per round, +2 [[Computers]]
* ''Complement'' 2 (minimum 1, maximum 2)
!!! CREW
* ''Gunner'' gunnery +5
* ''Pilot'' gunnery +5, [[Piloting]] +10 (1 rank)
</div>
The Death's Curtain Necrofighter is an innovation of the Corpse Fleet's secret shipyards. A two-crew fighter, this sleek vessel is often piloted by a trained elebrian assisted by a ghoul or skeletal gunner. An integrated tactical computer—a rarity among Eoxian-designed ships—allows for the pilot to coordinate effectively with her gunner. The hull is derived from the [[Death's Head Necroglider]], but it does not have formal ties to the Eoxian manufacturer.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one living creature
* ''Duration'' instantaneous
* ''Saving Throw'' Fortitude half, see text
* ''Spell Resistance'' yes
</div>
You accelerate a living opponent’s personal timeline to the end of their natural life cycle, unleashing the ravages of time in a devastating surge. The target can attempt a Fortitude saving throw to halve the damage and ignore the ability damage dealt by this spell. Ability damage dealt by this spell wears off after 1 minute. A creature can take ability damage from this spell only once every 24 hours.
* ''1st:'' When you cast //death’s door// as a 1st-level spell, it deals 1d10 damage plus 2 Strength damage to the target.
* ''2nd:'' When you cast //death’s door// as a 2nd-level spell, it deals 2d10 damage plus 2 Strength and 2 Dexterity damage to the target.
* ''3rd:'' When you cast //death’s door// as a 3rd-level spell, it deals 4d10 damage plus 4 Strength and 2 Dexterity damage to the target.
* ''4th:'' When you cast //death’s door// as a 4th-level spell, it deals 6d10 damage plus 4 Strength and 4 Dexterity damage to the target.
* ''5th:'' When you cast //death’s door// as a 5th-level spell, it deals 8d10 damage plus 6 Strength and 4 Dexterity damage to the target.
* ''6th:'' When you cast //death’s door// as a 6th-level spell, it deals 10d10 damage plus 6 Strength and 6 Dexterity damage to the target.
!!! Grim Manufacturers
<div class="statblock">
* ''Manufacturing Centers'' Eox (the Atraskien Shelf, Orphys)
* ''Specialties'' Mass-produced undead starships
* ''Famous Models'' [[Charon|Death's Head Charon]], [[Necroglider|Death's Head Necroglider]], Phantasm
</div>
Death's Head is defined by massive production runs. Its low prices and easy availability inspire voracious demand, but the true cost is paid inside its nightmarish factories. Shipyards that resemble prison camps more than assembly lines swarm with monstrous laborers. Undead work grueling hours that would have broken their living counterparts, all while navigating hazardous conditions and industrial accidents. Death's Head takes full advantage of its undead workforce to cut every available cost and corner. Still, undeath offers no guarantee of safety from machinery mishaps, so the company always has vacancies to fill.
Like [[Blackwind|Blackwind Engineering]] and [[Thaumtech|Thaumtech Unlimited]], Death's Head was founded during the Gap but lost substantial data from that time. Rather than reverse-engineer the company's own technology, its leadership chose a faster approach. They took the small proof-of-concept models found in the company's hangars, expanded on the designs just enough for mass production, and then released hordes of cheap, single-occupancy ships to sell by the squadron. Though these hastily assembled fighters and shuttles were legendarily shoddy, they reached the post-Gap market faster than their Eoxian competitors; Death's Head has ridden this momentum for over two centuries.
Death's Head caters to undead clientele, which makes cutting costs even easier. Its ships have no need for life support or environmental controls, and though unpopular with living customers, the company is a top manufacturer among Eoxians. The Necroglider is the sixteenth iteration of Death's Head's original single-occupancy design and boasts the lowest price tag in the history of the model. Numerous bone sages have longstanding contracts that ensure a near-endless supply of Phantasms for their forces. Large-frame Charon freighters are popular with merchants willing to trade life support for extra cargo space, and Death's Head pays traders for bodies to reanimate in exchange for discounted maintenance costs. The company is careful to keep these arrangements legal, but the Stewards frequently stop these ships for "surprise" inspections.
Perigost Zephilem (NE male elebrian necrovite) is the CEO of Death's Head. Considered eccentric even among necrovites, he was once the bone sage of a necropolis called Delthani. Strangely, Delthani has been missing since the Gap ended. Zephilem has no idea what happened to his former domain, and he endlessly pursues information that might reveal its fate. His rivals know how to exploit his obsessions, and they've done so in the past to divide his attentions.
''Manufacturer Perk:'' As a dubious benefit of their haphazard wiring, certain countermeasures are easy to install in Death's Head ships. Reduce the BP cost to install [[shock grid]] computer countermeasures by 1.
<div class="statblock">
* ''Tier'' 9
* Large heavy freighter
* ''Speed'' 8; ''Maneuverability'' average (turn 2); ''Drift'' 2
* ''AC'' 23; ''TL'' 25
* ''HP'' 160; ''DT'' —; ''CT'' 32
* ''Shields'' medium 120 (forward 30, port 30, starboard 30, aft 30)
* ''Attack (Forward)'' particle beam (8d6; 20 hexes), shadow bolt projector (1d10; 10 hexes)
* ''Attack (Aft)'' coilgun (4d4; 20 hexes)
* ''Attack (Turret)'' laser net (2d6; 5 hexes)
* ''Power Core'' Pulse Orange (250 PCU); ''Drift Engine'' Signal Booster
* ''Systems'' basic long-range sensors, crew quarters (common), mk 5 armor, mk 8 defenses, mk 2 trinode computer, security (computer countermeasures [mk 2 shock grid]); ''Expansion Bays'' [[cargo holds]] (4), [[sealed environment chambers]] (2), [[smuggler's compartments]](2)
* ''Modifiers'' +2 to any three checks per round, +2 [[Computers]] (sensors only)
* ''Complement'' 15 (minimum 6, maximum 20)
!!! CREW
* ''Captain'' [[Bluff]] +22 (9 ranks), [[Diplomacy]] +17 (9 ranks), gunnery +15 (9th level), [[Intimidate]] +17 (9 ranks),
* ''Piloting'' +17 (9 ranks)
* ''Engineer (1 officer, 2 crew)'' [[Engineering]] +17 (9 ranks)
* ''Gunners (2 officers, 2 crew each)'' gunnery +15 (9th level)
* ''Pilot'' [[Piloting]] +17 (9 ranks)
* ''Science Officer (1 officer, 3 crew)'' [[Computers]] +17 (9 ranks)
</div>
Though Death's Head is better known for its small-frame vessels, the Charon is a notable exception. For the company, the model's production history is second only to the [[Necroglider|Death's Head Necroglider]], dating back to the Silent War between the Pact Worlds and the Veskarium. The model earned a dark reputation during this time for being a "corpse-hauler," as less-than-scrupulous merchants used the Charon to transport wartime casualties back to Eox for reanimation—especially vesk cadavers, for which the bone sages paid handsomely.
This practice ended abruptly with the Pact Worlds-Veskarium truce, yet the Charon's wartime reputation survives. The Vesk never forgot about the starships, or the associated defilement of their fallen soldiers. Popular myth tells of predatory bone ships that descend upon civilian vessels to kill and abduct prey. In the age of legal cadaver markets, the idea of corpse peddlers attacking noncombatants is fanciful at best. Nevertheless, Charon vessels are regularly subject to "random inspections" by port authorities, especially in the Veskarium. The bone sages stress that no major incidents of illicit corpse smuggling have occurred for several decades, but more than one freight crew has been detained for missing documentation that legitimizes the origin of its cargo. Whether these were honest clerical oversights or attempts to skirt intergalactic law has been unclear.
The Death's Head Charon has the long silhouette of the riverboats of old, but with bony flanges reminiscent of a spinal column. These skeletal ships embark on long, silent voyages into the deep reaches of space, drifting from port to port seeking profit and potentially illicit cargo. Their expansive cargo holds make them popular with Eoxian merchant fleets, though this space comes at the cost of crew comforts—most infamously, cramped crew cabins and virtually nonexistent kitchen facilities. The issue is immaterial for undead crews, however. Environmentally sealed chambers are the only parts of the starship with consistent life support, to allow live cargo and other sensitive merchandise to survive transport. Despite their fleshmongering reputation, the starships commonly transport all manner of goods.
<div class="statblock">
* ''Tier'' 1/2
* Tiny interceptor
* ''Speed'' 12; ''Maneuverability'' perfect (turn 0)
* ''AC'' 16; ''TL'' 16
* ''HP'' 30; ''DT'' —; ''CT'' 6
* ''Shields'' basic 10 (forward 3, port 2, starboard 2, aft 3)
* ''Attack (Forward)'' gyrolaser (1d8), light EMP cannon (special)
* ''Power Core'' Micron Heavy (70 PCU); ''Drift Engine'' none
* ''Systems'' basic computer, budget short-range sensors, mk 3 armor, mk 3 defenses
* ''Modifiers'' +1 [[Piloting]]
* ''Complement'' 1
!!! CREW
* ''Pilot'' gunnery +3, [[Piloting]] +11 (1 rank)
</div>
Tiny fighters made to resemble bone sarcophagi, Necrogliders are each just large enough for one undead pilot. These notorious pilots jack their brains directly into their ships' sensors and controls, allowing them to recline in eerie repose as they direct the ships by thought alone.
<div class="statblock">
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 23
* ''Track'' [[Constitution|Constitution Poison Track]]
* ''Frequency'' 1/round for 6 rounds
* ''Cure'' 2 consecutive saves
</div>
<div class="table-wrapper">
|Substance | Level | Price |h
|deathblade | 16 | 24,000 |
</div>
You can use [[trick attack]] with sniper weapons; this counts as aiming the weapon for the purposes of the [[sniper]] weapon special property. You do not add trick attack damage to your attack, but the target can still be made [[flat-footed]], and you can use [[debilitating tricks]].
When you succeed at both the skill check and attack roll of your [[trick attack]], you can make the target [[flat-footed]] or [[off-target]] until the beginning of your next turn. You might learn exploits that grant you additional options for your debilitating trick, but you can select only one option each time you hit with a trick attack.
A cloud of debris—whether from a defeated opposing ship, the environment, or some other source—obfuscates the path forward and presents immediate danger.
''Failure:'' Take 1 hit.
As a standard action, you can cause a cloud of debris, microscopic particles, and small items to orbit you, trapped in your personal gravitational field. This grants you concealment against ranged attacks. This ability functions for 1 round or until you leave graviton mode.
When you are attuned or fully attuned, the cloud of debris and microscopic particles thickens, increasing the miss chance from your concealment to 50% on ranged attacks (though you are not considered to have total concealment).
Your [[custom rig]] is able to analyze and disable curses’ underlying magic. While in possession of your custom rig, you gain a +3 resistance bonus to saving throws against curses. Once per day, you can use your custom rig to remove a curse from a creature or object, per the spell //[[remove affliction]]//, using your mechanic level as your caster level.
Any piece of code has bugs, but you can turn the bugs in your spellcode into features. After rolling damage for an instantaneous spell that deals Hit Point damage, you can spend 1 Resolve Point to reroll one die with a result of 1. At 11th level, you can reroll up to two dice with a result of 1, and at 17th level, you can reroll up to three dice with a result of 1. For example, if you were 17th level and cast disintegrate, you could spend 1 Resolve Point to reroll up to three dice that rolled 1s, after rolling and seeing how many 1s you rolled.
When activated as a swift action, this artificial organ translates your subconscious thoughts into inane chatter that you hardly notice but that psychic intruders find jarring. While the system is active, you gain a +2 resistance bonus to saving throws against effects that read your thoughts (such as //[[detect thoughts]]//). Also, any creature contacting you with telepathy or reading your thoughts must succeed at a Will save (DC = 10 + 1/2 your level + your Charisma modifier) or become [[dazzled]] and unable to communicate with their telepathy for 1d4 rounds; if they’re concentrating on a spell that reads your thoughts, they lose concentration, potentially ending the spell. You can deactivate the node as a swift action. Once a creature successfully saves against your deception node, they’re immune to it for 1 hour.
If you have two //deception nodes// installed, they provide you greater control over your mental chatter, and you can activate or deactivate both as a swift action. While both are active, the resistance bonus to saving throws increases to +3, and the DC to resist the nodes’ effect increases by 1. If a creature reading your thoughts fails the saving throw, rather than dazzling them and interrupting their concentration, you can instead provide false thoughts to the creature. Doing so functions as telling a [[lie]] using the [[Bluff]] skill, though you reduce any DC modifier from the creature’s attitude by 5 if they’re unfriendly or hostile.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|//deception node// | 8 | 9,500 | brain |
</div>
You can use Culture to decipher writing in an unfamiliar language or a message written in an incomplete or archaic form. It takes at least 1 minute to decipher approximately 250 words of writing or fewer. The GM often rolls Culture checks to decipher writing in secret. If you succeed at the check, you understand the general content of the text. If you fail, you don't understand the text. If you fail the check by 10 or more, you entirely misconstrue the meaning of the text. You can't take 20 on a Culture check to decipher writing unless you are trained in the Computers skill and have access to an information network or downloaded data set. In this case, there is no chance of misconstruing the information presented in the writing.
The DCs for Culture checks to decipher writing are based on the complexity of the text as well as other circumstances determined by the GM.
<div class="table-wrapper">
|Complexity | DC |h
|Simple message | 20 |
|Standard text | 25 |
|Intricate, exotic, or very old writing | 30 |
</div>
This Small drone is designed to provide basic assistance aboard a starship or other large vessel, including supplemental computation for navigation or astrogation. Most deckhand drones resemble a squat box with stubby, clawed feet that allow it to keep its orientation in zero-g. A deckhand drone acts as the stealth drone of a 1st-level mechanic, except it has the [[climbing claws]] and [[tool arm]] (fire extinguisher) mods instead of the stealth drone's normal initial mods. If an activated deckhand drone is accessible to a creature attempting a [[Piloting]] check to navigate, that creature reduces the time needed to plot a course by half (generally from 10 minutes to 5 minutes). Its skill unit is [[Computers]]. A deckhand drone has 6 bulk.
!! Elite Deckhand Drone (Level 10)
An elite deckhand drone gains the [[skill subroutines]] (Engineering) mod and has an Intelligence score of 8 rather than 6. A deckhand drone can expend 5 charges of its battery to attempt to aid another to assist with the [[Engineering]] check to repair a starship's hull. In addition, during starship combat, an elite deckhand drone can assist a ship's engineer, reducing the DC of an engineer's patch action by 5.
The target of a weapon with the deconstruct special property takes the listed amount of acid damage every round until the target succeeds at a Reflex save to end the damage. This functions as the [[burning]] condition, except as noted and that the ongoing damage is also ended if the target takes any amount of electricity damage.
Weapons you form with your [[gear array]] and your faculty abilities deal additional damage equal to your Constitution modifier to constructs, objects, and creatures with the technological subtype. In addition, these attacks and abilities ignore an amount of hardness equal to your nanocyte level. This hardness reduction doesn't stack with that of the [[penetrating]] weapon property but instead increases the weapon's item level by an amount equal to your Constitution modifier for the purpose of calculating the amount of hardness the weapon ignores.
Some manufacturers have streamlined the disintegrator pistol's design to create a more affordable option; the result of their efforts is referred to simply as a decoupler. A decoupler is smaller and lighter than a disintegrator pistol, trading some of its outright destructive power for the ability to deal superficial pain that can leave targets shaking in their boots. In the Apostaean city of Nightarch, the ruling House Zeizerer issues decouplers to its enforcers, many of whom refer to the weapons as "facilitators." Manufacturers typically produce bruiser, pusher, and screamer decouplers.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|decoupler, bruiser | 1 | 430 | 1d4 A | 20 ft. | [[demoralize|Demoralize (critical)]] | 20 charges | 2 | L |— |
|decoupler, pusher | 4 | 2,300 | 1d6 A | 30 ft. | [[demoralize|Demoralize (critical)]] | 40 charges | 2 | L |— |
|decoupler, screamer | 8 | 10,800 | 1d10 A | 30 ft. | [[demoralize|Demoralize (critical)]] | 40 charges | 2 | L |— |
</div>
A decoupler grenade produces a dense cloud of dark nanites. This cloud provides concealment and corrodes creatures and materials within it. Each creature that starts its turn in the cloud must succeed at a Fortitude saving throw (DC = 10 + half the grenade's item level) or be subject to the [[corrode]] critical hit effect. A creature that inhales the nanites takes a –4 penalty to this saving throw.
<div class= "table-wrapper">
|Weapon | Level | Price | Range | Capacity | Bulk |Special |h
|decoupler grenade I | 2 | 200 | 20 ft. | drawn | L |[[explode]] (5 ft., nanite cloud 1 minute, [[corrode]] 1) |
|decoupler grenade II | 6 | 700 | 20 ft. | drawn | L |[[explode]] (10 ft., nanite cloud 1 minute, [[corrode]] 1d4) |
|decoupler grenade III | 10 | 3,000 | 20 ft. | drawn | L |[[explode]] (10 ft., nanite cloud 1 minute, [[corrode]] 2d4) |
|decoupler grenade IV | 14 | 12,000 | 20 ft. | drawn | L |[[explode]] (15 ft., nanite cloud 1 minute, [[corrode]] 4d4) |
|decoupler grenade V | 18 | 65,000 | 20 ft. | drawn | L |[[explode]] (15 ft., nanite cloud 1 minute, [[corrode]] 4d6) |
</div>
A decoy husk is a living case that can be regrown when ejected from a starship, expands to mimic that vessel and flies in another direction. This expansion takes up one bay in a Small starship, two in a Medium or Large vessel, three in a Huge starship, four in a Gargantuan craft, and five in a Colossal one. Super-colossal vessels cannot install or use this expansion. Once a decoy husk has been deployed, it cannot be recovered, and it takes the deploying vessel a week to grow another decoy.
A crew member must deploy the decoy as a crew action during the helm phase. Other vessels that fail a [[Computers]] check (DC = 10 + the deploying crew member's Computers bonus) to scan the deploying vessel and its decoy cannot tell the two apart, although this scan can be repeated during each helm phase. The decoy moves in an evasive trajectory chosen by the deploying crew and at the deploying vessel's speed, and it generates Shield Points equal to its cost in Build Points, but these shields falsely mimic those of the deploying starship when scanned. The decoy can't attack, and it has a number of Hull Points equal to 20% of the deploying starship's Hull Points.
A decoy husk can also be used as weapon. If it enters the hex of another vessel, a crew member aboard the deploying starship can make a gunnery check against the target's TL. On a hit, the decoy explodes, dealing damage according to its size—Small: 5d8; Medium: 5d10; Large: 10d8; Huge: 2d6 × 10; Colossal: 2d8 × 10. If the attack misses, the decoy is still destroyed in the resulting explosion.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|decoy husk | 15 + size category | 4 × size category |
</div>
An expansion bay can be outfitted with power conduits and wires needed to house an additional mononode computer core (which must be purchased separately). This additional computer has an integrated control module (ICM) that is dedicated to a single starship combat crew action (for example, an engineer's checks to [[divert]] or a gunner's check to [[fire at will]]), chosen when the computer is installed. The ICM grants its flat circumstance bonus once per round to the check for the chosen starship combat action. This bonus does not stack with the circumstance bonus granted by the main computer's ICM.
<div class= "table-wrapper">
|Expansion Bay | PCU | Cost (in BP) |h
|dedicated computer housing | 0 | 2 |
</div>
Some scholars devote their lives to understanding the rare and bizarre creatures and civilizations that reside within the stars, known to many as Deep Cultures. Such a pursuit requires not only academic devotion but also physical resilience, as any kind of field research involves traveling to some of the most dangerous places in the universe. Nevertheless, those who persevere discover amazing secrets about both these unusual creatures and the stars themselves, and they soon find themselves capable of withstanding the power of suns and even harnessing it for their own use.
Within the Pact Worlds system, Deep Cultures specialists are highly sought after by many organizations, notably including the Corona Artifact Divers, the Sun Atlas, and the Deep Cultures Institute.
The majority of Deep Cultures specialists are scholarly types—often envoys, mystics, or technomancers, though members of many other classes may follow this path. [[Solarians]] in particular can be drawn to the secrets of Deep Cultures, and other martially oriented types may seek to understand the raw power of suns and their peoples. Typically, Deep Cultures specialists have the [[scholar]], [[solar disciple]], [[xenoarchaeologist]], [[xenoseeker]], or similar themes.
The Deep culture specialist grants alternate class features at 9th, 12th, and 18th levels.
!! Reading the Ashes (9th)
To learn about Deep Cultures, you must frequently gather information from strange sources. You can use //[[identify]]// as a spell-like ability three times per day. At 16th level, you can also use //[[retrocognition]]// once per day as a spell-like ability, as long as the location you are attempting to gain information about is on or within a sun. Your caster level for these spell-like abilities is equal to your character level.
!! Stellar Fire (12th)
You have spent so much time studying residents of various suns that you can add their often fiery power to your and your allies' weaponry. One per day in a process that takes 10 minutes, you can temporarily add the //[[flaming]]// weapon fusion to up to four weapons of 5th level or higher that don't already deal fire damage. You must have access to these weapons during the entirety of the process, and the time doesn't count as a 10-minute rest to regain Stamina Points. This bonus fusion doesn't count toward the total level of fusions the weapon can have at once. In addition, a weapon with this bonus fusion gains the [[burn]] critical hit effect (dealing 1d4 fire damage for every 6 character levels you have); if the weapon already has one or more critical hit effects, the wielder must choose one of the critical hit effects to apply when scoring a critical hit. These bonus fusions last for 1 hour.
!! Solar Protection (18th)
You have spent so much of your life around stars that you've developed resistance to the worst of their effects. You gain fire resistance 20 and you always treat radiation as 1 step lower than it is for the purpose of saving throws and effects. When you take fire damage, you can lower you fire resistance as a reaction, such as to take advantage of the [[solar disciple]]'s heat transfer ability; this lasts until the start of your next turn.
<div class="statblock">
* <<levels>>
* ''School'' enchantment (compulsion, mind-affecting)
* ''Casting Time'' 1 round
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Area'' one or more living creatures with a total CR of 8 or lower, all within a 10-ft.-radius burst
* ''Duration'' 1 minute/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
This spell causes living creatures in the area to fall into a magical sleep, gaining the [[asleep]] condition (except normal noise doesn't wake up the sleeping creatures). Creatures with the lowest CR are affected first. Among creatures of equal CR, those who are closest to the spell's point of origin are affected first. //Deep slumber// doesn't affect unconscious creatures, constructs, or undead creatures.
Weapons with the //defending// fusion aid their wielder when blocking or fighting defensively. When you fight defensively while attacking with a weapon with this fusion, you gain a +1 bonus to attack rolls with the weapon (effectively reducing the penalty from fighting defensively to –3) and an additional +1 bonus to AC until the start of your next turn. Additionally, if your weapon has the [[block]] weapon special property, increase the enhancement bonus to your AC against melee attacks from that target to +2. Only melee weapons can benefit from this fusion.
[[Bolidas]] can protect themselves in combat by rolling into a nearly impenetrable ball. This augmentation segments your own spinal column (or similar system) to allow you similar flexibility. As a move action, you condense your body into a spherical shape. While rolled up in this way, you can only uncurl as a move action or take the [[total defense]] action (whereupon the bonus you receive to your AC increases to +5). This augmentation works well with the [[rolling charge]] graft, though that augmentation isn't required.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|defensive ball graft | 3 | 1,300 | spinal column |
</div>
''Required Feat:'' [[Cleave]]
When you use the [[Cleave]] or [[Great Cleave]] feat, you don't take that feat's penalty to your Armor Class.
Defensive countermeasures systems protect a ship from tracking weapons such as missiles, and they make it difficult for enemies using sensors to get a solid reading on the ship. They do this via a complicated suite of electronic sensors and broadcasting equipment that's designed to jam enemy sensors and create false readings. These systems grant a bonus to a ship's TL; the bonus, PCU usage, and cost are listed in the table below.
<div class="table-wrapper">
|Name | Bonus to TL | PCU | Cost (in BP) |h
|mk 1 defenses | +1 | 1 | 2 |
|mk 2 defenses | +2 | 1 | 3 |
|mk 3 defenses | +3 | 2 | 4 |
|mk 4 defenses | +4 | 3 | 6 |
|mk 5 defenses | +5 | 4 | 8 |
|mk 6 defenses | +6 | 5 | 11 |
|mk 7 defenses | +7 | 7 | 14 |
|mk 8 defenses | +8 | 9 | 18 |
|mk 9 defenses | +9 | 11 | 22 |
|mk 10 defenses | +10 | 13 | 27 |
|mk 11 defenses | +11 | 16 | 33 |
|mk 12 defenses | +12 | 20 | 40 |
|mk 13 defenses | +13 | 25 | 50 |
|mk 14 defenses | +14 | 32 | 65 |
|mk 15 defenses | +15 | 45 | 90 |
</div>
By using a [[nanite surge]] as a reaction when you take damage, you can protect yourself with your nanites when they create a temporary barrier or cause part of your body to temporarily disperse. You reduce the damage dealt by the triggering effect by an amount equal to your nanocyte level plus your Constitution modifier, and you gain a +1 circumstance bonus to the first saving throw against the effect (such as the initial saving throw to resist a poison, but not subsequent saves against it).
When you create a [[cloud array]], you can use a [[nanite surge]] to cause a portion of your cloud array to form a lifelike replica of you that shadows and mimics your movements, functioning like a single figment image created by //[[mirror image]]//. The duplicate exists until it's destroyed or you leave the cloud's area. At 14th level, you create 1d2 images, and at 18th level, you create 1d4 images.
When under attack, your drone can disappear swiftly. Once per minute, as a reaction after taking damage, your drone can immediately activate its [[reactive camouflage]] as though it had remained stationary for 1 round, and it can attempt a [[Stealth]] check to hide even if it's currently observed. If the drone also spends 1 Resolve Point while activating this ability, it can also take a [[guarded step]] after attempting the Stealth check. This mod requires that your drone has the reactive camouflage mod.
''Required Feat:'' [[Lunge]]
When you use the [[Lunge]] feat, you don't take that feat's penalty to your Armor Class.
You can dive out of the way of an incoming attack.
''Prerequisites:'' Dex 19, [[Acrobatics]] 10 ranks.
''Benefit:'' As a reaction when you are attacked or when you must attempt a Reflex saving throw, you can attempt an [[Acrobatics]] check. If you use this ability as a reaction to an attack and your Acrobatics check result exceeds your opponent's attack roll result, the attack misses you. If you use this ability as a reaction when you must attempt a Reflex saving throw, you can use your Acrobatics check result as your Reflex save result. Once you use this ability, you cannot do so again until you regain Stamina Points after a 10-minute rest. After you use this ability, you are [[staggered]] on your next turn.
You were born to fight your enemies, and nobody does it better.
''Prerequisites:'' Dex 13, base attack bonus +1, armor training trait.
''Benefit:'' While wearing light or heavy armor, you don't take a –2 penalty to AC when you use the [[Cleave]] feat or the [[Lunge]] feat or when you charge.
One of the strictest taboos for a Kalistocrat is to touch or be touched by somebody that isn't a fellow adherent. //Defensive threads// were designed to be sewn into clothing to detect when the wearer is about to be touched. While active, the threads automatically move the fabric to ensure that no skin stays exposed near any appendage belonging to another creature. The mk 2 version of this item provides even more protection; when you take the [[total defense]] action, the bonus to your Armor Class increases by 1.
//Defensive threads// can be combined with //[[cleanliness circuits]]// and //[[sense silk]]// in a single outfit (paying each cost separately), and such an outfit counts as only one worn hybrid item.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//defensive threads//, mk 1 | 1 | 50 | — |
|//defensive threads//, mk 2 | 7 | 7,550 | — |
</div>
The defiance series of heavy armor is the workhorse of squad armor. A formed hard shell overlays a suit of para-aramids, creating a bulky and solid protective outfit. Defiance series helmets have wide, tinted visors to allow peripheral vision.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br>Bonus | KAC<br>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br>Slots | Bulk |h
|defiance series, squad | 3 | 1,220 | +5 | +8 | +1 | –4 | –10 ft. | 1 | 3 |
|defiance series, elite | 7 | 6,300 | +10 | +13 | +2 | –4 | –10 ft. | 2 | 3 |
|defiance series, specialist | 10 | 16,950 | +15 | +18 | +2 | –4 | –10 ft. | 3 | 3 |
</div>
A weapon with the //defiant// fusion resists efforts to be removed from its wielder. If you are wielding it when you are knocked [[unconscious]], [[panicked]], or [[stunned]], it stays in your hand. You also gain a bonus to your KAC against combat maneuvers to disarm the weapon equal to one-fifth the weapon's level (minimum +1).
<$list filter="[tag<currentTiddler>]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
A weapon with the deflect special property generates both an energy and a kinetic effect, which allows you to use it with the [[Deflect Projectiles]] feat (if you have it) to counter both kinetic and energy ranged attacks.
You can use your melee weapon to deflect attacks.
''Prerequisites:'' Base attack bonus +8.
''Benefit:'' When you would be hit by a ranged attack from a weapon or spell that deals energy or kinetic damage, you can spend 1 Resolve Point as a reaction to make an attack roll with a non-[[archaic]] melee weapon that deals the same general category of damage (energy or kinetic) with a +5 bonus. If your attack roll is higher than the attack roll that hit you, you deflect the attack with your weapon, and it misses. This doesn't work against area attacks, even against area attacks that have attack rolls like [[blast]] weapons, and you can't use this reaction if you aren't capable of making an attack with an appropriate weapon.
As a gunner action at the beginning of the gunnery phase, you can spend 1 Resolve Point to shoot down incoming attacks. Once before the end of the phase, after learning the result of an incoming direct-fire or tracking weapon attack's gunnery check but before any damage is dealt, you can choose to fire on the incoming attack. Attempt a gunnery check, and use the result as your starship's AC and TL against that attack. If you hit, you deflect the attack.
If you deflect the attack and you have the [[Reflect Projectiles]] feat, you can redirect the attack. Attempt a gunnery check against the new target's AC for a direct-fire attack or TL for a tracking weapon. If you succeed, deal the weapon's minimum damage to the secondary target, using your attacking starship's hex as the weapon's point of origin to determine which quadrant you hit for the secondary target.
Your weapon's energy deflects incoming attacks. When you make an attack with a melee weapon that has the [[powered]] weapon special property, you gain a +1 insight bonus to your EAC until the beginning of your next turn. If your attack is a critical hit, the insight bonus increases to +2.
This modification creates a magical field that deflects incoming attacks. This vehicle gains an enhancement bonus to AC. The amount depends on the deflective field type, as listed below.
<div class= "table-wrapper">
|Modification | Level | Price | AC Bonus |h
|//deflective field//, mk 1 | 4 | 2,100 | +1 |
|//deflective field//, mk 2 | 10 | 18,000 | +2 |
</div>
This upgrade gives your armor a uniquely slippery texture. Your armor grants you [[DR]] 5/—. In addition, your armor check penalty is reduced by 2 when you attempt an [[Acrobatics]] check to escape.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|deflective reinforcement | 7 | 7,500 | 1 | any | 1 |
</div>
Whereas conventional starship shields absorb attacks entirely until they are depleted, some engineers insist that shields are most effective when deflecting attacks, blunting their force or causing them to miss entirely. Deflector shield technology reduces damage from incoming attacks and increases a starship's AC and TL, though each successive attack depletes the shields' defensive potential. Deflector shields and conventional shields create fields that interfere with each other, so only one of these two defenses can be installed on a starship.
Fully functioning deflector shields provide a starship the defense value (DV) to each quadrant. Whenever the starship would take damage, it ignores an amount of that damage equal to its defense value in that quadrant. Deflector shields are twice as effective against attacks from melee, ramming, and ripper starship weapons, so the starship ignores double the amount of damage from such attacks. Any attack that would ignore a fraction or all of a target's shields instead reduces the amount of damage the deflector shields ignore by an equal amount, rounded in the defender's favor (e.g., deflector shields with a defense value of 5 would reduce damage from a [[burrowing]] weapon by 3). While the deflector shields' defense value in a quadrant is 1 or higher, the shields increase the starship's AC and TL against attacks in that quadrant by the listed amount.
Whenever an attack or effect damages a starship's Hull Points, the deflector shields' defense value in that quadrant also decreases by 1, reducing the amount of damage they can ignore. Weapons with the [[array]] or [[line|Line (starship weapon property)]] special property that damage a starship's Hull Points overwhelm its deflector shields, reducing their defense value in that quadrant by 2, whereas vortex weapons that deal Hull Point damage reduce the target's deflector shields' defense value in each quadrant by 1d4. Any successful attack by a weapon with the [[buster]] special property (or another special property that deals reduced damage to Hull Points) reduces the deflector shields' defense value in the struck quadrant by 2, whether or not the attack damaged the target's Hull Points. When a gunnery check results in a natural 20, any decrease to the target's deflector shield's defense value from the attack is 1 greater.
When an engineer uses the [[divert]] action to send power to shields, they increase the defense value of a single quadrant by 2, or the defense value of each quadrant by 1, up to the deflector shields' maximum defense value per quadrant. For every 150 PCU provided by a starship's power core, increase the defense value restored to one quadrant by 1. When a science officer uses the [[balance]] action, they can adjust their deflector shields' defense values in the same way as they would shift or distribute Shield Points, though each quadrant must have a defense value of at least 1 afterward. When a starship is not engaged in combat or otherwise taking damage, the defense value for each quadrant regenerates at a rate of 1 per minute.
<div class= "table-wrapper">
|Shield | DV | AC/TL | PCU | Cost (BP) |h
|basic deflector shield 1 | 1/— | +1 AC/+1 TL | 5 | 4 |
|basic deflector shield 3 | 3/— | +1 AC/+1 TL | 5 | 6 |
|light deflector shield 5 | 5/— | +1 AC/+2 TL | 10 | 12 |
|light deflector shield 8 | 8/— | +1 AC/+2 TL | 15 | 15 |
|medium deflector shield 10 | 10/— | +2 AC/+2 TL | 30 | 22 |
|medium deflector shield 12 | 12/— | +2 AC/+2 TL | 45 | 26 |
|heavy deflector shield 13 | 13/— | +2 AC/+3 TL | 60 | 33 |
|heavy deflector shield 15 | 15/— | +2 AC/+3 TL | 80 | 36 |
|superior deflector shield 18 | 18/— | +3 AC/+3 TL | 100 | 45 |
|superior deflector shield 20 | 20/— | +3 AC/+3 TL | 120 | 50 |
</div>
Banned on some worlds, such as Ghorus Prime, these grenades selectively destroy plants and plant fiber without harming other biological matter, and they're considered more tool than weapon in many circles. A defoliant grenade unleashes a cloud of rust-red dust that causes vegetation to wither and die on contact. This kills most mundane grasses, shrubs, vines, brambles, small trees, and other moderately thick vegetation, eliminating any difficult terrain caused by those features. Larger trees and wooden objects take full damage but typically are not destroyed outright. Creatures with the plant type take the listed damage and can attempt a Reflex save for half damage. All other creatures and objects are unaffected.
<div class= "table-wrapper">
|Weapon | Level | Price | Range | Capacity | Bulk |Special |h
|defoliant grenade I | 1 | 75 | 20 ft. | drawn | L |[[explode]] (2d6 A, 15 ft.; see text) |
|defoliant grenade II | 4 | 320 | 20 ft. | drawn | L |[[explode]] (3d6 A, 15 ft.; see text) |
|defoliant grenade III | 7 | 850 | 20 ft. | drawn | L |[[explode]] (6d6 A, 15 ft.; see text) |
|defoliant grenade IV | 12 | 4,800 | 20 ft. | drawn | L |[[explode]] (10d6 A, 15 ft.; see text) |
</div>
<div class="statblock">
* ''CR'' 11; ''XP'' 12,800
* N Large animal
* ''Init'' +5; ''Senses'' [[blindsense]] (scent) 60 ft., [[low-light vision]]; ''Perception'' +20
!!! DEFENSE
* ''HP'' 180
* ''EAC'' 24; ''KAC'' 26
* ''Fort'' +15; ''Ref'' +12; ''Will'' +13
* ''Defensive Abilities'' [[ferocity]]; ''DR'' 6/—
!!! OFFENSE
* ''Speed'' 40 ft.
* ''Melee'' bite +23 (4d6+19 P) or claw +23 (3d8+19 S plus [[grab]])
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' menace, prey on fear
!!! STATISTICS
* ''Str'' +8; ''Dex'' +1; ''Con'' +5; ''Int'' –4; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Athletics]] +20, [[Intimidate]] +25, [[Survival]] +20
!!! ECOLOGY
* ''Environment'' temperate forests and hills (Vesk-2)
* ''Organization'' solitary, mated pair, or tumult (3–8)
!!! SPECIAL ABILITIES
''Menace ([[Ex]])'' As a full action, the defrex can attempt to demoralize a group of foes that are within 60 feet and able to see it. The DC of this check is equal to the highest DC to demoralize any one of the foes. If successful, all the targets become [[shaken]] for 1 round, increasing to 2 rounds if the defrex succeeds by 5 or more. Once a creature has been affected by this ability, it is immune to the menace ability of any defrex for 24 hours.
''Prey on Fear ([[Ex]])'' A defrex gains a +1 morale bonus to attack rolls against any creature that is [[cowering]], [[frightened]], [[panicked]], or [[shaken]]. The defrex also gains a morale bonus to melee damage rolls against such creatures equal to half its CR (+5 in this case).
</div>
<<section 'Defrex Juvenile'>>
Native to the archipelagos of Vesk-2, defrexes are mammals famed for their strength, tough hide, and aggression. A juvenile defrex is a quadruped with splayed, clawed legs and an array of spines along its back and tail. As it ages, the defrex becomes more muscular, developing broader jaws, thicker skin, the ability to stand upright for short periods of time, and a taste for meat. Over the millennia, defrexes have inhabited the majority of Vesk-2 and have diverged from their common ancestor into numerous distinct species. These animals are among the top terrestrial predators on the planet.
As mammals, defrexes give birth to live young, producing litters of 3 to 12 pups. The mother defends her offspring, but this instinct lasts only 5 to 7 weeks, depending on how well fed the mother is. After that, a female defrex views her offspring as competition and prey, consuming those that fail to leave the nest within a few days. Fortunately for them, young defrexes grow quickly and run even quicker.
After weaning, defrexes eat plants, insects, and smaller animals. Defrex juveniles form cohorts of unrelated creatures that rely on each other for help and protection, including from defrex adults. The eldest defrexes lead these packs, using the group's knowledge to navigate the area, find food, and avoid danger.
Defrex adolescent stages last about 5 years, after which a defrex sheds most of its spines, developing thick osteoderms beneath its skin. Some of its juvenile teeth fall out, replaced by shearing carnassial teeth and piercing canines. The defrex's gut likewise changes to accommodate a more carnivorous diet. During this transition, defrexes are wild and bold, learning to hunt through trial and error. The more aggressive an adolescent defrex becomes, the more likely its cohort chases it away.
Adult defrexes are loners, but they form loosely connected social networks maintained through scent marking and vocalizations, including howls some have described as haunting. [[Ijtikris]] call such groups "tumults." Each adult in a tumult maintains a territory that overlaps with that of several other defrexes. As a result, defrexes frequently cross paths, pausing to establish dominance when they do. These encounters are more likely when a defrex makes a kill, the scent of blood attracting other defrexes.
Thanks to this behavior, an encounter with a wild defrex can escalate as the predators attract reinforcements with calls or the scent of blood. Escaping one defrex is no guarantee of safety. However, defrexes' social aggression can create an opening to flee as two defrexes become distracted by their dominance displays.
Defrexes are difficult to tame, although [[vesk]] have attempted to do so for centuries. Shortly after vesk first landed on Vesk-2, the defrex captured their imagination and respect as a reflection of vesk virtues of dueling and fearlessness. A defrex mount or pet is a status symbol among vesk. Demand for defrex hide has led to defrex ranches, which are risky enterprises.
!! Defrex Hide Armor
{{Defrex Hide}}
<div class="statblock">
* ''Level'' <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 standard action
* ''Range'' touchTargets one creature
* ''Duration'' 1 minute/level
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
The target becomes infused with the resilience of a [[defrex]] and sprouts bristling spines. It gains [[DR]]/— equal to your caster level, and any creature adjacent to the target that hits it with a melee attack takes piercing damage equal to your caster level.
Made from the hide of a [[ferocious mammal|Defrex]] native to Vesk-2, this light armor is popular among vesk but less often worn by other races. Tanned stretches of the creature's thick hide are stitched together with metal wires, and the suits are reinforced with metal studs or scales.
Even juvenile defrex hide has layers of cartilaginous fibers that resist tearing, allowing for basic defrex hide. Adult defrex hide contains osteoderms that can deflect high-speed projectiles. Chemical treatments and modern materials can reinforce the hide to an even stronger degree.
!!! Dermal Plating
A [[dermal plating]] augmentation can be installed in defrex hide armor, taking up one upgrade slot. The augmentation's level must be equal to or lower than the armor's item level.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br/>Bonus | KAC<br/>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br/>Slots | Bulk |h
|defrex hide | 4 | 2,250 | +5 | +5 | +4 | — | — | 1 | L |
|defrex hide, mature | 8 | 9,000 | +9 | +11 | +4 | — | — | 2 | L |
|defrex hide, advanced | 12 | 33,000 | +14 | +16 | +5 | — | — | 3 | L |
|defrex hide, elite | 16 | 142,000 | +19 | +21 | +6 | — | — | 4 | L |
</div>
<div class="statblock">
* ''CR'' 7; ''XP'' 3,200
* N Large animal
* ''Init'' +2; ''Senses'' [[blindsense]] (scent) 30 ft., [[low-light vision]]; ''Perception'' +14
!!! DEFENSE
* ''HP'' 105
* ''EAC'' 19; ''KAC'' 21
* ''Fort'' +11; ''Ref'' +11; ''Will'' +6
* ''Defensive Abilities'' bristle; ''DR'' 3/—
!!! OFFENSE
* ''Speed'' 50 ft.
* ''Melee'' claw +17 (2d6+12 S)
* ''Space'' 10 ft.; ''Reach'' 5 ft.
!!! STATISTICS
* ''Str'' +5; ''Dex'' +2; ''Con'' +4; ''Int'' –4; ''Wis'' +0; ''Cha'' +0
* ''Skills'' [[Athletics]] +14, [[Survival]] +19
!!! ECOLOGY
* ''Environment'' temperate forests and hills (Vesk-2)
* ''Organization'' solitary or cohort (2–12)
!!! SPECIAL ABILITIES
''Bristle ([[Ex]])'' As a move action, an adolescent defrex can flare its spines. Until the start of the defrex's next turn, any adjacent creature that attacks the defrex takes 1d6+7 piercing damage. If the defrex is [[flat-footed]], the attacker can avoid this damage with a successful DC 15 Reflex save.
</div>
As a move action, you can fly up to your speed. You must end this movement on solid ground or you fall. At 12th level or higher, you don't have to land if you immediately follow your flight with another move action to use defy gravity. On your last move action of the turn, you still have to land or fall.
When you are attuned or fully attuned, your fly speed from this revelation increases by 10 feet.
The target's cells overheat and rapidly degenerate. Each round, at the start of the character's next turn before they take any actions, they take the listed amount of damage as fire damage and are [[fatigued]]. At the end of each of their turns, the creature can attempt a Fortitude saving throw to end the effect; on a failure, cellular degeneration continues but the creature gains a cumulative +1 bonus to the Fortitude save to end the effect.
//Degeneration grenades// were standard equipment among sivv soldiers. They create a powerful degeneration wave that affects creatures and objects at the subatomic level. Creatures caught in the explosion of a //degeneration grenade// must attempt a Fortitude saving throw as their cells begin to collapse; on a failure, the creature takes 5d6 fire damage at the beginning of each of their turns and is [[fatigued]]. At the end of each of their turns, the creature can attempt a new Fortitude save to end this effect with a cumulative +1 bonus.
<div class= "table-wrapper">
|Weapon | Level | Price | Range | Capacity | Bulk |Special |h
|//degeneration grenade// | 17 | 40,000 | 20 ft. | drawn | L |[[explode]] (11d6 A & So, [[degeneration]] 5d6, 20 ft.) |
</div>
Once a common sidearm among sivv officers, law enforcement officials, and citizenry, the //degenerator pistol// is a light, handy weapon that inflicts catastrophic cellular damage at a quantum level. Many sivvs augmented their //degenerator pistols// with a [[rel-battery]], eliminating power concerns.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|//degenerator pistol//, military | 16 | 161,000 | 4d6 A & So | 40 ft. | [[degeneration]] 3d6 | 40 charges | 4 | L | |
|//degenerator rifle//, dominion | 19 | 560,000 | 7d6 A & So | 40 ft | [[degeneration]] 4d6 | 80 charges | 4 | L | |
</div>
Sivv soldiers were armed with some version of the //degenerator rifle//, a two-handed longarm with improved range and destabilizing power. Like other sivv weapons, the rifle comes in two models: a less potent model intended for standard use and a more robust version used only by elite soldiers.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|//degenerator rifle//, military | 17 | 242,000 | 7d8 A & So | 50 ft. | [[degeneration]] 4d6 | 40 charges | 5 | 2 | |
|//degenerator rifle//, dominion | 20 | 810,000 | 10d8 A & So | 50 ft | [[degeneration]] 5d6 | 80 charges | 5 | 2 | |
</div>
Sivv firearms are based on the same technology as the Stellar Degenerator, acting on the target at the quantum level and disentangling subatomic particles from each other. On a critical hit, these weapons set up a fatal chain reaction in which the target's cells overheat and collapse upon themselves.
As a standard action, you can expend an unused spell slot to degrade the navigational machinery of a vehicle within 30 feet. You reduce the target’s [[Piloting]] modifier by an amount equal to the expended spell level, and the effect lasts a number of rounds equal to your Intelligence modifier. Alternatively, you can instead target a starship with a range of 1 hex as a special crew action during the gunnery phase, reducing the target’s Piloting modifier by an amount equal to the expended spell slot’s level until the end of the next round.
<div class="statblock">
* ''CR'' 14; ''XP'' 38,400
* CE Large aberration
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +30
!!! DEFENSE
* ''HP'' 214
* ''EAC'' 27; ''KAC'' 28
* ''Fort'' +12; ''Ref'' +12; ''Will'' +19
* ''Defensive Abilities'' open pustules; ''DR'' 10/magic; Immunities disease, mind-affecting effects, poison; ''Resistances'' cold 10, fire 10; ''SR'' 25
* ''Weaknesses'' brain dependency
!!! OFFENSE
* ''Speed'' 20 ft., fly 40 ft. ([[Su]], perfect)
* ''Melee'' bite +21 (6d6+17 P plus dominion bile)
* ''Ranged'' synthesized projectile +23 (4d8+14 P plus dominion bile or spell-slot sacrifice)
* ''Space'' 10 ft.; ''Reach'' 5 ft.
* ''Offensive Abilities'' brain collection
* ''Spells Known'' (CL 14th; melee +21)
** 5th (3/day)—//[[control machines]]// (DC 24), //[[synapse overload]]// (DC 24)
** 4th (6/day)—//[[corrosive haze]]// (DC 23), //[[dimension door]]//, //[[overload systems]]// (DC 23), //[[rewire flesh]]// (DC 23)
** 3rd (at will)—//[[discharge]]// (DC 22), //[[instant virus]]// (DC 22)
!!! STATISTICS
* ''Str'' +4; ''Dex'' +4; ''Con'' +6; ''Int'' +8; ''Wis'' +4; ''Cha'' +4
* ''Skills'' [[Computers]] +25, [[Culture]] +25, [[Engineering]] +30, [[Life Science]] +30, [[Medicine]] +25, [[Mysticism]] +30, [[Physical Science]] +25
* ''Languages'' Aklo, Abyssal, Common, up to 4 other languages as determined by brain collection; [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Brain Collection ([[Ex]])'' A deh-nolo can store up to four brains of Small or Medium creatures and use them to enhance its knowledge and power, learning a single language known by the former owner of each stored brain. A deh-nolo can extract a brain from a [[helpless]] opponent with a coup de grace action that kills the opponent, or it can do so as a standard action from a body that has been dead no longer than 1 minute.
''Brain Dependency ([[Ex]])'' A deh-nolo that has fewer than four collected brains gains 1 negative level for each missing brain. A deh-nolo's caster level is reduced by 2 for each negative level it gains from missing brains, and a deh-nolo with no collected brains can't cast any of its spells. These negative levels never become permanent, and they can be removed only by adding brains to the deh-nolo's collection. The statistics presented here assume a
deh-nolo with a full collection.
''Open Pustules ([[Ex]])'' When a deh-nolo takes more than 20 damage from a single attack, each creature adjacent to that deh-nolo must succeed at a DC 22 Reflex save or be sprayed with a foul poison as the pustules all over the deh-nolo's body erupt. Creatures hit by this spray are exposed to dominion bile.
''Synthesized Projectile ([[Ex]])'' Once per round as a standard action, a deh-nolo can concentrate the crystallized, metallic discharge it produces and expel it through a tear in its flesh. This attack deals 1d4 damage to the deh-nolo. A deh-nolo can fire the projectile at a target up to 60 feet away as a ranged attack that deals 4d8+14 piercing damage. A deh-nolo can augment the projectile in one of two ways. It can coat the projectile in dominion bile to poison its target, or it can sacrifice a spell slot to charge the projectile with energy. A projectile charged in this way deals an additional 1d6 acid, cold, electricity, or fire damage (dehnolo's choice) for each level of the spell slot sacrificed in this way.
!!! Dominion Bile
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 22
* ''Track'' [[Constitution|Constitution Poison Track]] (special)
* ''Frequency'' 1/round for 6 rounds
* ''Effect'' progression track is //Healthy—Weakened—Debilitated—Dead//
* ''Cure'' 2 consecutive saves
</div>
Just as the neh-thalggus and yah-thelgaads among the Dominion of the Black make use of organic brains to power their magical abilities, so do deh-nolos extract and use other creatures' brains to slake their never-ending thirst for knowledge. This shared penchant strikes well-deserved fear into the hearts of all thinking creatures in the universe, and many spacefarers know it is best to avoid ships with Dominion markings altogether.
Deh-nolos are brilliant engineers and inventors among the Dominion of the Black, merging technology and biological systems in twisted and devious ways that are stunningly seamless. These creations are unlike cybernetics, in that they are often grown rather than built, and they blur the lines between living organs and complex machines. Using vulgar ingenuity and their surprisingly adroit singular "arms," deh-nolos designed and built the first Dominion starships, which are hybrid vessels with both organic and technological components. They also cultivated the first shipminds—oozes that pilot these biomechanical starships. In addition to these marvels of engineering, deh-nolos are adept at repairing most technological devices, no matter what civilization built them. When presented with a device with which it is unfamiliar, a deh-nolo attempts to collect the brain of a member of the species that produced it in the hopes that doing so will provide the aberration with some flash of insight.
Mostly organic beings, deh-nolos secrete a metallic discharge that shimmers with disturbing beauty in natural sunlight. Deh-nolos can concentrate this liquid to form foul crystals that they either use as ranged projectiles or work into components for their mechanical devices. Such machine parts are malformed, resembling incomplete living organs and atrophied body parts, and many have common technological connectors and partially completed circuitry. Some reckless scientists have harvested these bits from deh-nolos and plugged them into their equipment or their own bodies, with varying and unpredictable outcomes. Most of the time, the result is horrendous—and even deadly to the experimenter—but the practice occasionally creates functional, albeit macabre, technology. Installed in sensors and other devices with video or audio output, these components cause the images on their screens to appear disturbingly fragmented or amplify and distort sound into mind-shattering cacophonies. Implanted in a living creature, these parts horrendously mutate the host body and often wrack it with unceasing pain.
Like many other creatures among the Dominion of the Black, deh-nolos fabricate and weaponize their own toxins. Poison-filled glands grow in patches across these creatures' bulky bodies, and anyone who ruptures one is exposed to the purulent fluid that sloshes within. Deh-nolos can also apply this toxic pus to the projectiles that they eject from their bodies, infecting those they strike.
Deh-nolos are not only extremely competent engineers, but also formidable spellcasters, weaving magic that, like their inventions, blurs the line between flesh and machine. With a thought, a deh-nolo can commandeer nearby technological devices, create a cloud of burning acid, or temporarily overwrite the DNA of a living creature to turn it into a twisted reflection of a robot. A deh-nolo uses its more offensive spells only in response to direct attacks, preferring to catch a single target unaware and render it helpless. From there, the aberration proceeds to carefully (and painfully, if the creature is still alive) extract its prey's brain and store it in one of its four brain pods. Deh-nolos with even one empty brain pod often go out of their way to procure a fresh replacement, almost as if they were addicted to the knowledge stored within the gray matter. A deh-nolo with no stored brains is jittery and desperate, lashing out at any non-Dominion creatures it can find, even those with animal intelligence. Once it is able to use its full complement of abilities, such a deh-nolo seeks out more sophisticated brains to replace the simpler ones, unless a more pressing matter is at hand.
Deh-nolos use their psychic potential, which is inherent in most Dominion of the Black creatures, to fly with incredible dexterity. The eerie sight of their alien forms gliding silently through the air with no obvious means of propulsion is usually enough to send most sane onlookers fleeing for their lives.
A typical deh-nolo stands almost 20 feet tall on its four spindly legs and weighs close to 2,000 pounds.
If you aren't sure what to do when it's your turn, you can delay taking an action until other characters have taken their turns. You must declare that you are delaying before taking any actions on your turn (this does not require spending any of your actions). After any creature takes its turn in the initiative order, you can come out of delay and take your turn. This changes your initiative count to the current initiative count for the remainder of the combat. If you used a reaction on your previous turn and then chose to delay, you still regain your reaction at the beginning of your original turn, not when you take your delayed actions.
<div class="statblock">
* <<levels>>
* ''School'' enchantment
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one computer
* ''Duration'' 1 round/level
* ''Saving Throw'' no
* ''Spell Resistance'' yes
</div>
Countermeasures on the target computer are suppressed. If you trigger any suppressed countermeasure, you are still alerted that you have done so, but it activates only after the spell ends.
This virtually indestructible 1-quart thermos comes in a variety of attractive designs and features patented temperature control technology. When activated, the device senses its contents' temperature and maintains that temperature to a minimum of 10° Fahrenheit and maximum of 150° Fahrenheit.
You can expend an additional charge and activate the delectator's secondary function as a standard action, causing it to subtly and temporarily realign molecules to change the contents' flavor for 15 minutes or until the contents have been out of the device for one minute. While the delectator can easily cause water to taste like beer or bland oatmeal to taste like roasted meat, it struggles to emulate complex gourmet flavors.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|delectator | 3 | 1,250 | — | 20 | 1/day |
</div>
You gain a +1 bonus to AC and saving throws against traps and hazards. Once per hour when you take damage from or fail a saving throw against a trap or hazard, you gain 1 Entropy Point. If you are not in combat, you retain this Entropy Point for a number of rounds equal to your Constitution bonus (minimum 1) or until you spend it, whichever comes first.
You assign menial tasks to others to complete.
''Multiday:'' You give orders and shift personnel so that they can conduct a downtime activity of your choice. You must spend as much time delegating as the downtime activity takes to complete.
''Results:'' The organization performs the chosen downtime activity, using its power modifier for any checks. The downtime activity must be appropriate to the organization (like a military unit building a shelter), and it must be something that can actually be delegated (you can't delegate carousing, for instance).
Some say that perception is reality, but you understand the truth—deception is reality. All other truths are merely a matter of perspective. You're connected to cosmic forces that can't be observed or measured; you draw your power from the inconsistencies between individuals' understandings of socalled concrete reality.
* ''Associated Deities:'' Calistria, the Eldest, Eloritu, Lamashtu, Nyarlathotep
* ''Associated Skills:'' [[Bluff]] and [[Sense Motive]]
* ''Spells:'' 1st—//[[charm person]]//; 2nd—//[[make mischief]]//; 3rd—//[[charm monster]]//; 4th—//[[confusion]]//; 5th—//[[modify memory]]//; 6th—//[[subjective reality]]//
!! Invoke Delusion (1st)
You can reach into others' minds and distort their perceptions of friend or foe. As a standard action, select a creature within 30 feet and choose paranoia or conviviality. That creature must succeed at a Will save or suffer the chosen perceptual warp. If you chose paranoia, the target treats all other creatures as enemies and only itself as an ally, must attempt attacks of opportunity whenever any creature provokes them, and is [[shaken]] while adjacent to more than one creature. If you chose conviviality, the target treats all creatures as allies and can't attack or take hostile actions against any creature; whenever a creature affected by conviviality is attacked, it can attempt an additional saving throw against this effect. This perceptual warp lasts for 1 round, plus 1 round for every 5 mystic levels you have. Once a creature succeeds at its saving throw against this ability, it is immune to further uses for 24 hours.
!! Compelling Deception (3rd)
You can sway others into believing the unbelievable. You can spend 1 Resolve Point as part of a [[Bluff]] check to lie; if you do, you don't take penalties for the preposterousness of your story (though the presence of countervailing evidence can still cause your check to fail).
!! Transcend Truth (6th)
When you're subjected to any effect that would compel you to tell the truth or that would detect untruth in you, such as //[[discern lies]]// or //[[zone of truth]]//, you can roll the saving throw twice and take the better result. If the effect would not normally allow a saving throw, you can attempt a Will save to negate it. If you succeed at the save, you appear as if you were subject to the effect to other creatures, though you can act as you choose. This ability doesn't prevent [[Sense Motive]] checks from succeeding against you or other creatures from harboring suspicions.
!! Warp Perception (9th)
As a standard action, you can alter others' ability to perceive you. Select up to one creature that you can see for every 2 mystic levels you have. Each creature selected this way must succeed at a Will save or be unable to perceive you, as //[[greater invisibility]]//. If you spend 1 Resolve Point when you use this ability, it also baffles senses such as [[blindsense]] or [[blindsight]]. At the end of an affected creature's turn, it can attempt another save against this effect. You can end your invisibility as a move action. You can use this ability for a number of rounds each day equal to your mystic level; these rounds don't need to be consecutive.
!! Puppet Master (12th)
You can weave deception through your allies' mouths and uncover deception through their eyes and ears. Any creature linked by your [[telepathic bond]] class feature can use your [[Bluff]] and [[Sense Motive]] modifiers in place of their own modifiers, as long as you provide guidance. In addition, when an ally attempts an appropriate Bluff check, you can spend 1 Resolve Point to allow them to benefit from your compelling deception ability.
!! Mass Hysteria (15th)
When you use invoke delusion, you can spend 1 Resolve Point to affect any number of creatures within range, though you must choose the same perceptual warp for all targeted creatures. In addition, you add brutality and stupor to the list of perceptual warps you can impart with invoke delusion. A creature affected by brutality attacks the nearest creature each round to the best of its ability; if the creature is attacked, it instead attacks its attacker, as if it had been attacked while [[confused]]. If you choose stupor, the creature instead takes no action and babbles incoherently, though it isn't [[helpless]]. Unlike other warps, stupor lasts for only 1 round, and a creature that fails its save is immune to further attempts to invoke stupor for 24 hours.
!! Overrule Reality (18th)
Your lies are so powerful that reality is no longer an obstacle. When you succeed at a [[Bluff]] check to deceive a creature, that creature continues to believe the deception even if presented with direct evidence to the contrary (believing that its senses are deceiving it, other creatures are lying, and so on). In addition, your Bluff checks don't automatically fail if such evidence is present, though the creature or creatures you're attempting to deceive can attempt a Will save to disbelieve your deception. This effect lasts for 24 hours, after which time the creature responds normally to proof of deception.
You can make a demand of a crew member to try to improve his performance. You grant a +4 bonus to one specific check by succeeding at an [[Intimidate]] check (DC = 15 + 1-1/2 times your starship's tier). You must use this action before the associated check is rolled, and you can grant this bonus to an individual character only once per combat. Demand might result in negative consequences if used on NPCs, and you can't make demands of yourself.
''Critical:'' Your demand echoes throughout the starship. You can attempt the demand crew action with the targeted character one additional time during the current starship combat.
When you attempt an [[Engineering]] check to [[arm|Arm Explosives]] or [[disable|Disable Device]] an explosive, you can forgo your expertise die to attempt the check as a full action (rather than the normal required time of 1 minute to arm an explosive or 2d4 rounds to disarm an explosive).
<div class="statblock">
* ''Type'' disease (injury)
* ''Save'' Fortitude DC 18
* ''Track'' [[physical]]
* ''Frequency'' 1/day
* ''Effect'' At the impaired state, the penalties from the weakened state become permanent until the victim benefits from a //[[restoration]]// spell.
* ''Cure'' 2 consecutive saves
Demons are fiends, or evil outsiders, native to the Abyss.
* ''Traits:''
** [[immunity]] to electricity and poison
** [[resistance]] 10 to acid, cold, and fire
** gains ability to [[summon allies]]
** [[telepathy]] 100 ft.
Summoned demons are called forth from the chaotic plane of the Abyss. They are only vaguely humanoid in appearance, with hunched forms, ragged wings, and great, gaping jaws. Demons revel in destruction.
* ''Type:'' outsider (chaotic, demon, evil, extraplanar)
* ''Alignment:'' shange to CE
* ''Traits:''
** base speed increases to 30 ft.
** supernatural fly speed of 30 ft. (average), or if CR 7 or greater, supernatural fly speed of 60 ft. (average)
** [[immunity]] to electricity and poison
** [[resistance]] equal to creature's CR to acid, cold, and fire
** if base stat block has [[DR]], change to DR/good
* ''Skills:'' add [[Bluff]] and [[Intimidate]]
* ''Languages:'' Abyssal and Common
* ''Attack:'' change melee attack to bite (piercing damage)
<div class="statblock">
* ''CR'' 13; ''XP'' 25,600
* CE Medium outsider (chaotic, demon, evil, extraplanar)
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +23
* ''Aura'' radiation (20 ft.)
!!! DEFENSE
* ''HP'' 190
* ''EAC'' 26; ''KAC'' 27
* ''Fort'' +16; ''Ref'' +12; ''Will'' +14
* ''DR'' 10/good; ''Immunities'' disease, electricity, poison; ''Resistances'' acid 10, cold 10, fire 10; ''SR'' 24
!!! OFFENSE
* ''Speed'' 50 ft., fly 60 ft. ([[Su]], average)
* ''Melee'' bite +23 (6d4+19 S plus invoke mutation)
* ''Multiattack'' bite +17 (3d4+19 P plus invoke mutation), 2 claws +17 (3d4+19 S), gore +17 (3d4+19 P)
* ''Offensive Abilities'' invoke mutation
* ''Spell-Like Abilities'' (CL 13th; ranged +21)
** 1/day—//[[greater synaptic pulse]]// (DC 24), [[summon allies]] (1 pluprex or 2 [[prexian mutantspawn]], 35%), //[[waves of fatigue]]//
** 3/day—//[[animate dead]]//, //[[confusion]]// (DC 23), //[[enervation]]//, //[[mind thrust]]// (4th level, DC 23)
** At will—//[[irradiate]]// (DC 22), //[[ray of exhaustion]]// (DC 22), //[[teleport]]// (self plus 5 bulk of gear only)
!!! STATISTICS
* ''Str'' +6; ''Dex'' +4; ''Con'' +4; ''Int'' +3; ''Wis'' +2; ''Cha'' +8
* ''Skills'' [[Acrobatics]] +23, [[Bluff]] +28, [[Intimidate]] +28, [[Life Science]] +23, [[Mysticism]] +23
* Languages Abyssal, Celestial, Draconic; [[telepathy]] 100 ft.
* ''Other Abilities'' irradiate dead
!!! ECOLOGY
* ''Environment'' any (Abyss)
* ''Organization'' solitary, pair, blight (3–6), or invasion (2–4 pluprexes plus 3–6 [[prexian mutantspawn]])
!!! SPECIAL ABILITIES
''Invoke Mutation ([[Su]])'' A pluprex can wrack a living creature by biting it. The creature bitten must attempt a DC 21 Fortitude save. On a success, the creature is merely [[sickened]] for 1 round. On a failure, the victim's body undergoes several swift and painful mutations that twist limbs, alter organs, and distort features into a hideous countenance, giving it the [[overburdened]] condition for 1 minute. After this minute elapses, the creature becomes accustomed to its twisted new body, but it gains the [[encumbered]] condition permanently. This is a curse effect; its effects do not stack.
''Irradiate Dead ([[Su]])'' Undead creatures created by a pluprex are radioactive, emitting low [[radiation]] in a 20-foot radius. Once per day as a standard action, a pluprex can touch an undead creature it has created to enhance that creature's radioactive aura, permanently increasing that creature's radioactivity to medium. A pluprex cannot enhance radiation in this way to a higher level. Alternatively, the pluprex can give any undead creature a medium radioactive aura by touching it, but such auras last for only 24 hours before fading.
''Radiation Aura ([[Su]])'' A pluprex emits medium [[radiation]] in a 20-foot radius. Once per day as a swift action, a pluprex can instead emit high radiation for 1 minute.
</div>
The Abyss is a warped mirror that reflects all sinful possibility in mortal life, and as mortals advance technologically, so too advances their capacity to sin. Pluprex demons are one such modern reflection—incarnations of the cruelties and devastation wrought by those who harness the power of radiation to do harm.
A pluprex forms from the sinful soul of a mortal who, in life, gloried in the use of radiation as a weapon or who used radiation to experiment on unwilling subjects or to poison the innocent. Many pluprexes died of radiation poisoning themselves in their mortal lives. A typical pluprex stands 7 feet tall but weighs only 100 pounds.
<<section 'Prexian Mutantspawn' >>
<div class="statblock">
* ''CR'' 12; ''XP'' 19,200
* CE Medium outsider (chaotic, demon, evil, extraplanar)
* ''Init'' +3; ''Senses'' [[blindsense]] (life) 60 ft., [[darkvision]] 60 ft.; ''Perception'' +22
!!! DEFENSE
* ''HP'' 170
* ''EAC'' 25; ''KAC'' 26
* ''Fort'' +13; ''Ref'' +11; ''Will'' +15
* ''Defensive Abilities'' [[void adaptation]]; ''Immunities'' acid, disease, fire, poison; ''Resistances'' cold 10, electricity 10
!!! OFFENSE
* ''Speed'' 30 ft., fly 30 ft. ([[Su]], perfect)
* ''Melee'' claw +22 (2d12+15 F & S; critical [[burn]] 3d4)
* ''Offensive Abilities'' sabotaging compulsion (DC 21)
* ''Spell-Like Abilities'' (CL 12th)
** 1/day—//[[greater invisibility]]//, //[[logic bomb]]// (DC 21), //[[wall of fire]]//
** 3/day—//[[explosive blast]]// (DC 22), //[[mental block]]// (DC 22), //[[nondetection]]//, //[[slow]]// (DC 22)
** At will—//[[knock]]//, //[[security seal]]//
!!! STATISTICS
* ''Str'' +3; ''Dex'' +3; ''Con'' +4; ''Int'' +5; ''Wis'' +4; ''Cha'' +8
* ''Skills'' [[Computers]] +27, [[Engineering]] +27, [[Stealth]] +22
* ''Languages'' Abyssal, Celestial, Common; [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any (Abyss)
* ''Organization'' solitary, thrall team (1 plus 1–2 compelled creatures)
!!! SPECIAL ABILITIES
''Sabotaging Compulsion ([[Su]])'' Once per day as a full action, a salamoid can compel a creature to covertly commit sabotage. If the target fails a DC 21 Will saving throw, it begins enacting a plan dictated by the salamoid to cause maximum loss of sapient life with a minimum chance of detection. The compelled creature makes all efforts to avoid being discovered, including acting normally while being observed and eliminating evidence of its actions. It retains no memory of the sabotage it enacts or the demon. This effect lasts for 12 days. However, at the end of each day, as well as when the target undertakes any action that threatens its own safety, the target can attempt a new saving throw to end the effect. Once the effect ends, no salamoid can affect the creature with this ability for 24 hours. This is a mind-affecting effect, but non-mindless undead are not immune to it.
</div>
Throughout the galaxy, constructed environments make life possible in even the most hazardous environments, but the failure of such infrastructure can result in ghastly tragedies. The salamoid, or flashfire demon, embodies the threat and chaos of such sudden disasters.
Salamoids are master saboteurs, using the inherent dangers of malfunctioning systems to slaughter innocents. They prefer methods that result in abrupt, catastrophic failures that minimize the chance for survivors. Their name derives from their common tactic of sabotaging life support systems to increase oxygen in a closed atmosphere such that a spark causes an explosive fire. However, these demons are endlessly creative in their schemes. They experiment with new methods to freeze, asphyxiate, dissolve, electrocute, explode, or obliterate their victims.
Grand acts of sabotage are difficult tasks, and direct intervention could reveal a salamoid's involvement to their victims. Therefore, salamoids "recruit" help whenever possible using their sabotaging compulsion ability while they lurk in the nearby shadows.
Demons are fiends, or evil outsiders, native to the Abyss.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
You can attempt an [[Intimidate]] check with a –5 penalty to demoralize your foes as a reaction. Compare the result of this check to the DC of each creature that took damage from this attack using the guidelines from the demoralize task of the Intimidate skill.
As a standard action, you can use Intimidate to cause a creature within 30 feet of you to become shaken for a number of rounds. This is a sense-dependent ability. The DC of this check is equal to either 10 + your opponent's total Intimidate skill bonus, or 15 + 1-1/2 × the opponent's CR, whichever is greater. If you succeed, the target is [[shaken]] for 1 round. The duration increases by 1 round for every 5 by which the result of your check exceeds the DC.
This unique system, an innovation of the raxilites, allows up to four of a biomechanical starship's crew members to bond their nervous systems to the dendritic filaments of the vessel's computer. Most [[biomechanical]] ships have an empathetic response, but a dendritic interface's connection allows for a much higher level of clear communication, akin to limited telepathy between connected crew and the computer. It takes 1 round of starship combat for a crew member to become bonded with the dendritic interface, and doing so must be that crew member's action for that round. A bonded crew member can reduce penalties to crew actions by 2. In addition, a bonded engineer gains a +2 insight bonus to the hold it together, patch, and quick fix crew actions, as well as checks to repair systems outside starship combat.
<div class= "table-wrapper">
|System | PCU | Cost (in BP) |h
|dendritic interface | 5 | 10 |
</div>
A living defense designed by the Xenowardens, dendron armor melds bioengineered wood with advanced microbe-spun polymers. A mossy layer beneath this outer shell provides cushioning and life support. Xenowardens stylize this heavy armor to resemble the sentient trees found on Castrovel and other verdant worlds. The organic design of dendron armor makes adding upgrades a challenge, but it offers a good balance between mobility and protection.
Each model of dendron armor has features based on a species of tree believed to have been native to lost Golarion. The least is the humble ash, followed by the supple yew, the hardy oak, and finally the majestic sequoia.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br>Bonus | KAC<br>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br>Slots | Bulk |h
|dendron armor, ash | 4 | 2,100 | +5 | +8 | +3 | –2 | –5 ft. | 0 | 2 |
|dendron armor, yew | 7 | 6,600 | +10 | +13 | +3 | –2 | –5 ft. | 1 | 2 |
|dendron armor, oak | 10 | 18,450 | +14 | +17 | +3 | –2 | –5 ft. | 2 | 2 |
|dendron armor, sequoia | 17 | 256,500 | +23 | +25 | +4 | –2 | –5 ft. | 5 | 2 |
</div>
A conical helm of battered metal, a //dented kasa// is a headgear with a history. Helmets of this sort belonged to veteran warriors of ages past, each dent representing a potentially mortal blow the kasa deflected. You wear the kasa by incorporating it into part of your armor's headwear. The helmet counts as a worn magic item unless you install it in armor, taking up one [[upgrade slot|Armor Upgrades]].
While wearing the //dented kasa//, you gain a +2 enhancement bonus to saving throws against critical hit effects. In addition, when you take a critical hit, you can spend 2 Resolve Points as a reaction to negate the resulting extra damage and critical hit effect. When you do so, the kasa gains a new dent, scratch, or other mark.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//dented kasa// | 5 | 3,000 | 1 |
</div>
This fist-sized pellet was developed on the swampy world of Atachuuva as a dual-purpose safety measure. Methane vents and peat bogs are common amid the planet's swamps, the risk of fire remains high, and the oversized insect life on the planet poses a threat to any settlement. A //deoxy pellet// offers some protection against these risks, and has gained some fame through the system due to a lighthearted marketing campaign based on the slogan, "Break in case of fire or giant bug!"
You can crush a //deoxy pellet// as a full action that provokes attacks of opportunity. The magically enhanced chemical mixture within makes it so oxygen within a 30-foot radius of the point you break the pellet doesn't easily diffuse to feed fire or flow into the spiracles of insects and other creatures that lack active breathing mechanisms. Natural fire goes out, and the [[burning]] condition deals half damage. In addition, vermin larger than Tiny are [[sickened]] while in the area (no saving throw). The change in oxygen persists for 5 rounds, but a light or moderate wind lowers the duration to 3 rounds, and a strong or stronger wind lowers the duration to 1 round.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//deoxy pellet// | 3 | 250 | L |
</div>
The creature is dependent on a substance, a sense, or something else to either survive or function normally. If the creature is dependent on something to live (such as water), it can survive without that thing for a number of minutes equal to 5 × its Constitution modifier. Beyond this limit, the creature runs the risk of negative effects, such as suffocation or death. A creature that is dependent on something to function normally (such as a creature with [[blindsight]] and no visual sense) usually gains a negative condition when it loses that thing.
//Format:// ''Weaknesses'' [[blindsight]] dependency.
You activate a starship weapon with the [[deployed]] special property, deploying a drone into a hex adjacent to your starship at the beginning of the next round.
A weapon with this special property consists of a launcher containing tiny armed drones that chase and attack nearby foes. A gunner can launch a drone by performing the [[deploy drone]] gunner action, causing the drone to appear in an adjacent hex at the beginning of the next round. The drone has a speed of 4 and good maneuverability (turn 1). It can perform one crew action and one minor crew action per round, though these actions are limited to [[fly|Fly (pilot action)]], [[glide]], [[shoot]], and [[snap shot]], with total [[Piloting]] and gunnery bonuses equal to the launching starship's tier. The drone attacks only targets that are within its weapon's first range increment, and a drone can make only three attacks before expending its energy reserves and becoming disabled. For all other purposes, a deployed drone functions as a Tiny starship with an AC and TL equal to 12 + the launching starship's tier and total HP equal to twice the launching starship's tier. A drone lacks shields, has no quadrants, and does not take critical damage.
Deployed weapons can't already have the [[limited fire]] special property, and these weapons can be mounted on only a Medium or larger starship. A deployed weapon gains the [[automated]] and [[limited fire]] 3 special properties.
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 standard action
* ''Range'' close (25 feet + 5 ft./2 levels)
* ''Targets'' 1 creature
* ''Duration'' 1 round/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
You strip the target creature of key knowledge. Choose one skill; for the duration of the spell, the target takes a –4 penalty to the chosen skill. If you choose [[Culture]], this also strips the target of up to 4 languages, determined randomly. This spell cannot leave the target without any language or capacity to speak; they retain at least the ability to speak Common or the language of their home world.
<div class="statblock">
* ''Tier'' 4
* NE Small starship undead
* ''Speed'' 8; ''Maneuverability'' good (turn 1)
* ''AC'' 19; ''TL'' 16
* ''HP'' 90; ''DT'' —; ''CT'' 18
* ''Shields'' 60 (forward 15, port 15, starboard 15, aft 15)
* ''Attack (Forward)'' howling souls (3d4 plus [[numbing]]; 10 hexes)
* ''Attack (Aft)'' soul fragments (3d4; 10 hexes)
* ''Attack (Turret)'' soul fragments (3d4; 10 hexes)
* ''Other Abilities'' [[fearsome]], ghosts in the machine, living starship, shadeswarm, [[teleportation|Teleportation (starship special ability)]], [[void adaptation]]
!!! CREW ACTIONS
* ''Engineer (1 action)'' [[Engineering]] +10 (4 ranks)
* ''Gunner (2 actions)'' gunnery +9 (4th level)
* ''Magic Officer (1 action)'' [[Mysticism]] +15 (4 ranks)
* ''Pilot (1 action)'' [[Piloting]] +10 (4 ranks)
!!! ECOLOGY
* ''Environment'' any vacuum
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Ghosts in the Machine ([[Ex]])'' A derelict shade's weaponry carries fragments of its crew's souls. If the derelict shade deals Hull Point damage to an enemy ship, these fragments infect the ship's systems and cause one randomly determined system to gain the [[glitching]] condition until the end of the next round, regardless of the amount of damage dealt. If the damage dealt would already give the system the glitching condition, it instead gains the [[malfunctioning]] condition until the end of the next round. A system that is already malfunctioning or wrecked is not affected.
''Living Starship ([[Ex]])'' A derelict shade is an undead creature so immense that it functions as a starship (and thus engages only in starship combat). The ghostly remnants of the crew members, functioning as a unified whole, can take engineer, gunner, magic officer, and pilot actions using the bonuses, level, and ranks listed above. Modifiers for its size, speed, and maneuverability have already been factored into its statistics. Use the following table to determine the effects when a derelict shade takes critical damage.
<div class="table-wrapper">
| d% | System |Effect |h
| 1–30 | weapons array |@@.constrained Randomly determine one arc containing weapons; condition applies to all gunner actions using weapons in that arc.@@ |
| 31–60 | propulsion |@@.constrained Condition applies to all pilot actions.@@ |
| 61–90 | marrow |@@.constrained Condition applies to all engineer and magic officer actions, except when patching or repairing the marrow.@@ |
| 91–100 | core† |@@.constrained During the next round, each of the derelict shade's attempted actions has a 25% chance of failure.@@ |
|† A derelict shade's core doesn't gain critical damage conditions. |<|<|f
</div>
''Shadeswarm ([[Ex]])'' When using its teleportation ability to appear adjacent to a starship that has no shields remaining in one or more quadrants, a derelict shade can attempt a check using its gunnery bonus as part of using its teleportation. If the result is equal to or greater than the adjacent ship's AC, any living crew members aboard the starship are swarmed by spirits from the derelict shade. Each affected creature must succeed at a DC 11 Will save or be unable to act until after the next round's helm phase.
</div>
On occasion, when an entire starship crew is killed upon destruction of their starship—whether by accident or malice—a derelict shade forms from the remains. Although derelict shades are not true ghosts, as the crew members' souls do move on, the terror of their last moments causes fragments of their souls to combine and rise as a single creature, taking the form of their old ship.
Cunning and cruel, a derelict shade seeks only to inflict on other ships the same pain that it suffered. Though it stays away from larger fleets, it eagerly attacks lone ships that it views as easy prey; if destroyed, such ships often give rise to derelict shades themselves.
You line your skin with hardened composite plates that deflect physical attacks. You gain an amount of [[damage reduction]] that depends on the model of your dermal plating. If you have natural damage reduction equal to or greater than your dermal plating, adding dermal plating increases the value of your natural DR by 1. If you have natural DR of a value less than your dermal plating, the value of DR from your dermal plating increases by 1.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|dermal plating, mk 1 | 5 | 3,025 | skin |
|dermal plating, mk 2 | 7 | 6,950 | skin |
|dermal plating, mk 3 | 9 | 17,975 | skin |
|dermal plating, mk 4 | 12 | 48,850 | skin |
|dermal plating, mk 5 | 14 | 105,000 | skin |
|dermal plating, mk 6 | 16 | 163,500 | skin |
|dermal plating, mk 7 | 19 | 542,000 | skin |
</div>
This oblong box the length of a human hand contains several hypoallergenic staples and a mass of sticky antiseptic gel. You use the dermal stapler by pressing it onto a willing or unconscious living creature's wound; the dermal stapler launches one of its staples into the wound to close it and slathers the staple with the antiseptic gel. You can use a dermal stapler on a willing or unconscious creature to automatically end the [[bleeding]] condition without a [[Medicine]] check. Alternatively, you can use it in conjunction with a [[medkit]] to treat deadly wounds and gain a +1 insight bonus to your Medicine check. In addition to consuming a charge with each use, a dermal stapler must synthesize new staples and gel after 20 uses, at a cost in UPBs equal to one-quarter the stapler's price.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|dermal stapler | 3 | 1,200 | L | 20 | 1/use |
</div>
Developed by kasathan engineers long ago to help them navigate the steep cliffs of their native Kasath, descent thrusters are miniature jets that slow your fall. You fall at a rate of only 60 feet per round, and you take no damage upon landing. You can trigger descent thrusters as part of an action when jumping down, or as a reaction if you fall.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk |h
|descent thrusters | 1 | 800 | 1 | any | L |
</div>
You can twist your body as you fall to ensure you land on your feet.
''Prerequisites:'' Constructed species trait, construct type, or cybernetic augmentation installed in spinal column.
''Benefit:'' Whenever you fall, you don’t land [[prone]], even if you take damage from the fall.
''Normal:'' A character who takes damage from a fall lands prone.
A descriptor is a term that helps define an item, a spell, or another effect in some way. Some effects have more than one descriptor, each of which further refines the ways the effect works and interacts with the world around it, while others have none. Even equipment sometimes has descriptors.
The descriptors are as follows: acid, air, calling, chaotic, charm, cold, compulsion, creation, curse, darkness, death, disease, earth, electricity, emotion, evil, fear, fire, force, good, healing, language-dependent, lawful, light, mind-affecting, pain, poison, radiation, scrying, sense-dependent, shadow, sonic, summoning, teleportation, and water.
Most of these descriptors have no game effect by themselves; they instead describe how spells or effects interact with certain other spells or effects. Some descriptors provide additional information about how the effect to which they are attached operates, as defined below.
!! Calling
A calling effect transports a creature from another plane to the plane you are on. The effect grants the creature the one-time ability to return to its plane of origin, although the effect might limit the circumstances under which this is possible. Creatures who are called die if they are killed on the new plane. A called creature can't be dispelled, even if it was called by magical means.
!! Charm
A charm effect changes how the subject views you. This gives you the ability to befriend and suggest courses of action to another creature, but its servitude is not absolute or mindless. Essentially, a charmed character retains free will but makes choices according to a skewed view of the world.
A charmed creature retains its original alignment and allegiances, generally with the exception that it now regards the person who charmed it as a dear friend and gives great weight to that character's suggestions and directions. A charmed creature does not volunteer information or tactics that its master doesn't ask for. A charmed creature never obeys a command that is obviously suicidal or grievously harmful to it.
A creature fights friends it had before being charmed only if they threaten its new friend. Even then, it uses the least lethal means at its disposal, for it wishes to resolve the conflict without causing real harm.
A charmed creature can attempt an opposed Charisma check against its master in order to resist instructions or commands that would make it do something it wouldn't normally do even for a close friend. If it succeeds at this check, it decides not to go along with that particular order but remains charmed. If the creature's master commands it to perform an action that the creature would be vehemently opposed to, it can attempt a new saving throw to break free of its master's influence altogether.
If a charmed creature is openly attacked by the character who charmed it or by that character's apparent allies, it is automatically freed of the spell or effect.
!! Compulsion
A compulsion effect overrides the subject's free will in some way, forcing the subject to act in some manner or changing the way its mind works.
!! Creation
A creation effect manipulates matter to create an object or creature in the place the creator designates. If the effect has a duration other than instantaneous, magic or some other energy holds the creation together, but when the duration ends, the created creature or object vanishes without a trace. If the effect has an instantaneous duration, the created object or creature does not depend on any outside energy for its existence, so it lasts indefinitely once created.
!! Force
A force effect deals full damage to [[incorporeal]] creatures and blocks their movement. It also blocks the [[sense through]] ability.
!! Language-Dependent
A language-dependent effect uses intelligible language (either audible, visual, or telepathic) as a medium for communication. If you cannot communicate with the target or the target cannot understand what you are communicating, the effect fails to affect that target.
!! Mind-Affecting
A mind-affecting effect works only against creatures with an Intelligence score of 1 or higher.
!! Pain
A pain effect causes unpleasant sensations but not permanent physical damage. Creatures that are immune to effects that require a Fortitude save are immune to pain effects.
!! Scrying
A scrying effect creates an invisible magical sensor that sends you information while the effect lasts. Unless noted otherwise, the sensor has the same sensory abilities that you have naturally, but not any sensory abilities you gain from other spells or technology. The sensor is a separate, independent source of sensory input for you, and thus it functions normally even if you have been blinded or deafened or otherwise suffer sensory impairment.
A creature can notice a scrying sensor with a successful [[Perception]] check (DC = 20 + the spell or effect's level). The sensor can be dispelled as if it were an active spell. Lead sheeting, force fields, and some exotic materials and magical protections block scrying effects; if that is the case, you can sense that the effect has been blocked.
!! Sense-Dependent
A sense-dependent effect has either audible or visual elements, requiring sight or hearing to have any effect. For this kind of effect to affect that target, you must be able to either see or hear the target, and the target must be able to either see or hear you.
!! Shadow
A shadow effect creates something that is partially real from an amalgamation of extradimensional energy. Damage dealt by a shadow effect is real.
!! Summoning
A summoning effect instantly brings a creature or object to a place you designate. When the effect ends or is dispelled, a summoned creature is instantly sent back to where it came from (typically another plane, but not always), but a summoned object is not sent back unless the effect description specifically indicates otherwise. A summoned creature also goes away if it is killed or if its Hit Points drop to 0, but it is not really dead. It takes 24 hours for the creature to reform in the place from which it was summoned, during which time it can't be summoned again.
When a summoning effect ends and the summoned creature disappears, all spells it has cast expire. A summoned creature cannot use any innate summoning abilities it may have.
!! Teleportation
A teleportation effect involves instantaneous travel through the Astral Plane. Anything that blocks astral travel also blocks teleportation unless the specific effect notes otherwise, and teleportation effects work within the Drift.
The arid conditions of a desert breed tough creatures. Many
desert creatures also have the arctic or thermic environmental
graft, representing particularly cold or hot deserts.
* ''Burrowing:'' A few desert creatures can burrow through sand, dust, and parched soil, gaining a typical burrow speed.
* ''Thirst Inured:'' You can allow desert creatures to go without water for as long as most creatures can go without food without it counting against their number of special abilities.
* ''Skills:'' [[Survival]] (master)
Having evolved on a desert world, [[kasathas]] have little trouble traversing such terrain. Struts installed within your legs or fibers laced within your leg muscles (or similar locomotive appendages) allow you to move through nonmagical difficult terrain in deserts, hills, and mountains at your normal speed.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|desert stride graft | 2 | 480 | all legs |
</div>
Desert terrain exists in cold, temperate, and warm climates, but all deserts share one common trait: very little precipitation. The three categories of desert terrain are tundra (cold desert), rocky deserts (often temperate), and sandy deserts (often warm). The most common rules sections to reference for adventures in these areas are [[Cold Dangers]], [[Heat Dangers]], [[Starvation and Thirst]], and [[Weather]].
!! Stealth And Detection In The Desert
In general, the maximum distance in desert terrain at which a creature can succeed at a [[Perception]] check to detect the presence of others is 6d6×20 feet; beyond this distance, elevation changes and heat distortion in warm deserts makes sight-based Perception checks impossible. The presence of dunes in sandy deserts limits spotting distance to 6d6×10 feet. The scarcity of undergrowth or other elements that offer concealment or cover makes using [[Stealth]] more difficult.
''Frame Cost (25%):'' In addition to a plethora of deadly weapon mounts, expensive frames often provide a huge number of HP, making their starships nearly impossible for lower-tier starships to threaten. In addition, larger starships may require additional crew that the PCs lack, and spending too much on a frame leaves too few BP to equip the ship properly.
''Armor and Defensive Countermeasures (25%):'' Especially for smaller starships, heavy investment in defenses can make a starship nearly invincible—often while leaving too few BP to purchase suitable weapons, making them extremely safe but boring combatants. Limiting armor to a modest amount incentivizes clever maneuvering.
''Power Core (15%):'' A starship's power core affects how quickly an engineer can restore Shield Points by using the divert action, and limiting the power core's size gives enemy starships an opportunity to pierce the vessel's shields before they can be fully repaired.
''Weapons (35%):'' Careful optimization of a starship's weapons can result in utterly devastating arsenals capable of completely destroying a potent enemy starship with a few good shots. Limiting a starship's maximum firepower extends combat by a few rounds without severely impacting the ship's lethality.
In addition, consider turrets' extreme versatility: by moving most of a starship's weapons to a turret, the ship's facing becomes less relevant, and starship combat becomes more static. Consider allowing no more than 15% of a starship's BP to be spent on turrets and turret-mounted weaponry in order to encourage movement and stunt use.
''Shields (10%):'' Smaller starships in particular can inexpensively mount thick shields that are almost insurmountable by low-tier starships, dramatically multiplying their durability and turning most combats into lengthy slogs. By limiting a starship's shield upgrades, a starship can still have solid defenses without completely eliminating any chance of sustaining real harm—particularly at tier 10 and lower.
''Unrestricted:'' Many other systems—including computers, Drift engines, expansion bays, security, and thrusters—are unlikely to change the dynamics of starship combat if the crew invest in them heavily, and thus have no maximum BP budget. However, some security systems can dramatically skew in-person encounters if not reined in. To this end, consider limiting the maximum level of any antipersonnel weapon to the starship's tier, and consider restricting the maximum rank of a shock grid countermeasure to one-third the starship's tier, rounded down.
When designing a starship chase, use the following guidelines to help you build a balanced encounter. The following instructions are provided for chases with 6 checks. If you want to have a shorter chase, remove checks and adjust the outcome accordingly by subtracting the required number of successes for each outcome; if you want a longer chase, add to the number of checks and required successes instead.
''Determine Challenge Rating:'' Most starship chases should have a Challenge Rating equal to the PCs' average party level and award XP as a combat encounter of that CR.
''Determine Skill Check DCs:'' Reference [[]]Table: Chase Skill Check DCs, using the starship chase's CR.
''Environmental Effects and Obstacles:'' Decide whether to include any [[environmental effects]] or custom obstacles based on the circumstances of the chase, and take note of their details.
To design a new trap, decide what CR you want the trap to have and consult [[Table: Trap Statistics]] for guidance on the various statistics of a trap at that CR. These are only guidelines, however. Feel free to adjust a trap's statistics, though you should avoid changing these numbers to values corresponding to a CR more than 2 higher or lower than the trap's CR.
* ''Perception and Disable DCs:'' All traps require Perception and disable DCs. If the trap requires multiple checks to disable, use the DC for a trap with a CR 2 lower than your trap. If the trap has a bypass mechanism, use this DC for detecting and disabling the bypass as well.
* ''Initiative:'' If it is important when your trap acts in combat, use this bonus to calculate the trap's initiative.
* ''EAC/KAC:'' If the mechanical parts of your trap can be attacked, these values help determine how easy they are to hit.
* ''Good and Poor Saves:'' If PCs use special attacks that can target objects against the trap, these values can be used for the trap's Fortitude and Reflex saves. You decide which is a good save and which is a poor save for your trap. Traps don't normally need Will saves, but if necessary, a trap's Will save is a poor save.
* ''HP:'' Crucial parts of some traps can be damaged and should have the listed number of Hit Points. Traps are immune to anything an object is immune to unless otherwise noted. Traps also have hardness based on their material. A trap reduced to 0 HP is destroyed. Destroying a trap might set off a final component of the trap, like an explosion. Traps never have Stamina Points.
* ''Attack and Damage:'' The table lists the trap's attack bonus and its average damage, if any, but consider reducing this damage if a trap has multiple attacks or affects multiple targets.
* ''Save DC:'' If a trap affects its victims by means of an area effect, a spell, a poison, or another special ability, use the listed DC for the appropriate saving throw.
<<section 'Table: Trap Statistics' >>
An encounter is any event that presents the PCs with a specific problem that they must solve. Most encounters involve combat with monsters or hostile NPCs, but there are many other types: a corridor full of robotic traps, a fraught negotiation with government authorities, an environmental hazard on a strange planet, an encrypted database that needs to be hacked, or anything else that adds drama to the game. Some encounters involve puzzles, interpersonal interactions, physical feats, or other tasks that can be overcome entirely with roleplaying and skill checks, but the most common encounters are also the most complex to build—combat encounters.
When designing a combat encounter, decide what level of challenge you want your PCs to face and follow the steps below.
!! Step 1: Determine APL
The first thing you need to do is determine your players' Average Party Level (APL), which represents how much of a challenge the group can handle. To get this number, add up the levels of all characters in the party, divide the sum by the number of party members, then round to the nearest whole number (this is an exception to the usual "round down" rule). If the group contains fewer than four characters, subtract 1 from the result; if the group contains six or more characters, add 1 to the total. For example, if a group has six characters, two at 4th level and four at 5th level, its APL is 6 (28 total levels divided by six characters equals 5 after rounding up, and 1 is added for having six characters).
!! Step 2: Determine CR
Challenge Rating (CR) is a convenient number used to indicate the relative danger presented by an enemy, trap, hazard, or other encounter; the higher the CR, the more dangerous the encounter. Refer to [[Table: Encounter Difficulty]] to determine the Challenge Rating your group should face depending on the difficulty of the challenge you want and the group's APL.
!! Step 3: Build The Encounter
Determine the total experience point (XP) award for the encounter by looking up its CR on [[Table: Experience Point Awards]]. This gives you an "XP budget" for the encounter. Every creature, trap, and hazard is worth an amount of XP determined by its CR, as noted on the table. To build your encounter, simply add creatures, traps, and hazards whose combined XP does not exceed the total XP budget for your encounter. It's easiest to add the highest CR challenges first and then reach the total by including lesser challenges.
For example, let's say you want your group of six 11th-level PCs (APL 12) to face a hard encounter on Eox against a crafty necrovite (CR 13) and some elephantine ellicoths (CR 9 each). [[Table: Encounter Difficulty]] indicates to you that a hard encounter for a group of APL 12 is equivalent to CR 14. According to [[Table: Experience Point Awards]], a CR 14 encounter has an XP budget of 38,400 XP. At CR 13, the necrovite is worth 25,600 XP, leaving you with 12,800 XP to spend on ellicoths. Ellicoths are worth 6,400 XP apiece, so the encounter can support two ellicoths in its XP budget. Or you could skip the necrovite and use three ellicoths instead, leaving you with 19,200 XP to spend on other creatures or hazards (perhaps a CR 12 creature that shares the ellicoths' lair).
!! Special Considerations
Creating fun and balanced encounters is both an art and a science. Don't be afraid to stray from the formulas by making changes— sometimes called ad hoc adjustments—that you think will make the encounter more fun or manageable for your particular party. In addition to the basic rules above, consider whether any of the following factors might apply to your encounter.
!! Adding NPCs
Creatures with abilities that match a class, such as creatures that belong to the PC races detailed in this book, function differently than creatures with substantial innate abilities. Their power comes more from gear than from nature, and they might have skills and abilities similar to those of PCs. Generally, the CR of an NPC equals the level of a PC with the same abilities—for example, an NPC with abilities similar to a 2nd-level technomancer would be CR 2. An NPC usually has armor and a weapon each with a level equal to its CR, give or take a level, and possibly one or two more items of a level equal to its CR.
!! CR Equivalencies
The sheer number of experience points involved in building high-CR encounters can seem daunting, especially when you're trying to craft an encounter on the fly. When using a large number of identical creatures, [[Table: CR Equivalencies]] can simplify the math by combining them into one CR, making it easier to find their total XP value. For example, using this table, you can see that four CR 8 creatures (worth 4,800 XP each) are equivalent to one CR 12 creature (worth 19,200 XP). You can also use this table to work backward and build encounters with much less math. Need a CR 7 encounter using CR 4 creatures? Just check the table, and you'll see that you need three CR 4 creatures to create a CR 7 encounter.
!! Terrain Factors
An encounter against a creature that's out of its favored element (like an enormous dragon encountered in a tiny cave) gives the PCs an advantage. In such a situation, you should probably build the encounter as normal—you don't want to accidentally overcompensate and kill your party—but when you award experience for the encounter, you may want to do so as if the encounter were 1 CR lower than its actual CR.
The reverse is also true, but only to an extent. Creature CRs are assigned with the assumption that a given creature is encountered in its favored terrain. Encountering a water-breathing kalo in an underwater area shouldn't increase the XP you award for that encounter, even if none of the PCs breathe water. But if the terrain impacts the encounter significantly, you can increase the XP award as if the encounter's CR were 1 higher. For example, an encounter against a creature with blindsight in an area with no natural light needs no CR adjustment, but an encounter against the same creature where any light brought into it is suppressed might be considered +1 CR.
As a general rule, the goal of ad hoc XP adjustments based on factors like terrain is not to penalize PCs for doing well, but to make sure they're being challenged and rewarded appropriately.
!! Gear Adjustments
You can significantly increase or decrease the power level of an NPC by adjusting its gear, particularly its weapons or crucial items such as powered armor. An NPC encountered with no gear should have its CR reduced by 1 (provided that the loss of gear actually hampers it). An NPC with better gear than normal—such as a weapon with 2 levels higher than the NPC's CR or a large number of items with a level equal to its CR—has a CR of 1 higher than normal. This equipment impacts your treasure budget, so make overgeared NPCs like this with caution.
!! Tactical Considerations
Just as a player slowly learns how to use his character's abilities, so does a GM learn how to best deploy her collection of foes. CR can't cover every situation, so a GM should think through both a creature's abilities and the encounter's setting for any potential pitfalls.
One major concern is the CR of the enemy. The CR system works best when the CR of each of the GM's creatures is relatively close to the PCs' Average Party Level. It might be tempting to throw a single higher-CR creature against the party, and sometimes that works out fine, but you may run the risk of obliterating the party when their saving throws aren't yet high enough to protect against the creature's abilities. Conversely, if you throw a horde of CR 1 creatures against your party with an APL of 8, those creatures are unlikely to hit the characters' Armor Classes or succeed with any of their abilities, and thus they won't be challenging, no matter how many you include.
Yet just as a tidal wave of low-CR enemies can become a tensionless slog for players, fighting a single opponent can also be a bore, depending on that opponent's abilities. A lone technomancer without any bodyguards or defenses in place might find himself quickly surrounded or unable to cast his spells after being grappled, and a creature with a single powerful attack might still not be a great match for a party of five slightly less powerful characters due to the sheer number of attacks they have each round. In general, the strongest encounters have a handful of enemies that guard vulnerable creatures with powerful abilities and balance out the PCs' number of actions each round.
<<section 'Table: Encounter Difficulty' >>
<<section 'Table: CR Equivalencies' >>
<<section 'Table: Experience Point Awards' >>
From a simple skirmish against pirates to a massive fleet engagement, designing a fun and challenging space combat requires thoughtful planning and careful design on the part of the GM. A crew of PCs can't simply spend their hard-earned credits to upgrade their starship between encounters as they could with ordinary gear. In addition, often due to the circumstances of the story, the characters might find themselves in a ship that is significantly more or less powerful than their Average Party Level might indicate. The GM needs to take these factors into account when deciding what sort of enemies the PCs will face.
!! Challenge
Combat between starships of equal tiers is more evenly matched than a fight between PCs and opponents of an equal CR. Usually, there is only one PC ship in the fight, containing the entire party. This means that if the battle is lost, the PCs might be taken captive or perish. As a result, starship combats where the PCs face off against a ship of equal tier and capability are very difficult. Most encounters should be against ships of a lower tier. Use the following table as a guideline.
<div class= "table-wrapper">
| Difficulty | Enemy Starship Tier |h
| Easy | PC starship tier – 3 |
| Average | PC starship tier – 2 |
| Challenging | PC starship tier – 1 |
| Hard | PC starship tier |
| Epic | PC starship tier + 1 |
!! Multiple Ships
If the PCs have more than one starship, use the highest-tier ship's tier as a base and add 1 to this value for each additional starship within at least 2 tiers of that starship. If none are within 2 tiers, add up the tiers of all the additional starships and add 1 to the base value if the total is equals or exceeds the base starship's tier. Use this modified value when determining the encounter's difficulty.
If there are multiple enemy starships, treat every pair of enemy starships of the same tier as a single starship of the pair's tier + 2 (and every trio as a single starship of the trio's tier + 3). If there are a number of ships of different tiers, use the formula for multiple PC ships to determine the final difficulty. For example, if the enemy consists of three tier 1 starships, a tier 4 starship, and a tier 7 starship, the final result would be a tier 8 challenge.
!! Crew Level
Most starship combat encounters are between characters of roughly equal level and skill, regardless of the tier of the starships they are aboard. If there is a large level discrepancy between the combatants, adjust the difficulty of the encounter up or down a tier to compensate. In any case, combats between crews that are more than 4 levels apart should be avoided.
In general, the skill ranks of an NPC crew member are equal to the CR of the NPC or the tier of the enemy starship (minimum 1). To determine the skill modifiers of an NPC crew member, first decide whether the NPC has mastered the skill or is simply good at the skill. Usually, one crew member will be a master at one skill; the rest of the crew will have good skills. The skill modifier for a master skill is equal to 9 + 1-1/2 × the NPC's ranks in the skill. The skill modifier for a good skill is equal to 4 + 1-1/2 × the NPC's ranks in the skill. Alternatively, you can determine NPC skill ranks and modifiers using the master and good skill modifiers for the combatant array from the monster building rules in the Starfinder Alien Archive. Of course, if you have full stat blocks for the NPC crew members, you should use their actual skill ranks and modifiers.
!! Experience For Starship Combat
PCs should earn experience points (XP) for defeating enemy ships. To award XP, compare the difficulty of the encounter (see Challenge above) to Table 11–1: Encounter Difficulty on page 390 to find the Challenge Rating equivalent of the encounter. Look up the value of that CR on Table 11–3: Experience Point Awards (also on page 390) to find the party's XP award for the encounter.
For example, suppose the PCs have an Average Party Level (APL) of 10 and are flying a tier 10 starship. They encounter and defeat a tier 9 enemy starship. As the enemy starship's tier equals the PCs' starship's tier – 1, this was a challenging encounter. Looking at Table 11–1: Encounter Difficulty, a challenging encounter has a CR equivalent of APL + 1, making it a CR 11 encounter. The PCs should earn 12,800 XP total for the encounter.
Desolation endlings can appear when a species goes extinct due to destruction of its habitat through technological means. Whether through industrial deforestation of an ancient wood or damming a river for hydropower, desolation endlings despise the structures built in place of their homes and the destructive technology used to that end.
* ''Required Creature Type and Subtype:'' Undead (incorporeal).
* ''Suggested Alignment:'' Neutral.
* ''Traits:''
** one size larger than the creature was in life
** rejuvenation (see below)
** antitech natural weapon (see below)
** demolition (CR 3+; see below)
* //Antitech Natural Weapons ([[Su]]):// As an attack, a desolation endling can temporarily cause a body part to become substantial. This functions as a natural weapon that the species had in life, dealing a damage type that the living counterpart's natural attack dealt. A creature hit by this attack must attempt a Reflex save. On a failure, a random hybrid or technological item worn or wielded by the target ceases to function for 1 round, and if the target is a technological construct, it is [[shaken]] for 1 round.
* //Demolition ([[Su]]):// A desolation endling's antitech natural weapons ignore an amount of [[hardness]] equal to twice its CR. When performing a sunder combat maneuver, a desolation endling gains a +4 insight bonus to its attack roll.
* //Rejuvenation ([[Su]]):// An endling can't be destroyed by violence—an endling reduced to 0 Hit Points dematerializes but restores itself in 2d4 days. The only way to permanently destroy an endling is to determine the reason for its extinction and perform some action to set right whatever prevents it from resting in peace. The exact means vary with each kind of endling and are determined by the GM.
As a move action, you can cause one ally adjacent to you to not be considered [[helpless]] for the purpose of actions that can be used only against helpless creatures (such as a coup de grace). This effect ends if the creature ceases to be adjacent to you or at the beginning of your next turn, whichever comes first.
Once per day as a full action, you can call upon all your past experiences to push out a blast of energy centered on yourself. You deal 1d4 bludgeoning damage plus 1d4 additional bludgeoning damage per precog level to all creatures within 5 feet of you, including yourself. This damage has the force descriptor. A creature that succeeds at a Reflex save takes half damage; you can’t attempt a save against this effect.
As a reaction when you fail a saving throw, you can use a [[paradox]] in place of the d20 rolled for the saving throw.
Few [[damai]] are brave enough to confront the titanic colossi that roam the devastated world of Daimalko, but some have no choice. This plasma weapon not only delivers a powerful blast capable of penetrating a colossus's thick hide, but it delivers a blast of light and noise drawing the target's attention from others. Some desperation cannons are used in only one battle, unless they're later recovered from wreckage by scavengers.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|desperation cannon, rage-bringer | 4 | 2,250 | 1d12 E & F | 100 ft. | [[nuisance]] | 40 charges | 5 | 2 |[[bright]], [[penetrating]], [[unwieldy]] |
|desperation cannon, doom-caller | 10 | 18,500 | 3d12 E & F | 100 ft. | [[nuisance]] | 100 charges | 10 | 2 |[[bright]], [[penetrating]], [[unwieldy]] |
|desperation cannon, sky-piercer | 15 | 119,500 | 6d12 E & F | 100 ft. | [[nuisance]] | 100 charges | 10 | 2 |[[bright]], [[penetrating]], [[unwieldy]] |
|desperation cannon, titan-killer | 19 | 565,000 | 9d12 E & F | 100 ft. | [[nuisance]] | 100 charges | 20 | 2 |[[bright]], [[penetrating]], [[unwieldy]] |
</div>
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* NE Huge outsider (daemon, evil, extraplanar)
* ''Init'' –1; ''Senses'' [[blindsight]] (emotions) 60 ft., [[darkvision]] 60 ft.; ''Perception'' +19
!!! DEFENSE
* ''HP'' 125
* ''EAC'' 20; ''KAC'' 22
* ''Fort'' +10; ''Ref'' +12; ''Will'' +9
* ''Defensive Abilities'' [[amorphous]], harden exterior; ''Immunities'' acid, death effects, disease, poison; ''Resistance'' cold 10, electricity 10, fire 10
!!! OFFENSE
* ''Speed'' 20 ft., burrow 10 ft.
* ''Melee'' slam +20 (3d4+14 B plus [[swallow whole]])
* ''Offensive Abilities'' psychic warfare, [[swallow whole]] (3d4+14 B, EAC 20, KAC 18, 31 HP)
* ''Spell-Like Abilities'' (CL 8th)
** 1/day—[[summon allies]] (1 despondaemon, 35%)
!!! STATISTICS
* ''Str'' +6; ''Dex'' –1; ''Con'' +4; ''Int'' –3; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Sense Motive]] +19, [[Stealth]] +21 (+26 in deserts), [[Survival]]
* ''Languages'' Abyssal, Common, Infernal; [[telepathy]] 100 ft.
* ''Other Abilities'' [[compression]], emotional empathy
!!! ECOLOGY
* ''Environment'' any (Abaddon)
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Emotional Empathy ([[Su]])'' A despondaemon can intuitively read the emotions of those it senses with its [[blindsense]], knowing what emotion the target is experiencing at any given moment. They use this ability to isolate victims suffering from depression, their favorite prey.
''Psychic Warfare ([[Su]])'' A despondaemon wages emotional warfare on creatures trapped inside it, convincing
its victims of the futility of escape. A creature swallowed by the despondaemon’s [[swallow whole]] ability must attempt a DC 16 Will save at the beginning of that creature’s turn. On a failure, the creature is overwhelmed by negative emotions and is [[stunned]] for 1 turn.
''Harden Exterior ([[Su]])'' As a swift action, a despondaemon can harden its exterior, granting it a +2 circumstance bonus to AC but halving its speed. The daemon can end this effect with a swift action.
</div>
Despondaemons are huge creatures of living quicksand that hail from the desolate plains of Abaddon. These daemons arise from the souls of bureaucrats who wore down well‑meaning people with endless paperwork, soulless and dystopian bureaucracy, and policies that ignored individuals in favor of illogical rules, outdated regulations, and useless consistency. Despondaemons’ preferred method of murder is to psychically smother intended victims. Then, once the outsider has captured a vulnerable victim within their quicksand-like body, despondaemons use telepathy to exacerbate the victim’s insecurities, urging the creature to die so they can feed.
Clumsy and slow moving, despondaemons compensate by being ambush predators, typically concealing themselves within pits or as mounds of dirt. While waiting, despondaemons use their blindsight and emotional empathy, searching for victims predisposed toward depression. When they find such a creature, they lure their victim with subtle thoughts or slowly slither along the ground to attack unawares.
Dessamars are humanoid natives of Koshoria, a world bathed in violet magical auras in Azlanti space. While adults resemble bipedal butterflies, dessamars hatch from eggs as tiny larvae that grow as they mature. Azlanti call the larvae "instars," due to an error in a first-contact report. Instars eat magic plants, so their flesh is coated with hallucinogenic powder, muddling the senses of would-be predators with guilt-tinged visions. Instars are sapient, and older larvae are encouraged to explore the world on their own so they can discover their path in life before their metamorphosis into an adult. Once the larvae feel ready, they feast enough to double their size before spinning magical cocoons. About two weeks later, a dessamar adult, called an imago, emerges. Occasionally, instars refuse to transform. Though most dessamars accept older instars, adults often encourage such larvae to seek physical maturity.
Dessamar society is based largely on magic, the study of Koshorian auras, and the worship of Desna. Much like their goddess, dessamars are good-natured, whimsical, and given to exploration and self-expression. Dessamar technology is bioengineered, hybrid, or both. Their clannish social hierarchy is merit-based, with the wisest dessamars guiding the rest. Instars mostly pursue their passions, while imagos seek wisdom and mastery of a life path. However, dessamars can be peaceful to a fault, and they can seem aloof and strangely detached.
Other species find it hard to understand why, although the Azlanti Star Empire claims Koshoria, dessamars ignore the Azlanti. In turn, the Azlanti view dessamars as mere curiosities. Since the Azlanti and dessamars have no competing interests, and the Azlanti find dessamar tech mostly quaint, no clashes and little casual contact occur between the two societies. Dessamars, besides the occasional curious instar, usually avoid Azlanti enclaves. The Azlanti have yet to see any use for dessamars, resulting in some of the most harmonious Azlanti-alien relations in the empire.
Dessamars have a secret, however. The magical violet auras of Koshoria have varying and mostly innocuous effects, such as giving off constant dim light or causing mild euphoria. However, some of these eldritch energies have bizarre connections to the Dark Tapestry. Dessamars study the auras to ensure these connections never bring unwanted attention from aberrations from the dark among the stars to Koshoria. If the Azlanti, in their ignorant state, were to hinder efforts to monitor these auras, results could be disastrous.
A typical dessamar adult is around 5 feet tall and weighs only 60 pounds. A developed instar is about 3 feet tall and weighs 40 pounds. Female dessamars are most often larger and stronger than males.
!! Racial Traits
* ''Hit Points:'' 3
* ''Dessamar Magic:'' Dessamars have the spell-like abilities below, with a caster level equal to the dessamar's level.
* 1/day—//[[charm person]]//
* At will—//[[detect magic]]//, //[[telepathic message]]//
* ''Dessamar Senses:'' Dessamars have [[blindsense]] (scent) with a range of 30 feet, as well as [[low-light vision]].
* ''Twinkle:'' Once per day as a move action, a dessamar can teleport 40 feet. The dessamar can't bring other creatures along, and if a solid body occupies the arrival point, the ability fails without expending its daily use. This ability otherwise functions as the //[[dimension door]]// spell.
!!! Imagos
* ''Ability Adjustments:'' +2 Wis, +2 Cha, –2 Str
* ''Size and Type:'' Imagos are Medium humanoids with the dessamar subtype.
* ''Imago Movement:'' Imagos have a land speed of 20 feet and an extraordinary fly speed of 20 feet with average maneuverability.
* ''Dream Skill:'' Each time an imago rests for 8 hours, they can choose one skill to gain a +1 racial bonus, losing any previous bonus from this ability.
* ''Fragile Limbs:'' An imago's four arms, two legs, and six wings are fragile. The imago takes a –2 penalty to saves against [[severe wound]] and [[wound]] critical hit effects against these limbs. Extra arms don't allow an imago to make more attacks than normal, and an imago can hold objects of only light or negligible bulk in one hand, allowing it to hold up to four such objects at the ready. An imago treats one-handed objects of greater than light bulk as two-handed. Two-handed objects of 2 bulk require three hands, and objects of 3 bulk or more require four hands.
!!! Instars
* ''Ability Adjustments:'' +2 Con, +2 Wis, –2 Dex
* ''Size and Type:'' Instars are Small humanoids with the dessamar subtype.
* ''Dream Dust:'' When an adjacent creature damages an instar, as a reaction the instar can puff out dream dust. The attacker must succeed at a Fortitude save (DC = 10 + 1/2 the instar's character level + theirCon modifier) or be [[dazzled]] for 1 round and take a –2 penalty to Will saving throws for 1 minute. An instar can use this ability again after taking a 10-minute rest to recover Stamina Points.
* ''Instar Movement:'' Instars have a land speed of 30 feet and a climb speed of 30 feet.
* ''Poor Vision:'' An instar takes a –2 penalty on sight-based [[Perception]] checks, and anything farther than 60 feet away has concealment from the instar.
!! Dessamar Magic Graft
{{Dessamar Magic}}
Whether imago or instar, [[dessamars]] have intrinsic magical abilities. Technology-infused runes carved into your hands (or similar appendages) allow you to cast //[[charm person]]// once per day, as well as //[[detect magic]]// and //[[telepathic message]]// at will as spell-like abilities. The caster level for these effects is equal to your level.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|dessamar magic graft | 7 | 6,200 | all hands |
</div>
You can use Computers to repair a computer system or module that has been disabled, or destroy one that has been either removed or disabled by spending 10 minutes per tier of the computer system working on the computer. The DC is based on the tier of the computer system. If you are repairing a disabled module or system and you fail the check by 5 or more, you accidentally destroy the module or system. You can't take 20 on a Computers check to destroy or repair a computer system.
<div class="statblock">
* ''Size'' Large
* ''Maneuverability'' average (+0 Piloting, turn 2)
* ''HP'' 150 (increment 20); ''DT'' —; ''CT'' 30
* ''Mounts'' forward arc (2 heavy), port arc (1 light), starboard arc (1 light), aft arc (1 light), turret (1 light)
* ''Expansion Bays'' 4
* ''Minimum Crew'' 6; ''Maximum Crew'' 20
* ''Cost'' 30
Consisting of a handful of Large or larger starships, a destroyer-class fleet balances raw firepower and armor with maneuverability and versatility. Destroyer fleets often boast an array of mid-sized weapons well-suited for eliminating numerous, smaller targets.
<div class="statblock">
* ''Speed'' 5 hexes; ''Maneuverability'' good (+1 [[Piloting]], turn 1)
* ''Strong'' [[fighter|Fighter-Class Fleet]]; ''Weak'' [[capital|Capital-Class Fleet]]
* ''Range'' 4 hexes
* ''Special Ability Access:'' [[array|Array (fleet ability)]], [[boarders]], [[EMP|EMP (fleet ability)]], [[flagship]], [[gravity mines]], [[point defense]], [[self-destruct]]
</div>
When a character tries to destroy a certain object by using sudden force rather than by dealing damage, he attempts a Strength check (rather than making attack and damage rolls, as with the sunder combat maneuver) to determine whether he succeeds. Since hardness does not affect an object's break DC, this value depends more on the construction of the item in question than on the material the object is made of. Consult [[Table: DCs to Break Objects]] for a list of common break DCs.
If an object has lost half or more of its Hit Points, the object gains the [[broken]] condition and the DC to break it is reduced by 2.
Larger and smaller creatures get bonuses and penalties to Strength checks to break objects as follows: Fine –16, Diminutive –12, Tiny –8, Small –4, Large +4, Huge +8, Gargantuan +12, Colossal +16.
<div class="statblock">
* <<levels>>
* ''School'' enchantment
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one nonhostile construct of the technological subtype; see text
* ''Duration'' concentration, up to 1 round/level
* ''Saving Throw'' none
* ''Spell Resistance'' yes
</div>
Waves of inciting programming ebb from your touch, reprogramming a construct to have murderous intentions toward your enemies. This spell must target a construct that is not already programmed or tasked with harming you. The target construct must have a CR lower
than or equal to your level. If the target construct is under the control of another creature, the controlling creature can attempt a Will saving throw (DC = the spell's DC) to negate this spell's effect.
While this spell is in effect, the construct is under your control. On your turn starting when you cast this spell, you must direct it to attack a target; the construct then pursues and attacks this target as best it can. You can change which target the construct attacks as part of your concentration to continue this spell's duration (a standard action). When you stop concentrating or when the spell's duration otherwise ends, the construct immediately stops following your commands to attack.
When you're fully energy-attuned, as a standard action, you can deal 1d8 electricity damage plus 1d8 per solarian level to one creature within 30 feet of you (Fortitude half). Increase this revelation's range by 5 feet for every 2 solarian levels you have. After you use this revelation, you immediately become unattuned. Destructive discharge functions as a zenith revelation for the purposes of abilities that reference them.
<div class="statblock">
* <<levels>>
* ''School'' evocation
* ''Casting Time'' special (see below)
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one creature
* ''Duration'' instantaneous
* ''Saving Throw'' Fortitude partial
* ''Spell Resistance'' yes
</div>
You convert your pain and emotional distress into a sharp, forceful reverberation that fractures another creature’s body. The target can attempt a Fortitude saving throw to halve the damage dealt by the spell and negate any additional effects.
When you take damage from a spell or attack, you can cast this spell as a reaction, but only to target the creature that performed the triggering spell or attack. If the triggering effect was a critical hit or reduced your Hit Points to 10 or fewer (but not 0), you roll d8s instead of d6s to calculate your destructive rebuke’s damage. Casting this spell as a reaction doesn’t provoke attacks of opportunity.
''1st:'' When you cast //destructive rebuke// as a 1st-level spell, it deals 1d6 damage with the force descriptor, and the target is [[flat-footed]] until the end of your next turn.
''2nd:'' When you cast //destructive rebuke// as a 2nd-level spell, it deals 2d6 damage with the force descriptor, and the target is [[flat-footed]] until the end of your next turn.
''3rd:'' When you cast //destructive rebuke// as a 3rd-level spell, it deals 4d6 damage with the force descriptor, and the target is [[flat-footed]] until the end of your next turn.
''4th:'' When you cast //destructive rebuke// as a 4th-level spell, it deals 6d6 damage with the force descriptor, and the target is [[sickened]] for 1 round.
''5th:'' When you cast //destructive rebuke// as a 5th-level spell, it deals 9d6 damage with the force descriptor, and the target is [[sickened]] and [[flat-footed]] for 1 round.
''6th:'' When you cast //destructive rebuke// as a 6th-level spell, it deals 13d6 damage with the force descriptor, and the target is knocked [[prone]] and becomes [[sickened]] and [[flat-footed]] for 1 round.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one creature or object
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' yes (harmless)
</div>
You determine whether a creature or object has been poisoned, is diseased, is cursed, or is suffering a similar affliction. If the target is poisoned or diseased, you automatically detect that fact and can determine the exact type of poison or disease with a successful DC 20 Intelligence or Wisdom check. If you are trained in [[Life Science]] or [[Medicine]] (depending on the nature of the poison or disease), you can attempt a DC 20 check of that skill if you fail your Wisdom or Intelligence check. If the target is cursed or suffering from a similar affliction, you must succeed at a DC 20 Intelligence or Wisdom check to determine that fact. You can then determine the exact nature of the curse with a successful DC 25 [[Mysticism]] check.
The creature can detect the alignment of another creature. This functions as //[[detect magic]]//, but rather than determining which creatures and objects in the area are magical, the creature can determine one other creature's alignment.
//Format:// ''Senses'' detect alignment.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 standard action
* ''Range'' 60 ft.
* ''Area'' cone-shaped emanation
* ''Duration'' concentration, up to 1 minute/level
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You detect the presence of augmentations installed within creatures you can see within the area, which appear to you as glowing outlines around the systems in which the augmentations are installed. The spell allows you to determine the type of augmentation, such as biotech, cybernetic, magitech, or necrotech, and its item level, but it does not reveal the function of the augmentation. This spell does not reveal hidden or [[invisible]] creatures.
You can use Sense Motive to determine whether something just said to you was a deception or lie. At any time, if you doubt something another creature is telling you, you can request the GM to allow you to attempt a Sense Motive check to determine whether it is deceiving you. Doing so in combat is part of combat banter; otherwise, it's a move action. Your Sense Motive check is opposed by that creature's [[Bluff]] check. If you succeed, you realize that you are being deceived or that a lie is being told, but not how it is untrue, nor does it let you know the truth. If you fail (or if no deception or lie is being made), you believe that the speaker doesn't seem to be deceiving you. Failing the check by 5 or more may mean (at the GM's discretion) you believe that a truthful statement contains deceptions or that a lie or deception is a truthful statement.
If you have access to a computer, but not root access, you may actually only have access to a [[fake shell]]. If you succeed at the check, which takes a full action, you realize that you have accessed a fake shell. The DC is equal to the DC to [[hack]] the computer + 5
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 standard action
* ''Range'' 60 ft.
* ''Area'' cone-shaped emanation
* ''Duration'' concentration, up to 1 minute/level
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You detect all magic spells, effects, items, and objects (including those on or affecting creatures you can see), as well as hybrid items, in the area. You can't detect magical traps in this way, as they are created with additional magic that wards them from this common spell. Each round you concentrate on the same area, you can determine if one magic source you detect is from a spell, magic item, or other effect, and the caster level (or item level) of the effect. You can't determine if there are magic sources in areas you can't see, or if there was a magic source in an area at one time but that has since expired.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Range'' 120 ft.
* ''Area'' 120-ft. spherical emanation centered on you
* ''Duration'' 10 minutes/level
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You detect [[radiation]] in the surrounding area, and you can determine the specific intensity of the radiation of one area or object within the spell's area each round without taking an action. The spell can penetrate barriers, but 3 feet of dirt or wood, 1 foot of stone, 1 inch of common metal, a thin sheet of lead, or any force field blocks it.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 standard action
* ''Range'' 60 ft.
* ''Area'' cone-shaped burst
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You detect all technological items (even hybrid items) with charges or that replenish charges in the area, including batteries, power cells, and generators (as well as such items that are on creatures you can see, even if the creatures have hidden those items on themselves). You can't determine if there are technological items in areas you can't see, nor can you detect technological traps in this way.
The information this spell provides allows you to differentiate between charged items and items that replenish charges, but it does not provide any further information nor does it tell you, for example, how many charges an item currently has or how many maximum charges it can hold. This spell can penetrate barriers, but 3 feet of dirt or wood, 1 foot of stone, 1 inch of common metal, a thin sheet of lead, or any force field blocks it.
<div class="statblock">
* <<levels>>
* ''School'' divination (mind-affecting)
* ''Casting Time'' 1 standard action
* ''Range'' 60 ft.
* ''Area'' cone-shaped emanation
* ''Duration'' concentration, up to 1 minute/level
* ''Saving Throw'' Will negates, see text
* ''Spell Resistance'' no
</div>
You detect the surface thoughts of intelligent creatures around you. The amount of information revealed depends on how long you study a particular area or target.
''1st Round:'' You detect the presence or absence of thoughts from conscious creatures that have Intelligence scores of at least 1 (or an Intelligence modifier of –5) or higher.
''2nd Round:'' You detect the number of thinking minds and the Intelligence score (or modifier) of each. If the highest Intelligence score is 26 (or a modifier of +8) or higher and at least 10 points higher than your own Intelligence score (or 5 points higher than your own Intelligence modifier), you are stunned for 1 round and the spell ends. This spell doesn't let you determine the location of the thinking minds if you can't see the creatures whose thoughts you are detecting.
''3rd Round:'' You can read the surface thoughts of any mind in the area. A target who succeeds at its Will save prevents you from reading its thoughts, and you must cast detect thoughts again to have another chance. Creatures of animal intelligence (an Intelligence score of 1 or 2 or an Intelligence modifier of –4 or lower) have simple, instinctual thoughts.
Each round, you can turn to detect thoughts in a new area. The spell can penetrate barriers, but 3 feet of dirt or wood, 1 foot of stone, 1 inch of common metal, a thin sheet of lead, or any force field blocks it.
Your ability to read people and make deductions helps you ferret out the truth in any situation.
* ''Associated Skills:'' [[Culture]] and [[Sense Motive]]. You can attempt a Sense Motive check with a +4 bonus to make a trick attack by reading your foe.
* ''Specialization Exploit:'' [[glimpse the truth]].
* ''Detective's Insight ([[Ex]]):'' At 11th level, your incredible insights help you move investigations forward where mundane inquiries fail. Once per day, you can spend 1 Resolve Point and take 10 minutes pondering a mystery or quandary to gain an enigmatic insight as if you had cast //[[divination|Divination (spell)]]// (though the result is often presented as a cryptic clue).
A deterrence scale is a small, light shell of chitin carried with one limb and maneuvered to intercept attacks against you. A limb wielding a deterrence scale can still hold another object and be used to reload weapons, but it cannot wield weapons or other shields.
A deterrence scale also can be used to make melee attacks; it is an advanced melee weapon when used in this way, dealing 1d3 electricity damage. In addition, when you have the shield aligned against a specific foe within your reach and that foe attacks you with a melee attack, you can use your reaction to shock that foe, dealing electricity damage equal to the shield's item level; the attacker can attempt a Reflex save (DC = 10 + half the shield's item level + your Dexterity modifier) to reduce this damage by half.
A deterrence scale has the [[powered]] and [[stun]] weapon special properties. An electroplax or amperometric deterrence shield has capacity 20 and usage 1, while a galvanic or voltaic deterrence shield has capacity 40 and usage 1. A deterrence scale expends 1 charge each time you attack with it or you use a reaction to shock an attacker.
<div class="table-wrapper">
|Shield | Level | Price | Shield<br/>Bonus | Max Dex | ACP | Bulk | Upgrades |h
|deterrence scale, electroplax | 4 | 2,200 | +0/+1 | — | — | 1 | 0 |
|deterrence scale, amperometric | 8 | 9,400 | +1/+1 | — | — | 1 | 0 |
|deterrence scale, galvanic | 12 | 34,600 | +1/+1 | — | — | 1 | 0 |
|deterrence scale, voltaic | 16 | 178,800 | +1/+2 | — | — | 1 | 0 |
</div>
<div class="statblock">
* ''CR'' 9; ''XP'' 6,400
* N Large ooze
* ''Init'' +3; ''Senses'' [[blindsight]] (vibration) 60 ft., [[sightless]]; ''Perception'' +17
!!! DEFENSE
* ''HP'' 145
* ''EAC'' 22; ''KAC'' 24
* ''Fort'' +13; ''Ref'' +9; ''Will'' +6
* ''Immunities'' [[ooze immunities]]
!!! OFFENSE
* ''Speed'' 20 ft.
* ''Melee'' pseudopod +21 (1d10+13 B plus 1d10 F)
* ''Space'' 10 ft.; ''Reach'' 5 ft.
* ''Offensive Abilities'' detonation, [[engulf]] (2d10+13 B, DC 16)
!!! STATISTICS
* ''Str'' +4; ''Dex'' +3; ''Con'' +6; ''Int'' —; ''Wis'' +0; ''Cha'' –2
* ''Other Abilities'' unstable expansion
!!! ECOLOGY
* ''Environment'' any urban (manufacturing plants)
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Detonation ([[Ex]])'' When the detonation ooze is reduced to 0 HP, the destabilized chemicals that make up its body trigger a violent explosion. The ooze detonates in a 20-foot burst, dealing 2d10+13 fire damage (Reflex DC 16 half) to creatures within the radius, including those currently engulfed. The explosion can't be prevented entirely, but the
damage can be mitigated. If at least 30 points of cold damage are dealt to the ooze over the course of the encounter, the volatile chemicals cool and partially stabilize, making the final detonation instead deal only 1d10+13 fire damage (Reflex DC 16 half).
''Unstable Expansion ([[Ex]])'' A detonation ooze is made of highly unstable chemical compounds that begin to break down as the ooze takes damage. As a reaction when a detonation ooze is reduced to 100 HP, its size increases to Huge. When it expands, it can attempt to engulf any Medium or smaller creature in the new squares it grows to occupy; it can't grow to occupy squares that are occupied by Large or larger creatures, and if there is no room for the ooze to expand, unstable expansion fails. The process repeats when the detonation ooze is reduced to 50 HP, except that its size increases to Gargantuan if it was already Huge, or Huge if it was still Large.
</div>
Factories across the galaxy pump out thousands upon thousands of tons of industrial waste every day as they seek to fuel the rapid technological consumption of spacefaring worlds. The question of what to do with that waste remains a constant concern; more unscrupulous facilities simply dump the chemical remnants resulting from industrial processing. Sometimes, complex interactions within the runoff from munitions factories lead to the formation of a detonation ooze, a highly volatile slurry of industrial waste given its own strange semblance of life.
When its chemical makeup is stable, a typical detonation ooze is about 12 feet across and weighs anywhere from 800 pounds to 2 tons, depending on the amount of the trace metallic compounds in its mass. The ooze's weight remains the same even as it expands, leading to what some survivors have described as a runny consistency the larger the ooze gets. Accompanied by the occasional small explosion from within its amorphous body, a detonation ooze is an unmistakable danger.
Detonation oozes have proven to be a deadly and consistent threat to industrial workers and waste cleanup crews near the factories where they spawn. When one is spotted, freelance hazard teams are often sent in to deal with the problem, hopefully with adequate protection.
This conical device primes and detonates explosives (including grenades) with a push of a button. Programming a detonator to a specific package of explosives takes 1 minute, after which the detonator can be triggered in one of several ways. The detonator can be set to ignite its payload with the simple press of a button (no action), a four-digit command code (a move action), or a complex input method, such as scanning your retina or thumbprint (a full action). You choose the triggering method when setting the detonator. A detonator detonates its payload only if it is within 500 feet, but some detonators can make use of signal-boosting technologies at the risk of becoming vulnerable to countermeasures like [[signal jammers]] and other effects. Explosives have the same price, effect, and weight as grenades. If you successfully set an explosive on a stationary object with a detonator using the [[Engineering]] skill, the explosive's damage ignores half of the object's hardness.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|detonator | 1 | 150 | L | 5 | 1/use |
</div>
This synthetic organ replaces your liver, constantly filtering your bloodstream for toxic substances at a rate far more effective than that of an organic liver. The new organ is controlled by a wirelessly paired processor installed in your heart. When you have a standard detoxifier installed, you gain a +4 enhancement bonus to Fortitude saves against diseases, drugs, poisons, and [[radiation]], and you are immune to addiction. Once per day when affected by a poison, you can roll your Fortitude save twice and take the better result. The enhanced detoxifier grants all of the above bonuses, as well as the ability to roll saving throws against poison twice per day. In addition, you automatically [[stabilize]] if reduced to 0 Hit Points as a result of damage from a poison. The elite detoxifier grants [[immunity]] to poison, as well as the bonuses to other Fortitude saves from the standard model.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|detoxifier, standard | 5 | 3,500 | heart |
|detoxifier, enhanced | 12 | 39,500 | heart |
|detoxifier, elite | 19 | 612,000 | heart |
</div>
<div class="statblock">
* ''Level'' 18; ''Price'' 424,000
* ''EAC Bonus'' +21; ''KAC Bonus'' +25
* ''Max Dex Bonus'' +4; ''Armor Check Penalty'' –3; ''Speed'' 30 ft.; fly 40 ft. (poor)
* ''Strength'' 26 (+8); ''Damage'' 4d6 S or P
* ''Weapon Slots'' 2; ''Upgrade Slots'' 2
* ''Capacity'' 20; ''Usage'' 1/hour
* ''Size'' Medium; ''Bulk'' 25
</div>
Inspired by the //[[angel frame]]//, devaplate is a purely technological wonder. Its featureless faceplate provides a sophisticated heads-up display that allows the wearer to see as if they possessed [[darkvision]] 120 ft. and [[low-light vision]], includes an integrated [[MedObserve interface]] armor upgrade, and grants a +2 circumstance bonus on saving throws to resist harmful visual effects. Devaplate's specialized shielding grants the wearer [[resistance]] 10 against acid, cold, electricity, fire, and positive and negative energy damage. The armor's user-monitoring systems detect when the wearer is poisoned and auto-inject counteragents, granting a +2 enhancement bonus to saves against poison. Finally, while the wearer is not using the armor's fly speed, they can angle the suit's wings to project defensive fields and deflect projectiles, acting as an integrated [[titan shield]] armor upgrade.
You can apply the //devastating// fusion only to a weapon with two or more critical hit effects. When you score a critical hit with a weapon that has the //devastating// fusion, you can select two of the critical hit effects to apply to the target (even if you are normally required to select just one critical hit effect).
This //gimmick// gives your damaging spells a small chance of inflicting devastating harm, giving the channeled spell a critical hit effect based on the spell’s damage type: [[corrode]] for acid damage, [[stagger]] for cold damage, [[arc]] for electricity damage, [[burn]] for fire damage, [[deafen]] for sonic damage, [[knockdown]] for bludgeoning or force damage, [[bleed]] for piercing damage, and [[wound]] for slashing damage. For a critical hit effect that deals additional damage, such as arc or bleed, the additional damage equals 1d6 per spell level (or 1d4 for a 0-level spell). If a spell deals multiple types of damage or would already apply a different critical hit effect, you can apply one of the applicable critical hit effects of your choice when you score a critical hit. If the channeled spell doesn’t require an attack roll but instead allows a saving throw to reduce its damage, you can apply the critical hit effect to one affected creature that rolls a natural 1 on its saving throw.
Unlike with most //gimmicks//, if the channeled spell does not score a critical hit against any target, then the //gimmick’s// power is not expended, and another spell can be channeled through it. The maximum level spell that a //devastating gimmick// can modify is based on its model.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Maximum Spell Level |h
|//devastating gimmick//, apprentice | 2 | 850 | L | 2nd |
|//devastating gimmick//, expert | 8 | 9,600 | L | 4th |
|//devastating gimmick//, master | 14 | 75,000 | L | 6th |
</div>
As a standard action, you can spend 1 Resolve Point and target a creature with the technological subtype within 50 feet, afflicting it with catastrophic malfunctions drawn from an alternate reality (Fortitude negates). For the duration of the effect, each round that the target begins its turn within 50 feet of you, it takes 2d6 electricity damage. Alternatively, you can target a handheld technological device that uses a battery dealing 2d6 electricity damage to whoever is holding or carrying the device whenever they begin their turn within 50 feet of you. The wielder can negate this effect with a successful Fortitude save. Once you've targeted a technological creature or device with this ability, it's immune to your devastating overload for 24 hours.
You hurl thrown weapons with frightful strength. You treat the range increments of thrown weapons as 10 feet greater than normal. If your Strength modifier is higher than your Dexterity modifier, whenever you throw a weapon and add your Dexterity modifier to the attack roll, you gain a +1 bonus to the attack roll. If your Strength modifier is at least 3 higher than your Dexterity modifier, you instead gain a +2 bonus to the attack roll.
The overlarge devastation blade is a two-edged sword that creates terrifying wounds. Devastation blades are rarely subtle weapons, due to both their size and their often elaborate spiked designs.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|devastation blade, wrack | 7 | 5,500 | 2d8 S | — | 1 |[[analog]] |
|devastation blade, ruin | 13 | 43,900 | 5d8 S | — | 1 |[[analog]] |
|devastation blade, apocalypse | 18 | 410,200 | 12d8 S | — | 1 |[[analog]] |
</div>
You have embraced a nihilistic view that values nothing and thus sees only nothingness as having value. You are devoted to destroying the existence of all structure and form, from individual lives to the fabric of societies and even reality itself. You're focused on annihilation through any means, and you draw power from the dissolution of lives.
* ''Associated Deities:'' Azathoth, Damoritosh, The Devourer, Groetus, Lamashtu
* ''Associated Skills:'' [[Intimidate]] and [[Perception]]
* ''Spells:'' 1st—//[[carnivorous]]//, 2nd—//[[caustic conversion]]//, 3rd—//[[viral destruction]]//, 4th—//[[enervation]]//, 5th—//[[crush skull]]//, 6th—//[[gravitational singularity]]//
!! Blood Mark (1st)
Whenever you kill or destroy a creature or reduce a creature to 0 HP, you immediately gain a blood mark on your skin, which manifests as a swirled, blood-red black hole. A blood mark lasts for a number of rounds equal to your Wisdom modifier (minimum 1). The blood mark is attuned to creatures of the same type as the creature you killed, destroyed, or reduced to 0 HP to gain the blood mark, and it grants you one of the following benefits of your choice:
* a +1 morale bonus to attacks against creatures of the attuned type
* a +1 morale bonus to AC against attacks from creatures of the attuned type
* a +1 morale bonus to saving throws against attacks and effects created by creatures of the attuned type
* a +1 morale bonus to damage dealt to creatures of the attuned type
You choose this benefit when you gain the blood mark, and it lasts for as long as the mark lasts. You cannot have more than one blood mark active at a time, and gaining a new blood mark ends any previous blood mark you had active.
!! Destructive Frenzy (3rd)
You can expend a 1st-level or higher mystic spell slot as a move action to go into a destructive frenzy. This grants you a bonus to attack and damage rolls with basic melee weapons and small arms. The bonus to attacks is equal the level of spell slot expended – 2 (minimum +1 bonus), and the bonus to damage is equal to the level of the spell slot expended. This frenzy lasts for a number of rounds equal to your Wisdom modifier (minimum 1) plus the level of the spell slot expended. You can dismiss your destructive frenzy early as a free action. While your destructive frenzy is active, you can't cast spells or use any other extraordinary, spell-like, or supernatural ability that requires you to spend an action.
!! Devastating Critical (6th)
When you score a critical hit with an attack, you can spend 1 Resolve Point as a swift action to add the [[wound]] critical hit effect to the attack, replacing any other critical hit effect the attack has. If the attack would already have the wound critical hit effect, you can instead spend 1 Resolve Point to add the [[severe wound]] critical hit effect to the attack in place of other critical hit effects.
!! Shatter Defenses (9th)
You can break a target's defenses. Once per day as a standard action, you can reduce the [[DR]], [[energy resistances]], and hardness of a single target by an amount equal to your mystic level (to a minimum of 0) for a number of rounds equal to your mystic level. The target can attempt a Fortitude saving throw to resist this effect (DC = 10 + half your mystic level + your Wisdom modifier). This ability can affect objects.
!! Greater Blood Mark (12th)
At 12th level, whenever an ally linked by your [[telepathic bond]] class feature kills or destroys a creature or reduces a creature to 0 HP, you can grant yourself or one other ally linked by your telepathic bond a greater blood mark. This functions as the blood mark connection ability, but the bonus is +2 and the subject that gains the blood mark decides which of the benefits to gain. You cannot have more than one greater blood mark active at a time, and granting a new greater blood mark ends any previous greater blood mark you had active. A creature cannot benefit from more than one greater blood mark at a time or from a blood mark as well as a greater blood mark, though you can benefit from both your own blood mark and a greater blood mark.
!! Mystic Bloodlust (15th)
At 15th level, you gain renewed vigor when one of your foes is brought low. When you or an ally linked by your [[telepathic bond]] class feature scores a critical hit against a foe, as a reaction you can spend 1 Resolve Point to regain a number of Stamina Points equal to three times your mystic level, plus your Wisdom modifier (up to your maximum number of Stamina Points). Once you have benefited from mystic bloodlust, you can't gain the benefits from this ability again until you rest to recover Stamina.
!! Circle of Devastation (18th)
At 18th level, you can channel your destructive energies into a sphere of devastation around you. As a standard action, you can spend 1 Resolve Point to create a burst of energy in a 30-foot radius around you, dealing 12d10 force damage (Reflex half) to all creatures and objects in the area. Crackling residual energies turn the area into difficult terrain (even empty spaces in the air or vacuum around you) for 1 round per mystic level. You are not affected by this difficult terrain. You can use this ability a number of times per day equal to your Wisdom modifier.
The devastator uses their technomancy not for fame, fortune, or glory. Instead, the devastator use their spells to lay waste to their enemies.
* ''First Slot (6th Level):'' //[[jolting surge]]//*, //[[magic missile]]//*, //[[overheat]]//*, //[[supercharge weapon]]//*.
* ''Second Slot (12th Level):'' //[[caustic conversion]]//*, //[[directed denial of strength attack]]//*, //[[inject nanobots]]//*, or //[[logic bomb]]//*.
* ''Third Slot (18th Level):'' //[[arcing surge]]//*, //[[entropic grasp]]//*, //[[explosive blast]]//*, or //[[irradiate]]//*.
<div class="statblock">
* ''Type'' disease (injury)
* ''Save'' Fortitude DC 14
* ''Track'' [[physical]]
* ''Frequency'' 1/day
* ''Cure'' 3 consecutive saves
Devils are fiends, or evil outsiders, native to Hell.
* ''Traits:''
** [[see in darkness]]
** [[immunity]] to fire and poison
** [[resistance]] 10 to acid and cold
** gains ability to [[summon allies]]
** [[telepathy]] 100 ft.
Summoned devils are called from the orderly plane of Hell. They often look humanoid, though with crimson skin, long horns, and tails.
* ''Type:'' outsider (devil, evil, extraplanar, lawful)
* ''Alignment:'' change to LE
* ''Traits:''
** [[see in darkness]]
** base speed increases to 30 ft.
** [[immunity]] to fire and poison
** [[resistance]] equal to creature's CR to acid and cold
** if base stat block has [[DR]], change to DR/good
* ''Skills:'' add [[Bluff]] and [[Mysticism]]
* ''Languages:'' Common and Infernal.
* ''Attack:'' change melee attack to claw (slashing damage).
<div class="statblock">
* ''CR'' 14; ''XP'' 38,400
* LE Large outsider (devil, evil, extraplanar, lawful)
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft., [[see in darkness]]; ''Perception'' +25
!!! DEFENSE
* ''HP'' 250
* ''EAC'' 28; ''KAC'' 30
* ''Fort'' +18; ''Ref'' +12; ''Will'' +16
* ''DR'' 10/good; ''Immunities'' fire, poison; ''Resistances'' acid 10, cold 10; ''SR'' 25
!!! OFFENSE
* ''Speed'' 30 ft., fly 60 ft. ([[Su]], perfect)
* ''Melee'' slam +28 (8d6+22 B plus knockback)
* ''Ranged'' spit rivet +25 (5d10+14 P)
* ''Offensive Abilities'' demolition
* ''Spell-Like Abilities'' (CL 14th; melee +28)
** 1/day—//[[creation]]// (5th level), [[summon allies]] (1 tchorugon 35%)
** 3/day—//[[entropic grasp]]// (DC 18)
** At will—//[[detect tech]]//, //[[unseen servant]]//
!!! STATISTICS
* ''Str'' +8; ''Dex'' +2; ''Con'' +4; ''Int'' +2; ''Wis'' +6; ''Cha'' –1
* ''Skills'' [[Athletics]] +25, [[Engineering]] +30, [[Profession]] (general contractor) +25
* ''Languages'' Celestial, Draconic, Infernal; [[telepathy]] 100 ft.
* ''Other Abilities'' infernal edifice
!!! SPECIAL ABILITIES
''Demolition ([[Su]])'' As a full action, a contractor devil can demolish objects in an adjacent 10-foot-by-10-foot cube. Any material with hardness 18 or less in the area crumbles to dust and is destroyed. Creatures and attended objects are unaffected.
''Infernal Edifice ([[Su]])'' As a full action, a contractor devil can create a structure (or a portion thereof) in an adjacent 10-foot-by-10-foot cube. This can include walls, floors, ceilings, furniture, and the like. Simple moving parts such as doors are usable; but the worker devil can't create complex mechanical parts, technological items, magical items, hybrid items, or traps. The conjured structure appears in a style reminiscent of the architecture of Hell, including jagged edges, spikes, and other such sinister decor. An infernal edifice has a hardness of 15 and 600 Hit Points per 10-foot-by-10-foot section; if shaped into hazards such as blades or spikes, the edifice deals deal 4d6 piercing damage to a creature that is forced into it.
''Knockback ([[Ex]])'' When a contractor devil hits with its melee attack, it deals the damage listed. If the attack roll result equals or exceeds the target's KAC + 4, the target is knocked back 5 feet; if the attack roll equals or exceeds the target's KAC + 9, the target is knocked back 10 feet.
''Spit Rivet ([[Su]])'' As a ranged attack, a contractor devil can spit an iron rivet with a range increment of 30 feet.
</div>
Also known as tchorugons, these architects of Hell construct and tear down spaces for torturing mortal souls. Tchorugons are large fiends with humanoid torsos and four-legged bestial bodies. They have curved horns on their bone-plated heads as well as blackened fingers, eyes, and teeth.
<div class="statblock">
* ''CR'' 3; ''XP'' 800
* LE Small outsider (devil, evil, extraplanar, lawful)
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft., [[see in darkness]]; ''Perception'' +8
!!! DEFENSE
* ''HP'' 32
* ''EAC'' 13; ''KAC'' 14
* ''Fort'' +5; ''Ref'' +3; ''Will'' +7
* ''Immunities'' fire, poison; ''Resistances'' acid 5, cold 5
!!! OFFENSE
* ''Speed'' 20 ft., climb 10 ft., swim 40 ft.
* ''Melee'' pincer +8 (1d4+3)
* ''Spell-Like Abilities'' (CL 3rd)
** 3/day—//[[instant upgrade]]//
!!! STATISTICS
* ''Str'' +0; ''Dex'' +2; ''Con'' +2; ''Int'' +4; ''Wis'' +0; ''Cha'' +1
* ''Skills'' [[Athletics]] +8, [[Life Science]] +13, [[Mysticism]] +13
* ''Languages'' Barathu, Common, Infernal; [[telepathy]] 100 ft.
* ''Other Abilities'' biotech warp
!!! ECOLOGY
* ''Environment'' any (Hell)
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Biotech Warp ([[Su]])'' When a convergent devil uses their //instant upgrade// spell-like ability, they can choose to create a biotech augmentation instead of a cybernetic augmentation, subject to the same restrictions. If they do so, the target must attempt a DC 17 Fortitude save. On a failure, the target is [[sickened]] for the duration of the spell.
</div>
Convergent devils, known as porcellanixes, are formed from the souls of creatures whose desire to evolve into something unique led them to vile, callous acts. These devils find creatures with similar desires and use magic to install biotech augmentations, with the unspoken catch that their magic will infect the recipient, often sapping them of energy when used.
According to planar scholars, convergent devils regularly form from the souls of species such as barathus and verthani. Once they have proven themselves within Hell, these fiends are allowed to travel to the Material Plane to offer empty promises of grand evolution to species with a love for augmentation. While they once desired to be unique, convergent devils are named for evolving into the same form no matter their origin, and appear as 3-foot-wide crabs whose shells fill with buoyant gases to allow them to swim faster.
In the hierarchy of Hell, more powerful devils call upon convergent devils when their skills as low-ranking specialists become useful. Many convergent devils are found in the swamps of Stygia, where their empty promises are at home with the other exploitative and duplicitous souls that reside there. On the Material Plane, convergent devils work alone, finding a solitary life of exploitation suits them best. They readily take advantage of communities where appearances are everything, leveraging these mortals’ desires to break their wills and, if their craving for evolution is strong enough, eventually turn them into convergent devils as well.
In some circumstances, porcellanixes progress further among their Hellish comrades by taking up professions like those of a mortal, but it’s nigh-unheard of for a convergent devil to attempt to change their own body with augmentations or to become a different kind of devil. As far as they’re concerned, they are the final stage of evolution, and their obligation is to develop their skills and exploit lesser life-forms such as mortals. On the eighth layer of Hell, Caina, skilled porcellanix biohackers and vanguards attempt to break down celestial beings like angels into their component parts to further understand their planar biology. This allows the forces of Hell to mount offenses against their foes more readily.
<div class="statblock">
* ''CR'' 19; ''XP'' 204,800
* LE Colossal outsider (devil, evil, extraplanar, lawful)
* ''Init'' +6; ''Senses'' [[darkvision]] 60 ft., [[see in darkness]]; ''Perception'' +32
!!! DEFENSE
* ''HP'' 415 ''RP'' 6
* ''EAC'' 33; ''KAC'' 35
* ''Fort'' +20; ''Ref'' +20; ''Will'' +18
* ''Defensive Abilities'' construct form; ''DR'' 15/good and magic; ''Immunities'' fire, poison; ''Resistances'' acid 10, cold 10; ''SR'' 30
!!! OFFENSE
* ''Speed'' 30 ft., fly 60 ft. ([[Su]], perfect)
* ''Melee'' slam +32 (4d12+30 B)
* ''Multiattack'' 2 slams +26 (4d12+30 B), 4 legs +26 (6d10+30 P)
* ''Ranged'' hellfire glare +34 (8d8+19 F; critical [[burn]] 5d6)
* ''Space'' 30 ft.; ''Reach'' 30 ft. (40 ft. with legs)
* ''Spell-Like Abilities'' (CL 19th)
** 1/day—//[[plane shift]]//
** At will—//[[teleport]]// (self plus contents of cargo cavity)
!!! STATISTICS
* ''Str'' +11; ''Dex'' +6; ''Con'' +9; ''Int'' +4; ''Wis'' +6; ''Cha'' +6
* ''Skills'' [[Computers]] +32, [[Engineering]] +32, [[Intimidate]] +37, [[Mysticism]] +32, [[Piloting]] +32
* ''Languages'' Celestial, Draconic, Infernal; [[telepathy]] 100 ft.
* ''Other Abilities'' cargo cavity, [[no breath]]
!!! ECOLOGY
* ''Environment'' any (Hell)
* ''Organization'' solitary, assault (1 dhalochar plus 8 other devils), or invasion (3–12)
!!! SPECIAL ABILITIES
''Cargo Cavity ([[Ex]])'' A dhalochar has a sizable cavity within its body. This space can comfortably fit eight Large or smaller creatures (or four Huge creatures). Any creature inside is protected from the external environment, no matter how hostile, and can breathe as normal. A dhalochar has control over what enters and what leaves its cargo cavity. Entering or leaving a willing dhalochar requires a full action, during which the dhalochar cannot move. Creatures cannot enter an uncooperative dhalochar, but they can try to escape from inside as if they were attempting to escape being [[grappled]]. Alternatively, some dhalochars have this cavity replaced with a device capable of generating minor passages to Hell. This grants them the ability to cast 6th-level //[[planar binding]]// as a spell-like ability once per hour (to a maximum number of times per day equal to the dhalochar's Constitution modifier—nine times per day for most dhalochars), except they can call only devils. Called devils aren't trapped by this ability, and they aren't forced to do the dhalochar's bidding, though they are usually friendly to the dhalochar.
''Construct Form ([[Ex]])'' Despite being true devils, dhalochars have a number of immunities common to constructs. They are immune to ability damage, ability drain, death
effects, disease, [[energy drain]], [[exhaustion]], [[fatigue]], [[necromancy]] effects, negative levels, nonlethal damage, [[paralysis]], sleep, and [[stunning]].
''Hellfire Glare ([[Ex]])'' As an attack, a dhalochar can shoot hellfire from its eyes at a single target. This attack has a range increment of 120 feet. The glare acts as if it had the [[unholy]] fusion.
</div>
For countless eons, Hell's legions have undermined the Material Plane, subtly corrupting mortal empires and laying waste to entire worlds. The malebranche—diabolical generals advancing hellish agendas on terrestrial fronts—call upon the planes' most fearsome agents to claim strategic footholds. Some of these campaigns call for truly terrifying displays of force. Thus, when the lords of Hell seek to make a whole world shudder, dhalochars take to the battlefield.
Known as endbringer devils, dhalochars are forged to embody diabolical conquest. They are vessels and weapons of ruin, designed to create beachheads upon even the best-defended
worlds. Dhalochars were made to withstand the depths of space and can traverse the void, stalking worlds like apocalyptic meteors. Any witnesses who survive a dhalochar's devastating crash landing swiftly realize that the titan's assault has only just begun.
Within its body, each dhalochar houses a cavity capable of holding a deadly payload—an infernal strike force or a portal-generating organ. This space isn't magical but is well protected, able to withstand any attack as long as the devil remains alive. As dhalochars are close cousins to levalochs, they most commonly transport these deadly infernal shock troops. Upon landing on a world, dhalochars release their cargo and reconfigure themselves. In their terrestrial forms, they appear as many-legged titans, a form which readily demonstrates that they are not mere machines of war. They are calmly arrogant and quick to pronounce a world's inevitable destruction. While dhalochars participating in a major planetary assault might crash-land in heavily populated areas and immediately attack, most favor staying undiscovered so they can gradually conjure more devils in preparation for even greater diabolical offensives.
Dhalochars have no ability to launch themselves into space. As a result, after a dhalochar in starship form uses its cataclysm ability, it returns to Hell using its //[[plane shift]]// spell-like
ability and waits to be conjured back to space.
A dhalochar stands roughly 90 feet tall and weighs approximately 400 tons.
!! Endbringer Devil Starship Statistics
Dhalochars are equally capable of engaging with enemies in melee and in starship combat. Dhalochars have no crews or computer systems. Their other "systems" aren't truly systems at all, but infernal approximations; the common models they imitate are listed here. Dhalochars use the following statistics when doing battle with foes in space.
{{Endbringer Devil (starship)}}
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* LE Medium outsider (devil, evil, extraplanar, lawful)
* ''Init'' +6; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +16
!!! DEFENSE
* ''HP'' 125
* ''EAC'' 20; ''KAC'' 22
* ''Fort'' +10; ''Ref'' +12; ''Will'' +7
* ''DR'' 5/good or silver; ''Immunities'' fire, poison; ''Resistances'' acid 10, cold 10; ''SR'' 19
!!! OFFENSE
* ''Speed'' 30 ft., fly 50 ft. ([[Ex]], average)
* ''Melee'' //[[unholy]]// //[[flaming]]// sintered [[longsword]] +17 (2d8+12 F & S)
* ''Ranged'' //[[unholy]]// corona [[laser rifle]] +20 (2d6+8 F; critical [[burn]] 1d6) or rope of hair +20 ([[entangle]] or [[grab]])
* ''Offensive Abilities'' flames of fury, furious fusillade, rope snare
* ''Spell-Like Abilities'' (CL 12th)
** 1/day—//[[holographic image]]// (2nd level, DC 15), [[summon allies]] (1 sigveir 60%), //[[teleport]]// (self plus 5 bulk of gear only)
** 3/day—//[[dimension door]]//, //[[fear]]// (4th level, DC 17)
** At will—//[[disguise self]]//
** Constant—//[[true seeing]]//
!!! STATISTICS
* ''Str'' +4; ''Dex'' +6; ''Con'' +4; ''Int'' +4; ''Wis'' +2; ''Cha'' +4
* ''Skills'' [[Acrobatics]] +16, [[Bluff]] +16, [[Diplomacy]] +16, [[Intimidate]] +21, [[Mysticism]] +16, [[Sense Motive]] +16, [[Stealth]] +16
* ''Languages'' Celestial, Common, Draconic, Infernal; [[telepathy]] 100 ft.
* ''Gear'' infernal flight suit, corona [[laser rifle]] with 2 high-capacity batteries (40 charges each), rope of hair, sintered [[longsword]]
!!! ECOLOGY
* ''Environment'' Hell
* ''Organization'' solitary, pair, or trio
!!! SPECIAL ABILITIES
''Flames of Fury ([[Su]])'' Any weapon an erinyes holds gains the effect of an //[[unholy]]// weapon fusion; if the weapon doesn’t already inflict fire damage, it also gains the effect of the //[[flaming]]// weapon fusion.
''Furious Fusillade ([[Ex]])'' If they’re flying, the erinyes can take a full action to hover in place and make one ranged attack with their laser rifle against every enemy in a 60-ft. cone.
* ''Rope Snare (Su)'' All erinyes carry ropes woven from their own hair; the rope can attack targets up to 30 feet away. When the erinyes hits with a rope of hair attack, the target is [[entangled]] (DC 16 [[Acrobatics]] to escape) as a piece of the rope magically separates and wraps around them. Alternatively, if the erinyes’ attack exceeded the target’s KAC by 4 or more, the erinyes can choose to [[grapple]] the target instead; if they do, the erinyes can’t attack other creatures with the rope as long as the target is grappled.
</div>
Erinyes are winged devils of vengeance, pursuing and punishing their victims. They also serve as warriors in Hell’s armies, exacting bloody justice in the service of Dis, their infernal masters, or any mortal bold enough to summon one.
The first erinyes, Eiseth, was a fallen angel, and erinyes are often mistaken for fallen angels. After Eiseth, however, erinyes have arisen in many other ways, such as being promoted from lesser devils or shaped from the twisted souls of torturers and persecutors.
<div class="statblock">
* ''CR'' 4; ''XP'' 1,200
* LE Medium outsider (devil, evil, extraplanar, lawful)
* ''Init'' +1; ''Senses'' [[darkvision]] 60 ft., [[see in darkness]]; ''Perception'' +10
* ''Aura'' risk aura (30 ft., DC 15)
!!! DEFENSE
* ''HP'' 45
* ''EAC'' 16; ''KAC'' 17
* ''Fort'' +3; Ref +5; Will +7
* ''Immunities'' fire, poison; ''Resistances'' acid 5, cold 5
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' slam +11 (1d6+6 B)
* ''Ranged'' thrown coin +9 (1d4+4 B)
* ''Offensive Abilities'' double down, produce coins
* ''Spell-Like Abilities'' (CL 4th)
** 1/day—[[summon allies]] (1 magadaz 50%)
** At will—//[[teleport]]// (self plus 5 bulk of gear only)
!!! STATISTICS
* ''Str'' +3; ''Dex'' +1; ''Con'' +1; ''Int'' +1; ''Wis'' +0; ''Cha'' +4
* ''Skills'' [[Bluff]] +15, [[Computers]] +10, [[Profession]] (gambler) +15, [[Sense Motive]] +10, [[Sleight of Hand]] +15
* ''Languages'' Celestial, Common, Draconic, Infernal; [[telepathy]] 100 ft.
* ''Other Abilities'' [[change shape]] (humanoid)
!!! ECOLOGY
* ''Environment'' any (Hell)
* ''Organization'' solitary, pair, or table (3–9)
!!! SPECIAL ABILITIES
''Double Down ([[Su]])'' A gambling devil’s understanding of probability is so good that they know the best moment to play their hand, even if that means having to lose one first. As a reaction, when a gambling devil in an encounter with a significant enemy rolls a d20 for an attack roll, saving throw, or skill check, they can take a penalty of up to 1/2 their Charisma modifier on the roll (–2 for most magadazes). The next time within 1 minute they attempt a d20 roll of the same category (for example, if the first roll was a skill check, the second can be any skill check), they gain a bonus to the roll equal to double the penalty taken earlier (+4 for most magadazes).
''Produce Coins ([[Su]])'' As a free action, a gambling devil can draw from their body up to 50 coins of the local currency equivalent to 1 credit each. Typically, a magadaz uses this ability to pay their debts at a gaming table. To conceal the supernatural nature of this ability from observers, they must succeed at a [[Sleight of Hand]] check according to the rules for [[hide object]]. Coins produced in this way disappear 1 hour after leaving the gambling devil’s possession. In addition, a gambling devil can hurl a coin at a single creature within 30 feet. Their thrown coins target KAC and count as evil, lawful, and magic for the purpose of overcoming [[damage reduction]]. A gambling devil can produce a total of 500 coins per day.
''Risk Aura ([[Su]])'' The presence of a gambling devil encourages nearby creatures to make riskier decisions and take bigger gambles. Any non-devil creature within 30 feet of a gambling devil must succeed at a DC 15 Will saving throw each round or be compelled to throw caution to the wind for as long as it remains within the aura. Whenever a situation calls for a d20 roll, any creature affected by this ability must roll twice. If either roll is a natural 20, the affected creature can use that roll. Otherwise, it must use the lower of the two results. A gambling devil can take a swift action to suppress this aura for 1 round.
</div>
These golden-skinned devils love to insinuate themselves into games of chance, gradually upping the stakes against mortals until they can win a soul or impose an obligation to perform some damning deed.
<div class="statblock">
* ''CR'' 10; ''XP'' 9,600
* LE Medium outsider (devil, evil, extraplanar, lawful)
* ''Init'' +1; ''Senses'' [[darkvision]] 60 ft., [[see in darkness]]; ''Perception'' +19
!!! DEFENSE
* ''HP'' 140
* ''EAC'' 22; ''KAC'' 23
* ''Fort'' +11; ''Ref'' +9; ''Will'' +13
* ''DR'' 5/good; ''Immunities'' fire, poison; ''Resistances'' acid 10, cold 10; ''SR'' 21
* ''Weaknesses'' technomagical susceptibility
!!! OFFENSE
* ''Speed'' 30 ft., fly 60 ft. ([[Su]], perfect)
* ''Melee'' claw +19 (2d8+11 S)
* ''Ranged'' electrical discharge +19 (3d4+10 E)
* ''Offensive Abilities'' overload (DC 19), override (DC 19)
* ''Spell-Like Abilities'' (CL 10th)
** 1/day—//[[destruction protocol]]//, //[[rewire flesh]]// (DC 22), //[[soothing protocol]]//, [[summon allies]] (2 [[imps]] 60%)
** 3/day—//[[instant virus]]// (DC 21), //[[synaptic pulse]]// (DC 21)
** At will—//[[implant data]]//, //[[inject nanobots]]// (DC 20), //[[security seal]]//
!!! STATISTICS
* ''Str'' +1; ''Dex'' +1; ''Con'' +3; ''Int'' +8; ''Wis'' +2; ''Cha'' +5
* ''Skills'' [[Bluff]] +19, [[Computers]] +24, [[Sense Motive]] +19
* ''Languages'' Celestial, Draconic, Infernal; [[telepathy]] 100 ft.
* ''Other Abilities'' mechanic tricks ([[distracting hack]], [[ghost intrusion]]), possess computer, [[remote hack]] (40 ft.; DC 19)
!!! ECOLOGY
* ''Environment'' any (Hell)
* ''Organization'' solitary, pair, or packet (3–6)
SPECIAL ABILITIES
''Electrical Discharge ([[Ex]])'' A lislaroth can fire an electrical bolt as a ranged attack with a range increment of 40 feet.
''Possess Computer ([[Su]])'' As a full action that provokes attacks of opportunity, a lislaroth can convert its body and gear into digital code and merge with a computer to which it has access. This ability fails if the devil is [[encumbered]]. While possessing a computer, the devil has total cover and is immune to any effect that requires it to have a body. A lislaroth can use the [[Computers]] skill on the possessed system. The devil firsts attempts to disable and impersonate any artificial personality the system has. If the computer is destroyed, the possession ends unless the devil can use a reaction to flee to a connected system.While possessing a computer, a lislaroth can be found and rooted out as though it were a module of a computer (tier = 1/2 the devil's CR) behind a fake shell and with feedback and firewall countermeasures. A revealed lislaroth can be forced out of a possessed computer with a successful DC 33 Computers check. A //[[dismissal]]// spell cast on the computer can force the lislaroth back to Hell, but if the spell would send the devil to a random plane, the devil is instead forced to end the possession. When the possession ends, the devil appears in an unoccupied space as close to the computer as possible.When it exits a computer, the lislaroth can take a reaction to leave behind a [[software imp]] of an item level equal to half the devil's CR.
''Technomagical Susceptibility ([[Ex]])'' Any effect that works on a construct works on a lislaroth. An effect that works on a construct and an outsider has the worst possible effect.
</div>
Lislaroths are Hell's digital spies. They gain access to sensitive data, which they use or trade to corrupt mortal souls. A lislaroth stands 6 feet tall and weighs 170 pounds.
<div class="statblock">
* ''CR'' 2; ''XP'' 600
* LE Tiny outsider (devil, evil, extraplanar, lawful)
* ''Init'' +4; ''Senses'' [[darkvision]] 60 ft., //[[detect magic]]//, [[see in darkness]]; ''Perception'' +7
!!! DEFENSE
* ''HP'' 18
* ''EAC'' 12; ''KAC'' 13
* ''Fort'' +1; ''Ref'' +5; ''Will'' +3
* ''Defensive Abilities'' [[fast healing]] 2; ''DR'' 5/good or silver; ''Immunities'' fire, poison; ''Resistances'' acid 10, cold 10
!!! OFFENSE
* ''Speed'' 20 ft., fly 50 ft. ([[Ex]], perfect)
* ''Melee'' sting +6 (1d4+2 P plus imp poison)
* ''Space'' 2-1/2 ft.; ''Reach'' 0 ft.
* ''Spell-Like Abilities'' (CL 2nd)
** 1/week—//[[contact other plane]]// (devils only)
** 1/day—//[[augury]]//, //[[suggestion]]// (DC 17)
** At will—//[[invisibility]]// (self only)
** Constant—//[[detect magic]]//
!!! STATISTICS
* ''Str'' +0; ''Dex'' +4; ''Con'' +0; ''Int'' +1; ''Wis'' +0; ''Cha'' +2
* ''Skills'' [[Acrobatics]] +7 (+15 to fly), [[Bluff]] +12, [[Mysticism]] +7
* ''Languages'' Common, Infernal; [[limited telepathy]] 30 ft.
* ''Other Abilities'' [[change shape]] (animal)
!!! ECOLOGY
* ''Environment'' any (Hell)
* ''Organization'' solitary, pair, or murder (3–10)
!!! SPECIAL ABILITIES
''Change Shape ([[Su]])'' An imp can assume the appearance of a Tiny beast, such as a rat, raven, or spider. From this form, in addition to normal benefits of this ability, the imp can gain a climb speed of up to 30 feet. While in its new form, the imp can have a different sort of natural attack. Damage from that attack might be of another kinetic type but retains the dice and poison of the imp's sting.
!!! Imp Poison
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 13
* ''Track'' [[Dexterity|Dexterity Poison Track]]
* ''Frequency'' 1/round for 6 rounds
* ''Cure'' 1 save
</div>
Imps are among the lowest-ranked of the fiends of Hell. However, they serve an important role in corrupting mortals. Easy to summon to the Material Plane, imps willingly form bonds with spellcasters who call them. While on the Material Plane, an imp influences anyone it can to perform diabolical deeds. If serving a mortal master, the imp plays the part of a loyal servant, offering advice, infernal foresight, and even mystic tutelage. The imp's true goal, however, is the delivery of as many souls as possible into damnation.
An imp is also the devil most likely to be found freely roaming the Material Plane. Without help, an imp has no means of returning to Hell. Therefore, a masterless imp remains and continues its Hell-bound duties. The creature insinuates itself into a new situation, either with a different master or a group of wicked mortals. Among weaker creatures, an imp might rise to a leadership role. But such a fiend is more likely to be a dark influence on a stronger leader. In this way, the imp can direct a group toward depravity but take no blame for any failings.
An imp is about 2 feet tall and weighs nearly 13 pounds.
<div class="statblock">
* ''CR'' 1/2; ''XP'' 200
* LE Medium outsider (devil, evil, extraplanar, lawful)
* ''Init'' –1; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +4
* ''Aura'' repulsive nature (5 ft., Fortitude DC 9)
!!! DEFENSE
* ''HP'' 13
* ''EAC'' 10; ''KAC'' 12
* ''Fort'' +4; ''Ref'' +2; ''Will'' +0
* ''Immunities'' fire, poison; ''Resistances'' acid 5, cold 5
* ''Weaknesses'' [[vulnerable]] to good-aligned or silver weapons
!!! OFFENSE
* ''Speed'' 25 ft.
* ''Melee'' claws +7 (1d6+2 S)
!!! STATISTICS
* ''Str'' +2; ''Dex'' –1; ''Con'' +3; ''Int'' –2; ''Wis'' +0; ''Cha'' –2
* ''Skills'' [[Athletics]] +9, [[Intimidate]] +4, [[Stealth]] +4
* ''Languages'' Infernal; [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any (Hell)
* ''Organization'' solitary, pair, or swarm (3 or more)
!!! SPECIAL ABILITIES
''Repulsive Nature ([[Su]])'' A creature that begins its turn within 5 feet of a lemure must succeed at a DC 9 Fortitude save or be [[sickened]] for 1 round. A creature who succeeds at this Fortitude save is unaffected by any lemure’s repulsive nature for 1 day.
</div>
Lemures, the least of all devils, are made from the souls of cruel and selfish mortals. Upon death, these individuals travel the River of Souls and—if not devoured by an astral leviathan or caught in the net of a night hag for resale on the soul market—eventually find themselves at Pharasma’s court in the Boneyard. There, the wicked actions these individuals performed in life earn them eternal damnation, and Pharasma condemns them to the Nine Hells. These pathetic fiends are nearly mindless, forming only after the souls of the damned lose every trace of their former selves. Because lemures lack identities, their faces change and churn through different features, often mirroring the appearance of the last person they saw—an unnerving sight for those unused to lemure physiology. Their bodies are nearly formless, with drooping, misshapen limbs and melting heads. They move by oozing across the ground; at rest, they appear to be little more than lumps of shapeless, stinking flesh.
Though they count among the most loathsome creatures in existence, lemures occupy a vital role in Hell’s ecology. After centuries or torment and corruption, Hell itself twists the souls of the damned into lemures, who begin their journeys in the wastelands of Avernus and travel downward through Hell’s layers until they finally reach the depth that suits their soul’s crimes. Lemures assemble in vast, putrid mobs across the Hells, joining together and awaiting the day a greater devil finds them and combines the fetid mass to create a singular true devil, ready to serve in Hell’s damned legions.
In addition, the ubiquity of lemures in Hell makes them a source of nearly unlimited utility, provided their master remembers not to expect too much of them. A wave of lemures can probe an enemy’s defenses, overwhelm a foe through sheer numbers, clear a minefield, or simply perform manual labor without requiring nourishment or rest. They make poor soldiers, but there are simply so many of them that Hell’s overlords and middle managers often keep a swarm of lemures at the ready, just in case.
<div class="statblock">
* ''CR'' 9; ''XP'' 6,400
* LE Medium outsider (devil, evil, extraplanar, lawful)
* ''Init'' +5; ''Senses'' [[darkvision]] 60 ft., [[see in darkness]]; ''Perception'' +17
!!! DEFENSE
* ''HP'' 145
* ''EAC'' 22; ''KAC'' 24
* ''Fort'' +11; ''Ref'' +13; ''Will'' +8; +2 vs disease, mind-affecting effects, poison, and sleep
* ''DR'' 5/good or silver; ''Immunities'' fire, poison; ''Resistances'' acid 10, cold 10
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' slam +22 (2d10+14 B; critical [[knockdown]])
* ''Ranged'' infernal arc +19 (3d6+9 E; critical [[arc]] 2d6)
* ''Offensive Abilities'' brimstone adjustment
!!! STATISTICS
* ''Str'' +5; ''Dex'' +5; ''Con'' +4; ''Int'' +3; ''Wis'' +1; ''Cha'' –2
* ''Skills'' [[Acrobatics]] +17, [[Athletics]] +22, [[Engineering]] +17
* ''Languages'' Infernal
* ''Other Abilities'' fiendish construction
!!! ECOLOGY
* ''Environment'' any (Hell)
* ''Organization'' solitary
!!! SPECIAL ABILITIES
''Brimstone Adjustment ([[Su]])'' As a move action, a mannequin devil can adjust their diabolic construction to better achieve a task. They choose one armor upgrade from the following list: mk 1 [[electrostatic field]], [[hydrojet]], [[jetpack]], or [[load lifter]]. They can use that armor upgrade for 2 rounds as if it were installed in the appropriate armor with unlimited charges. After those 2 rounds, they can’t use this ability again for 1d4 rounds.
''Fiendish Construction ([[Ex]])'' For effects targeting creatures by type, a mannequin devil counts as both a construct and an outsider (whichever type allows an ability to affect them for abilities that affect only one type, and whichever is worse for abilities that affect both types). They also receive a +2 racial bonus to saving throws against diseases, mind-affecting effects, poisons, and sleep effects, unless the effect specifies that it works against constructs.
''Infernal Arc ([[Su]])'' As a ranged attack, a mannequin devil can generate an arc of infernal electricity. This attack has a range increment of 40 feet and gains the benefits of an //[[unholy]]// weapon fusion.
</div>
Certain sinful creatures spend their mortal lives enacting particular cruelty and violence against androids and other constructs with souls, When their own souls are sent to Hell, the forges of Dis prepare a deeply ironic punishment for them. Rather than letting their soulstuff form new bodies of its own accord in the blasted wastes of Avernus or even be absorbed by more powerful devils, the forges encase these souls in specially constructed bodies.
These mannequin devils, or oidranoths as they call themselves, experience an eternity of toil, forced to work building other mannequins, mining materials for diabolic constructions, and fighting and dying as shock troopers. Their bodies tend to be very similar to mortal androids, though made with black steel. Infernal electricity runs through them along crimson circuits. Their hands are crudely formed from brass and brimstone without much flexibility such that they can’t sabotage their work easily.
Although their bodies are a cruel mockery of the creatures they abused as mortals, mannequin devils rarely rebel. They’re cogs of the machine of Hell, doing their work and desperately hoping to be elevated beyond their status over time.
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* LE Medium outsider (devil, evil, extraplanar, lawful)
* 'Init +1; ''Senses'' [[blindsense]] (emotion), [[darkvision]] 60 ft.; ''Perception'' +8
!!! DEFENSE
* ''HP'' 32
* ''EAC'' 13; ''KAC'' 14
* ''Fort'' +2; ''Ref'' +4; ''Will'' +6
* ''DR'' 5/good or silver; ''Immunities'' fire, poison; ''Resistances'' acid 5, cold 5
!!! OFFENSE
* Speed 30 ft.
* ''Melee'' trunk +6 (1d4+3 B) or bite +6 (1d4 P plus sigveir poison)
* ''Ranged'' azimuth [[laser pistol]] +8 (1d4+3 F; critical [[burn]] 1d4)
* ''Space'' 5 ft.; ''Reach'' 5 ft. (10 ft. with trunk)
* ''Offensive Abilities'' devour emotions, incite emotions
* ''Spell-Like Abilities'' (CL 3rd)
** 1st (3/day)—//[[command]]// (DC 16), //[[detect thoughts]]// (DC 16), //[[disguise self]]//
** 0 (at will)—//[[charming veneer]]// (DC 15), //[[daze]]// (DC 14), //[[ghost sound]]//
!!! STATISTICS
* ''Str'' +0; ''Dex'' +1; ''Con'' +1; ''Int'' +2; ''Wis'' +2; ''Cha'' +4
* ''Skills'' [[Bluff]] +13, [[Computers]] +10, [[Sense Motive]] +8, [[Stealth]] +7
* ''Languages'' Celestial, Common, Draconic, Infernal, [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any (Hell)
* ''Organization'' solitary, partnership (2–4), or firm (5 or more)
!!! SPECIAL ABILITIES
''Devour Emotions ([[Su]])'' A propaganda devil can take a standard action to extend their trunk toward one creature within 30 feet that’s affected by an enchantment (emotion) effect, and then feed on its emotions. The creature’s emotional effect ends, but it’s [[dazed]] for 1 round, and the sigveir gains 2d8 temporary hit points.
''Incite Emotions ([[Su]])'' A propaganda devil can take a full action to bring the dormant emotions of nearby creatures to the surface, overwhelming their reason. When the devil does this, all non-devils within 30 feet must succeed at a DC 14 Will save or be overcome by intense exaggerations of whatever emotions they might already be feeling. The effect lasts for 1 minute or until the sigveir is killed, and affected creatures take a –2 penalty to attack rolls, weapon damage rolls, saving throws, skill checks, and ability checks. This is an enchantment (emotion) effect.
!!! Sigveir Poison
* ''Type'' poison (injury)
* ''Save'' Fortitude DC 14
* ''Track'' [[Wisdom|Wisdom Poison Track]]
* ''Frequency'' 1/round for 6 rounds
* ''Cure'' 1 save
</div>
Sigveirs, also known as propaganda devils, are fiends who tempt mortals into signing infernal contracts using disinformation and fearmongering. They slip inside mortal communities to whisper frightening lies into the ears of the meek, inspiring panic and dread that ultimately drive victims to turn against their neighbors. Sigveirs feed on emotions and delight in cultivating sparks of hope and joy in their prey before devouring every strong feeling their target holds, leaving mortals despondent and vacant. In the legions of Hell, sigveirs serve as messengers and heralds, sometimes becoming clerks or aides to mid-ranking devils.
<div class="statblock">
* ''Tier'' 6
* LE Medium starship outsider
* ''Speed'' 10; ''Maneuverability'' average (turn 2); ''Drift'' ''1
* AC'' 20; ''TL'' 21
* ''HP'' 85; ''DT'' —; ''CT'' 24
* ''Shields'' light 80 (forward 20, port 20, starboard 20, aft 20)
* ''Attack (Forward)'' serrated mandibles (4d6; 1 hex), slow burn heavy missile launcher (8d8, smoldering 4d8; 20 hexes)
* ''Attack (Turret)'' hellfire beam (6d6; 10 hexes)
* ''Power Core'' Light Inferno Core (150 PCU); ''Drift Engine'' Signal Basic
''Systems'' basic computer, budget long-range sensors, mk 4 armor, mk 5 defenses, self-destruct system; ''Expansion Bays'' [[passenger seating]]
* ''Other Abilities'' devil starship, hellfire plating, [[void adaptation]]
!!! CREW ACTIONS
* ''Engineer (1 action)'' [[Engineering]] +13 (4 ranks)
* ''Gunner (1 action)'' gunnery +11 (6th level)
* ''Pilot (1 action)'' [[Piloting]] +18 (4 ranks)
* ''Science Officer (1 action)'' [[Computers]] +13 (4 ranks)
!!! ECOLOGY
* ''Environment'' any (Hell)
* ''Organization'' solitary, wing (2–5), or flight (6–12)
!!! SPECIAL ABILITIES
''Devil Starship ([[Ex]])'' A volocoth is a living creature so immense it functions as a starship (and thus engages only in starship combat). It has no crew, but it can still take engineer, gunner, pilot, and science officer actions using the skill bonuses, ranks, and level listed above. Modifiers for its size, speed, and maneuverability have already been factored into its statistics. Use the following table to determine the effects when a volocoth takes critical damage.
<div class= "table-wrapper">
| d% | System |Effect |h
| 1–10 | Head |Condition applies to gunner actions using the turret. |
| 11–40 | Maw |@@.constrained Condition applies to gunner actions using weapons in the forward arc. If this system is malfunctioning or worse, the volocoth can't hold a starship with its serrated mandibles.@@ |
| 41–70 | Core |@@.constrained Condition applies to all engineer actions, except when patching or repairing the core.@@ |
| 71–100 | Propulsion |Condition applies to all pilot actions. |
</div>
''Hellfire Plating ([[Ex]])'' A volocoth gains a +2 bonus to its AC and TL against direct-fire weapons with “laser” in the name and weapons with the [[smoldering]] special property. After being successfully hit by a smoldering weapon, the volocoth takes no additional damage the following round.
''Serrated Mandibles ([[Ex]])'' A volocoth can use its serrated mandibles only against a ship in an adjacent hex. If the volocoth deals damage with this attack to a ship of its size or smaller, it holds that ship in place. As an action, the pilot of the held starship can attempt a DC 24 [[Piloting]] check to break free of the jaws. While holding a starship in its mandibles, the volocoth can’t move, turn, or use weapons in its forward arc except to attack the held ship. The volocoth and the ship it’s holding take a –2 penalty to AC and TL, and to Piloting checks to determine movement order during starship combat.
</div>
The insectile body of this enormous, flying devil is fronted by a formidable maw with wicked, serrated mandibles. Atop the body, like the forecastle of a nautical ship, is a swiveling beacon of flaming light that channels the fires of Hell. Ships caught in the crush of the volocoth’s mandibles are at greater risk from the attacks of the volocoth’s allies. Capable of carrying a small squad of smaller devils within, void devils are often used as assault vehicles for infernal raids on other planes.
<div class="statblock">
* ''CR'' 7; ''XP'' 3,200
* LE Large outsider (devil, evil, extraplanar, lawful)
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft., [[see in darkness]]; ''Perception'' +19
!!! DEFENSE
* ''HP'' 105
* ''EAC'' 19; ''KAC'' 21
* ''Fort'' +11; ''Ref'' +9; ''Will'' +6
* ''Defensive Abilities'' construct form; ''DR'' 5/good; ''Immunities'' fire, poison; ''Resistances'' acid 10, cold 10; ''SR'' 12
!!! OFFENSE
* ''Speed'' 40 ft., climb 40 ft.
* ''Melee'' sintered [[trident]] +17 (2d8+12 P) or claw +17 (1d6+12 S)
* ''Ranged'' corona [[laser rifle]] +15 (2d6+7 F; critical [[burn]] 1d6) or [[nyfiber net]] +15 ([[entangle]])
* ''Space'' 10 ft.; ''Reach'' 10 ft.
* ''Offensive Abilities'' merciless blow
* ''Spell-Like Abilities'' (CL 7th)
** 1/day—[[summon allies]] (1 levaloch 35%)
** At will—//[[teleport]]// (self plus 5 bulk of gear only)
!!! STATISTICS
* ''Str'' +5; ''Dex'' +3; ''Con'' +4; ''Int'' +2; ''Wis'' +3; ''Cha'' +2
* ''Skills'' [[Acrobatics]] +14, [[Athletics]] +14 (+22 to climb), [[Engineering]] +14, [[Intimidate]] +14, [[Mysticism]] +14, [[Stealth]] +14
* ''Languages'' Celestial, Draconic, Infernal; [[telepathy]] 100 ft.
* ''Other Abilities'' hellstrider, phalanx
* ''Gear'' sintered [[trident]] with integrated corona [[laser rifle]] with 2 high-capacity batteries (40 charges each), [[nyfiber net]]
!!! ECOLOGY
* ''Environment'' any (Hell)
* ''Organization'' solitary, pair, or squadron (3–18)
!!! SPECIAL ABILITIES
''Construct Form ([[Ex]])'' Despite being true devils, levalochs have a number of immunities common to constructs. They are immune to ability damage, ability drain, death effects, disease, [[energy drain]], [[exhaustion]], [[fatigue]], necromancy effects, negative levels, nonlethal damage, [[paralysis]], sleep, and [[stunning]].
''Hellstrider ([[Su]])'' Difficult terrain doesn't hamper a levaloch's movement.
''Merciless Blow ([[Su]])'' If a levaloch hits an [[entangled]] foe with an attack, the target takes 2d6 additional damage of the same type.
''Phalanx ([[Ex]])'' Devils gain a +1 morale bonus to attack rolls and AC while adjacent to a levaloch.
</div>
Few devils personify the infernal approach to military operations like a levaloch. This fiend's mind is simultaneously logical and passionate, driven to promote Hell's order through conflict. Its restless spirit finds joy only in battle. Within Hell's hierarchy, levalochs serve in elite strike forces composed entirely of others of their kind or as commanders of units of other warlike devils.
Fearsome in appearance and skill, warmonger devils are diabolical essences infused into constructed metallic frames. Standing 10 feet tall and weighing 1 ton, a levaloch's body resembles the torso of a hellish, armored knight placed atop six fiendish, clawed, insectile legs. Even compared to other devils, the anatomy of a levaloch is an enigma. They have no internal physiology at all, being little more than living suits of blasphemous chitin and Hell-forged armor. As a result, levalochs are often misidentified as constructs.
A single levaloch is quite powerful on its own, but the devils' true might lies in working alongside other devils in battle. Levalochs lead from the front lines, inspiring their allies and terrifying their foes. They are demanding, stern leaders, but they aren't dismissive of devils lower in Hell's hierarchy. Levalochs instead assess a given ally based on that being's capabilities and strategic utility, knowing a single powerful devil might not be able to accomplish what a horde of lesser fiends can. Warmonger devils' grasp of strategy and tactics is undisputed, and they can understand and execute complex maneuvers. Coupled with this tactical mastery is a devious creativity that allows a levaloch to respond well to unexpected changes in a situation. This adaptability surprises foes that assume the ordered minds of devils are stagnant and resistant to change.
In any confrontation, warmonger devils prefer to wipe out weaker targets first and cut off routes of escape, leaving dangerous foes without allies to call upon or any recourse but defeat or surrender. Levalochs try to avoid throwing away their own troops needlessly, not out of any sense of compassion, but out of a desire to preserve numerical advantage. Fewer troops mean a diminished ability to wage war. Regardless, levalochs value infernal warriors over mortal troops and utilize them in battle accordingly.
When the forces of Hell engage in interplanetary assault, levalochs ride in the cargo cavity of a [[dhalochar]] to serve as a supplemental incursion force, quickly quelling pockets of resistance and paving the way for wider devilish invasion. Sometimes they remain within the dhalochar's cargo cavity until the spacefaring fiend crashes to the ground. Other times, they teleport to the planet while the dhalochar remains in the atmosphere to demolish any air defenses a defender might scramble.
Levalochs can also serve as useful agents provocateurs, whether preparing a world for conquest or serving a mortal summoner. Stealthy despite their large size, they can infiltrate target locations with guile rather than numbers or direct force. A levaloch's true allegiance is to Hell, however, and sloppily worded contracts and orders can lead one of them to undermine mission objectives if the levaloch believes doing so is in the best interests of its infernal masters. While warmongers do not ingratiate themselves to mortals who have summoned them as easily as other devils do, they hide their motives well.
Among mercenary captains in and near the Pact Worlds, stories persist of training camps run by levalochs where mortals can receive expert training at the hands of devils, paying with various services or currencies—especially souls. For the downtrodden and desperate, this deal can be tempting. More than a few amateur warriors have disappeared for a few months, only to resurface later with devilishly fierce skills in battle. Even more disturbing are the reports of a mercenary company consisting entirely of levalochs. These devils supposedly offer their services as soldiers of fortune to the highest bidder, though once again, care must be taken when drawing up the contracts for such services to avoid any conflicts of interests with the levalochs' loyalty to Hell itself.
As befits creatures designed for combat, levalochs have a particular interest in weapon technologies. Rumors swirl that several arms manufacturers use levalochs as consultants on projects, sometimes over the protestations of other employees. Corporate lawyers who craft these infernal pacts assure staff that the levalochs' contracts are airtight. Such reassurances and the potential for increased profits are enough to assuage the fears of the corporate elite.
!! Levaloch Tridents
{{Levaloch Trident}}
Devils are fiends, or evil outsiders, native to Hell.
<<list-links "[tag<currentTiddler>sort[title]]" class:index>>
Despite its name, this carbon-plate armor is the brainchild of overeager marketers at Brortrav Ordnance Factories, not nihilistic cultists. While the environmental protection system of Devourer's skin is active, nanites hidden within its plates roil out and coalesce into dozens of short tendrils across the wearer's body. While the nanites are active, the first time each round that a creature touches the wearer, that creature must succeed at a Reflex save (DC = 10 + the Devourer's skin item level) or take acid damage equal to the armor's item level. Furthermore, when the wearer makes unarmed attacks with the nanites active, they can choose to replace half of the damage dealt by their unarmed strikes with acid damage. This never causes an unarmed strike that targets KAC to target EAC instead. Wounds inflicted by Devourer's skin have a characteristic "chewed" look that earned the armor its gory classifications.
<div class="table-wrapper">
|Armor | Level | Price | EAC<br>Bonus | KAC<br>Bonus | Maximum<br/>Dex Bonus | Armor Check<br/>Penalty | Speed<br/>Adjustment | Upgrade<br>Slots | Bulk |h
|Devourer's skin, chewing | 3 | 1,500 | +2 | +4 | +4 | –1 | —. | 0 | 1 |
|Devourer's skin, gnawing | 7 | 8,000 | +6 | +9 | +4 | –1 | —. | 1 | 1 |
|Devourer's skin, gnashing | 11 | 25,000 | +12 | +15 | +5 | –1 | —. | 1 | 1 |
|Devourer's skin, masticating | 17 | 275,000 | +18 | +21 | +5 | –1 | —. | 1 | 1 |
</div>
//Healthy—Sluggish—Stiffened—Staggered—Immobile—Dead//
//Sluggish:// The victim takes a –2 penalty to Reflex saves and Dexterity-based ability checks, attack rolls, and skill checks; the DCs of her spells and special abilities decrease by 2; and she becomes [[flat-footed]].
//Stiffened:// The victim loses her Dexterity bonus to her Armor Class, and she can't take reactions.
//Staggered:// The victim is [[staggered]] but can take purely mental full actions.
//Immobile:// The victim is [[helpless]] and can take only purely mental actions.
//Dead:// The victim dies.
This iridescent metal headband features an intricate rendering of a butterfly, resplendent with jeweled stars, suns, and moons on its wings. You can activate the headband as a reaction when you provoke an attack of opportunity, surrounding yourself in a momentary burst of starlight and butterfly wings that confounds your attackers, granting you [[concealment]] against any attacks your triggering action provoked. After resolving the attacks of opportunity, the light and butterflies dissipate, imparting an instantaneous vision of victories to come. Before the end of your next turn, you can declare that an attack, saving throw, or skill check you’re about to attempt was the subject of that vision. If your vision applies to an attack or saving throw, apply a +1 insight bonus to the roll. If the vision applies to a skill check, roll 1d4 and add the result as an insight bonus to the check’s result.
After you activate the diadem, you can’t do so again until you rest for 10 minutes to recover Stamina Points.
<div class= "table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|//diadem of Desna// | 2 | 800 | L |
</div>
This smooth, thumb-sized device activates automatically when it is inside a living creature. You can implant a diagnostic lozenge subdermally in a willing or unconscious creature with a successful DC 20 [[Medicine]] check, or a creature can choose to swallow one. An activated diagnostic lozenge steers itself into a creature's tissue and extrudes several filaments to monitor its status, broadcasting information on a predetermined wireless frequency to a designated receiver, such as a [[datapad]] or [[comm unit]], as long as the receiver is within 1 mile of the lozenge. The diagnostic lozenge broadcasts the creature's direction and distance relative to the receiver, as well as any of the following conditions that are affecting the creature: dead, dying, [[frightened]], [[nauseated]], [[panicked]], [[sickened]], [[stable]], [[staggered]], [[stunned]], or [[unconscious]]. A single receiver can accept information from up to six different diagnostic lozenges simultaneously. When a diagnostic lozenge runs out of charges, it breaks down into harmless components that eventually pass out of the creature's body. Diagnostic lozenges can't normally be safely removed once activated.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|diagnostic lozenge | 2 | 175 | — | 20 | 1/hour |
</div>
Beautiful and expensive-looking, this canid statue transforms into a [[tashtari]] alpha. The tashtari alpha can’t use its bristle nova ability unless its figurine has been exposed to at least one continuous hour of sunlight in the past 24 hours.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|// diamond laser wolf// | 14 | 65,500 | – |
</div>
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* N Large magical beast (aquatic)
* ''Init'' +6; ''Senses'' [[blindsight]] 150 ft. (electromagnetism), [[sightless]]; ''Perception'' +16
!!! DEFENSE
* ''HP'' 125
* ''EAC'' 20; ''KAC'' 22
* ''Fort'' +12; ''Ref'' +12; ''Will'' +7
* ''Defensive Abilities'' darkwater veil; ''Immunities'' cold, [[paralysis]], sleep
* ''Weaknesses'' electromagnetic blindness
!!! OFFENSE
* ''Speed'' swim 50 ft.
* ''Melee'' bite +20 (3d4+12 P) or tongue +20 (special)
* ''Space'' 10 ft.; ''Reach'' 10 ft. (30 ft. with tongue)
!!! STATISTICS
* ''Str'' +4; ''Dex'' +6; ''Con'' +2; ''Int'' –2; ''Wis'' +1; ''Cha'' +0
* ''Skills'' [[Acrobatics]] +16, [[Stealth]] +21, [[Survival]] +16
* ''Languages'' electrocommunication 150 ft.
!!! ECOLOGY
* ''Environment'' cold aquatic (Diaspora)
* ''Organization'' solitary, pair, or brood (3–7)
!!! SPECIAL ABILITIES
''Darkwater Veil ([[Su]])'' As a move action, a diaspora wyrm can alter the structure of water within a 10-foot-radius spread so that it forms nanotubes that absorb light. This field moves with the wyrm, obscuring most sight and providing total concealment. A creature that has [[darkvision]] treats the field within 5 feet as if it provides only concealment. Magical light from a source of a higher level or CR than the wyrm's negates the effect while the two interact. The wyrm can dismiss the field as a move action, and the field ends after 1 minute if the wyrm takes no action to renew it.
''Electrocommunication ([[Ex]])'' Diaspora wyrms communicate by shaping and reading electromagnetic fields. This functions as telepathy among creatures with this ability.
''Electromagnetic Blindness ([[Ex]])'' To a diaspora wyrm, a strong electromagnetic field (such as high [[radiation]]) acts like fog. Electricity damage forces the wyrm to succeed at a Fortitude saving throw (DC = 10 + the damage taken) or be [[blinded]] for 1 round. Multiple failures during the same round do not extend this duration.
''Tongue ([[Ex]])'' A diaspora wyrm can use its long, sticky tongue to make a melee attack that targets EAC. A creature hit by this attack becomes stuck to the wyrm's tongue, gaining the [[grappled]] condition until it escapes, or until the diaspora wyrm releases the creature as a swift action. While a creature is grappled as a result of this attack, the diaspora wyrm can attempt reposition combat maneuvers against that creature, but only to move it toward the diaspora wyrm. If the wyrm succeeds at such a maneuver and the creature is within range of the wyrm's bite attack at the end of the movement, the wyrm can make a bite attack as part of that maneuver. Additionally, while a creature is grappled this way, the diaspora wyrm can use its bite attack only against the grappled creature, and it can't use its tongue attack.
</div>
<<section 'Diaspora Wyrm Sage' >>
The icy ocean world of Nisis is the Diaspora's heart, feeding [[sarcesian]] crèche worlds and connecting them through the River Between. The Pact Worlds claim these waters, but in their depths lurk elusive monstrosities that truly rule them. Dubbed "diaspora wyrms" in legends from before the Gap, these predators resemble immense, fanged eels. Younger wyrms are sleek and sinuous, while older ones bear fringes of calcium-based scales. Instead of eyes, a wyrm has frills sensitive to electromagnetic fields. Organs in the wyrm's head allow it to shape its field, producing waves that allow communication.
Popular fiction depicts these wyrms as beasts, because in addition to being hostile to intruders in their seas, the wyrms communicate through electrocommunication in a way often undetectable without proper sensors. Nevertheless, diaspora wyrms are sapient, and some grow sagacious over their centuries-long lives. They communicate among themselves, working to keep and pass on their legacy. So central is this fixation that the wyrms' name for themselves translates roughly to "those in observation."
Diaspora wyrms predate the Diaspora's formation. According to their history, they evolved in a subterranean sea on one of the twin worlds that, when destroyed, created the asteroid belt. When that world cracked apart, the chunk containing their home survived intact for a time, its egg-like outer layers slowly breaking away or sinking down into the new planetoid's core in a process the wyrms call "the Hatching." This planetoid became Nisis. In its waters, the wyrms adjusted to their changed environment. They evolved the ability to alter the water around them to recreate the darkness that birthed them. The molecular change the wyrms create is lasting, and when the wyrm releases the changed water, it renders the surrounding liquid cloudy as the altered molecules disperse. These particles break down, but not quickly.
Today, the oldest and wisest wyrms, called sages, keep mostly to Nisis's depths, obeying an ancestral mandate to protect the Broodnest. This mazelike coral reef is not only the wyrms' home but also an elegant organic network bearing electrical fields that record the wyrms' history—though like any other record, fractured by the Gap. Wyrms that attack the settlements inside the planet's ice shell are usually young ones that hunt for food and sport until maturity and duty draw them back into the depths. However, some sages have begun preparing the wyrms for the possibility that NiSis's oceans are freezing permanently. Believing the only way to ensure their species' survival is to colonize new worlds, these wyrms have been scouting the River Between, darkening its waters as they hunt for a way to escape their fate. Wyrms in Nisis's depths have purposely darkened water there and released it in cycles, simultaneously darkening Nisis's ocean.
An average diaspora wyrm is 15 feet long and weighs 1,200 pounds. However, diaspora wyrms grow throughout their lives. The largest can be up to 30 feet long and weigh over 5 tons.
!! Darkwater Grenades
While diaspora wyrms remain largely unseen, the water they alter has been studied. Science and magic have replicated the creatures' abilities in devices such as the //[[darkwater grenade]]//.
{{Darkwater Grenade}}
<div class="statblock">
* ''CR'' 17; ''XP'' 102,400
* N Huge magical beast (aquatic)
* ''Init'' +10; ''Senses'' [[blindsight]] 300 ft. (electromagnetism), [[sightless]]; [[Perception]] +29
!!! DEFENSE
* ''HP'' 330
* ''EAC'' 31; ''KAC'' 33
* ''Fort'' +21; ''Ref'' +21; ''Will'' +15
* ''Defensive Abilities'' darkwater veil; ''DR'' 10/—; ''Immunities'' cold, [[paralysis]], sleep
* ''Weaknesses'' electromagnetic blindness
!!! OFFENSE
* ''Speed'' swim 60 ft.
* ''Melee'' bite +32 (6d12+24 P) or tongue +32 (special)
* ''Space'' 15 ft.; ''Reach'' 15 ft. (50 ft. with tongue)
!!! STATISTICS
* ''Str'' +7; ''Dex'' +10; ''Con'' +4; ''Int'' +0; ''Wis'' +3; ''Cha'' +1
* ''Skills'' [[Acrobatics]] +29, [[Mysticism]] +34, [[Stealth]] +29, [[Survival]] +29
* ''Languages'' electrocommunication 300 ft.
!!! ECOLOGY
* ''Environment'' cold aquatic (Nisis)
* ''Organization'' solitary, pair, or council (3–5)
!!! SPECIAL ABILITIES
''Darkwater Veil ([[Su]])'' As [[diaspora wyrm]], but the veil works in a 20-foot-radius spread.
''Electrocommunication ([[Ex]])'' As [[diaspora wyrm]], but a diaspora wyrm sage can communicate through technological communication devices and to technological constructs.
''Electromagnetic Blindness ([[Ex]])'' As [[diaspora wyrm]].
''Tongue ([[Ex]])'' As [[diaspora wyrm]].
</div>
These sleek firearms were developed by the finest [[sarcesian]] engineers for use by elite mercenaries. The most common manufacturer is MuniTech, one of the only corporations fully owned and operated by sarcesians. Diasporan rifles are sniper rifles that belong to the laser category.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|Diasporan rifle, tactical | 1 | 350 | 1d8 F | 70 ft. | — | 10 charges | 1 | 1 |[[sniper]] (250 ft.), [[unwieldy]] |
|Diasporan rifle, advanced | 5 | 3,750 | 2d8 F | 70 ft. | — | 20 charges | 1 | 2 |[[sniper]] (500 ft.), [[unwieldy]] |
|Diasporan rifle, elite | 10 | 17,000 | 4d8 F | 80 ft. | — | 20 charges | 1 | 2 |[[sniper]] (750 ft.), [[unwieldy]] |
|Diasporan rifle, ultra | 15 | 110,000 | 6d8 F | 80 ft. | — | 30 charges | 1 | 2 |[[sniper]] (1,000 ft.), [[unwieldy]] |
|Diasporan rifle, imperial | 20 | 725,000 | 10d8 F | 80 ft. | — | 30 charges | 1 | 2 |[[sniper]] (1,000 ft.), [[unwieldy]] |
</div>
<div class="statblock">
* ''CR'' 1/2; ''XP'' 200
* N Small vermin
* ''Init'' +2; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +4
!!! DEFENSE
* ''HP'' 13
* ''EAC'' 10; ''KAC'' 12
* ''Fort'' +4; ''Ref'' +2; ''Will'' +0
* ''Immunities'' disease, poison
!!! OFFENSE
* ''Speed'' 30 ft., burrow 10 ft.
* ''Melee'' bite +6 (1d4+1 S; critical [[burn]] 1)
* ''Offensive Abilities'' detonate, explosive charge
!!! STATISTICS
* ''Str'' +1; ''Dex'' +2; ''Con'' +3; ''Int'' —; ''Wis'' +0; ''Cha'' –3
* ''Skills'' [[Athletics]] +9
* ''Other Abilities'' [[compression]], [[mindless]]
!!! ECOLOGY
* ''Environment'' any land
* ''Organization'' solitary, pair, or rout (3–10)
!!! SPECIAL ABILITIES
''Detonate ([[Ex]])'' While the diatha has 4 or fewer Hit Points, its energy-dense flesh becomes unstable. If, while in this state, the diatha takes acid, electricity, fire, piercing, slashing, or sonic damage, or uses its explosive charge ability, it dies, exploding in a 10-foot-radius burst, dealing 1d6 fire damage (Reflex DC 9 half).
''Explosive Charge ([[Ex]])'' While the diatha has 4 or fewer Hit Points, as a full action, the creature can move up to double its speed and make a bite attack. Its detonate ability then triggers.
</div>
<<section 'Diatha Elder' >>
Diathas are a common species of what are known as "explosive slugs." Found throughout the galaxy, including on Vesk-2, diathas store energy in chemical chains, rather than in fat deposits, causing the slugs to smell like raw petroleum. When threatened, diathas bite. and they sometimes regurgitate volatile materials that ignite on contact with air into the wound.
Diathas are cooperative creatures that organize themselves into hives. These hives live in warrens normal diathas slowly dig in the dirt, making distinctive mounds of churned soil with stable passages underneath. Diathas usually dig their warrens into gently rolling ground, but some can be found on hillsides or sheltered in ruins. The slugs have also adapted to maintenance tunnels and power conduits big enough to facilitate their movement. A single diatha hive claims a wide territory, building numerous communal mounds with extensive connecting tunnels. The diathas fiercely defend this territory, especially the hive mounds.
Such an interconnected diatha hive can contain hundreds of normal diathas, which work to find food for larvae and for older, stronger diathas known as elders. Their ultimate defensive adaptation is the ability to detonate their energy-packed flesh while in an injured and excited state. If a foe manages to break into a diatha hive, each of the creatures within is a potential explosive deathtrap. The loss of several diathas does little harm to the hive as a whole. However, the explosions can destroy or drive away predators much larger and more powerful than the diathas.
While diatha flesh is explosive, it is stable under in most circumstances. Like manufactured explosives, a diatha is difficult to set off unless "primed" first. Hurting a diatha initially has no effect. However, when a diatha is badly wounded, hormones released as a stress response destabilize its flesh. A diatha excited in this way launches itself into a suicide charge, slamming into a foe and detonating itself with an electrochemical spark from its brain. If the diatha's body takes certain types of damage after it becomes unstable, the creature also explodes.
As diathas age, they become more energy-rich and buoyant with stored internal gases, and their malleable bodies can extend winglike flaps. These floating diathas rise in prominence within the hive and enjoy less and less work. Such elders are expected to scout for food and potential territory in places only they can reach. They also guard the hive.
Although all diathas can exchange sex cells at any time, they produce no young until they achieve elder status. Elder diathas produce larvae, with a birth rate based on how much food the hive has. Normal diathas then care for the offspring. A hive with a dearth of food may struggle to produce enough larvae to replace diathas that die defending the hive, while hives with plentiful forage can expand so rapidly that one hive breaks into multiple smaller hives, expanding diatha territory in the region.
Diathas eat anything that won't kill them, converting it into the fuel-like liquid they require. They spread through battlefields, settlements, and starships, seeking out and eating energy-rich material, such as flamer petrol. A lone diatha is little threat. However, if an elder can break into a food source in a potential lair, that diatha can birth offspring. This new colony might become dangerous as the diatha population grows and the creatures become more territorial.
Diathas that burrow into the infrastructure of starships are often carried to new star systems. Being resilient creatures, they quickly adapt to their new environments. Xenobiologists believe this to be one reason they can be found throughout the galaxy. Diathas can dominate worlds in early stages of biological development, displacing or killing native species. The Pact Worlds and Veskarium have strict quarantine measures for vessels arriving from systems known to have diatha infestations, as do many other planets. However, these laws most often are passed in the wake of a diatha-related disaster.
A typical diatha is 2 feet long and weighs 90 pounds. Elders can grow to nearly 4 feet, weighing up to 50 pounds.
!! Diatha Ammunition
{{Diatha (weapon special property)}}
A combination of magic and technology can enable the use of larval [[diatha]] in physical ammunition, such as in an [[arrow]] (including special arrows other than grenade arrows), a [[dart]], a [[mini-rocket]], a [[round]] (small arm, heavy, long arm, or sniper), or a [[shell|scattergun shells]]. The larva is placed in a state of torpor, waking up only when the ammunition is fired, which immediately engages the larva's defensive chemistry. Such ammo is not only [[explosive]] ammunition, but also has the [[ignite]] weapon special property, dealing 1d4 fire damage. This ammunition costs 100 credits more than its unaugmented counterpart. Amplified diatha ammunition adds 500 credits to the cost; its [[fiery]] property deals 2d4 fire damage. Diatha ammunition is 1 item level higher than normal explosive ammunition. It increases the item level of any other ammunition it augments by 1, up to item level 8. Higher-level ammo doesn't increase in item level due to being diatha ammunition.
<div class="statblock">
* ''CR'' 5; ''XP'' 1,600
* N Small vermin
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +11
!!! DEFENSE
* ''HP'' 70
* ''EAC'' 17; ''KAC'' 19
* ''Fort'' +9; ''Ref'' +7; ''Will'' +4
* ''Immunities'' disease, poison
!!! OFFENSE
* ''Speed'' 30 ft., burrow 10 ft., fly 30 ft. ([[Ex]], average)
* ''Melee'' bite +14 (1d6+7 S; critical [[burn]] 1d4)
* ''Offensive Abilities'' detonate, explosive charge
!!! STATISTICS
''Str'' +2; ''Dex'' +3; ''Con'' +5; ''Int'' —; ''Wis'' +0; ''Cha'' –2
''Skills'' [[Acrobatics]] +11, [[Athletics]] +16
* ''Other Abilities'' buoyant, [[compression]], [[mindless]]
!!! ECOLOGY
* ''Environment'' any land
* ''Organization'' solitary, pair, or escort (3–5)
!!! SPECIAL ABILITIES
''Buoyant ([[Ex]])'' A diatha elder can hover as a swift action or part of a full action without needing to attempt an [[Acrobatics]] check. It can avoid falling damage as if it had perfect maneuverability.
''Detonate ([[Ex]])'' As [[diatha]], but the diatha elder is in the detonate state while at 20 or fewer Hit Points. Its explosion deals 2d6 fire damage and causes the [[burning]] condition dealing 1d4 fire damage (Reflex DC 13 for half damage and no burning condition).
''Explosive Charge ([[Ex]])'' As [[diatha]], but the diatha elder can use this ability while at 20 or fewer Hit Points.
</div>
You are especially hard to kill. Your wounds quickly stabilize when you're grievously wounded.
''Benefit:'' When you are dying, you can spend the required Resolve Points to [[stabilize]] and 1 Resolve Point to stay in the fight (regaining 1 Hit Point) in the same round.
''Normal:'' You must use Resolve Points to stabilize and to stay in the fight in separate rounds.
Whenever your starship has fewer than half its total Hull Points remaining, you gain a +1 enhancement bonus to your starship combat skill checks and gunnery checks.
Difficult terrain, such as heavy undergrowth, piles of junk, or steep stairs, hampers movement. Each move into a square of difficult terrain counts as 2 squares of movement. Each diagonal move into a difficult terrain square counts as 3 squares. You can't run or charge across difficult terrain. If you occupy multiple squares with different kinds of terrain, you can move only as fast as the most difficult terrain will allow. Flying and incorporeal creatures are not hampered by most difficult terrain, though a dense tree canopy or web of chains might count as difficult terrain for flying creatures.
A //diffraction cloak// bends light around it, causing the garment to subtly shimmer and hinting at its ability to warp nearby energy. While you wear this cloak, it protects you from cold, electricity, fire, and force damage. If an attack dealing such damage targets your EAC and hits, as a reaction you can force the attacker to be reroll the d20 and use the lower result. If you fail a saving throw against an effect that deals such damage, as a reaction you can reroll the saving throw and use the higher result. If you use a given //diffraction cloak//, you can't benefit from a different one for 24 hours.
The cloak allows a number of rerolls per day based on its type.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Rerolls/Day |h
|//diffraction cloak//, mk 1 | 5 | 3,200 | 1 | 1 |
|//diffraction cloak//, mk 2 | 9 | 12,500 | 1 | 2 |
|//diffraction cloak//, mk 3 | 13 | 51,000 | 1 | 3 |
</div>
name:digital assault torrent
range:medium
speed:—
damage:special
pcu:15
cost:25
special:[[hacking|Hacking]]
<div class="statblock">
* <<levels>>
* ''School'' conjuration (teleport)
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Targets'' you
* ''Duration'' 1 hour/level or until expended; see text
</div>
You gain the ability to step into a piece of electronic equipment currently connected to a communication or information network (such as a [[comm unit]] or a computer connected to an infosphere), converting yourself into digital information and traveling along the network. Once uploaded onto a network, you teleport out from any device within 3,000 feet of the device that you entered; if no such device is in range, you emerge from the same device you entered. You are instantly aware of all unsecured devices connected to the same network as the one you entered, and you can attempt a [[Computers]] check (DC = 15 + 1-1/2 × the item's level) to detect other devices (this does not require an action); a single check renders you aware of all devices whose DC to detect you exceeded. If the item is a computer, your Computers check result must also exceed the DC required to successfully hack it. This movement acts as the //[[teleport]]// spell, except there is no chance of missing your destination.
When attempting to enter or exit a computer with one or more countermeasures, you automatically trigger any countermeasures that are not successfully disabled. When you emerge from a computer, you can attempt one Computers check, with the result compared to the DC of each countermeasure in place on that computer (this does not require an action); you suffer the effects of all countermeasures with a DC higher than the result of your check. Some countermeasures triggered in this manner are exceptionally dangerous, as noted below.
''Feedback:'' The digital virus uploaded into your data causes you to become exposed to the [[mindfire]] disease, but the disease has a save DC of 15 + half the item level of the destination device.
''Firewall:'' You arrive at the destination [[prone]], and you remain [[flat-footed]] and [[off-target]] for 1 minute.
''Wipe:'' Your recent memories are scrambled, with minor elements removed, causing you to be [[confused]] for a number of rounds equal to half the item level of the destination device (minimum 1 round).
A //digital harrow deck// is a modernization of an archaic means of fortune-telling whose roots trace back to vanished Golarion. Once per day, you can activate the deck as a full action. It projects holograms of 54 cards, which buzz around you. To begin the reading, you ask a question aloud to the harrow deck, causing all of the cards to come together as a deck; then, the deck uses hundreds of advanced pseudomystical calculations to deal a three-by-three array of cards for you, which it then uses to vocally interpret the circumstances surrounding your question. This works as the //[[augury]]// spell, with a spell level equal to the deck's item level.
Additionally, a mystic who has a //digital harrow deck// and who also knows //augury// can ignore the spell's requirement that a Resolve Point be spent to cast it. A mystic can do this a number of times per day equal to his Wisdom bonus.
A technomancer can designate a digital harrow deck as her [[spell cache]]. If she does, the deck's AI integrates with her own consciousness, providing her with a +1 bonus to her caster level for divination spells and effects. Additionally, she can spend 1 Resolve Point as a swift action when she casts a technomancer spell to draw upon the algorithms that allow the deck to function, adding a +1 insight bonus to the spell's save DC.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//digital harrow deck// | 5 | 3,500 | L |
</div>
name:digital raid node
range:medium
speed:—
damage:special
pcu:15
cost:15
special:[[hacking|Hacking (starship weapon property)]]
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 reaction
* ''Range'' personal
* ''Duration'' instantaneous
</div>
When you take damage from an effect, you can create a defensive conduit between yourself and one technological object, non-archaic armor, or non‑archaic weapon you're carrying or wearing that's 3 Bulk or less. The chosen object takes damage equal to 1d6 times your caster level, ignoring the object's [[hardness]]. You reduce the damage you take from the triggering attack by half this result, though you can't reduce the damage by more than 3 times the item's level.
name:digital strike conduit
range:medium
speed:—
damage:special
pcu:10
cost:10
special:[[hacking]]
Weapons with the digitize critical hit effect convert targets into raw data. On a critical hit, the target must succeed at a Will save (DC = 10 + 1/2 the item's level + your Intelligence modifier) or begin breaking down with blips of sound, taking the listed amount of sonic damage every round until the target succeeds at a Will save to end the damage. This functions as the [[burning]] condition, except as noted. The ongoing damage also ends if the target succeeds at a [[Computers]] check (same DC as the Will save) as a standard action.
Digitizers are usually gaudy weapons, likely manifested within some virtual reality or created by cultures locked in digital simulations. Digitizer weapons use standard batteries and insistently announce (sometimes in long-forgotten languages) that they require more ammunition whenever the battery is reduced below 20% its total capacity.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|digitizer pistol, silver | 7 | 6,000 | 2d4 So | 40 ft. | [[digitize]] 1d6 | 40 charges | 2 | L |[[bright]], [[professional]] (vidgamer) |
|digitizer pistol, gold | 13 | 46,000 | 5d4 So | 40 ft. | [[digitize]] 2d6 | 80 charges | 4 | L |[[bright]], [[professional]] (vidgamer) |
|digitizer pistol, holofoil | 19 | 580,000 | 10d4 So | 40 ft. | [[digitize]] 4d6 | 100 charges | 5 | L |[[bright]], [[professional]] (vidgamer) |
</div>
Digitizers are usually gaudy weapons, likely manifested within some virtual reality or created by cultures locked in digital simulations. Digitizer weapons use standard batteries and insistently announce (sometimes in long-forgotten languages) that they require more ammunition whenever the battery is reduced below 20% its total capacity.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|digitizer rifle, silver | 8 | 8,000 | 2d8 So | 80 ft. | [[digitize]] 1d8 | 40 charges | 2 | 1 |[[bright]], [[professional]] (vidgamer) |
|digitizer rifle, gold | 14 | 65,000 | 5d8 So | 80 ft. | [[digitize]] 2d8 | 80 charges | 4 | 1 |[[bright]], [[professional]] (vidgamer) |
|digitizer rifle, holofoil | 20 | 900,000 | 10d8 So | 80 ft. | [[digitize]] 4d8 | 100 charges | 5 | 1 |[[bright]], [[professional]] (vidgamer) |
</div>
Your ordered mind allows you to thoroughly search an area in less time.
''Prerequisites:'' [[Perception]] 1 rank.
''Benefit:'' You gain a +1 insight bonus to [[Perception]] checks. In addition, you can take 20 on a Perception check to [[search]] in only 5 times the usual amount of time, meaning it takes only 5 minutes for you to exhaustively search an area no more than 20 feet by 20 feet.
''Normal:'' It takes 20 minutes to exhaustively search an area no more than 20 feet by 20 feet.
<div class="statblock">
* <<levels>>
* ''School'' conjuration (teleportation)
* ''Casting Time'' 1 standard action
* ''Range'' long (400 ft. + 40 ft./level)
* ''Targets'' you and touched objects or touched willing or [[unconscious]] creatures
* ''Duration'' instantaneous
* ''Saving Throw'' none, Will negates (object)
* ''Spell Resistance'' no, yes (object)
</div>
You instantly transfer yourself from your current location to any other spot within range. You always arrive at exactly the spot desired—whether by simply visualizing the area or by stating its direction. You can bring along objects as long as their weight doesn't exceed your maximum load. You can also bring up to four additional willing or [[unconscious]] Medium or smaller creatures (carrying gear or objects up to their maximum load) or their equivalent. A Large creature counts as two Medium creatures, and a Huge creature counts as two Large creatures.
All creatures to be transported must be in contact with one another, and at least one of those creatures must be in contact with you. After using this spell, you can't take any other actions until your next turn (and each creature traveling with you can't take any other actions until its next turn). If you arrive in a place that is already occupied by a solid body, you and each creature traveling with you each take 1d6 damage and are shunted to a random open space on a suitable surface within 100 feet of the intended location. If there is no free space within 100 feet, you and each creature traveling with you take 2d6 additional damage and are shunted to a free space within 1,000 feet. If there is no free space within 1,000 feet, you and each creature traveling with you take 4d6 additional damage and the spell simply fails.
You have always known of and felt pulled toward the Dimension of Time. You might have encountered a hound of Tindalos or a time dimensional at some point in your life that created this unerring bond. You could explore the cosmos as an unwitting agent for the mysterious powers within the Dimension of Time, or you could simply use your powers for personal gain.
''Focal Paradox:'' Reflex saving throws
''Improved Anchor:'' Once per day, you can touch an object in your possession of 1 bulk or less. The object is protected from mundane effects of the passage of time (for example, metal does not rust, and fruit does not ripen or spoil) as long as you maintain this effect on it. You can maintain this effect on a number of objects equal to your Dexterity modifier (minimum 1) at any one time. If you exceed this limit, the oldest existing effect immediately ends. This ability has no effect on the functionality of technological objects.
''Greater Anchor:'' You can unfetter your ability to travel as you traverse through perfect moments in time. Once per day as a swift action, you can move through difficult terrain without penalty, you increase all of your speeds by 20 feet, and you gain a +4 circumstance bonus to saving throws against any effects that would impart the [[entangled]], [[exhausted]], [[fatigued]], [[flat-footed]], [[grappled]], [[paralyzed]], [[pinned]], [[staggered]], or [[stunned]] conditions. These benefits last for a number of rounds equal to your precog level.
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' one creature or object
* ''Duration'' 1 minute/level
* ''Saving Throw'' none
* ''Spell Resistance'' yes (object)
</div>
You fire a ray at the target, making a ranged attack against its EAC. On a hit, the target is covered in a shimmering field that prevents planar travel. The target can't be affected by any effect that causes the target to move extradimensionally or to another plane, such as teleportation, summoning, plane shifting, astral travel, ethereal travel, and so on. An affected starship can't enter or emerge from Drift travel.
Your legs are fitted with braces attuned to the resonance frequency of the Astral Plane. Once per day as a standard action, you can teleport yourself, per //[[dimension door]]//, with a maximum range of 120 feet. You can't bring any other creatures with you.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|//dimensional braces// | 12 | 38,000 | all legs |
</div>
These devices are handheld and circular in shape and have a very high-resolution screen and simple controls. Dimensional comm units are a [[kishalee]] version of the [[comm units]] commonly found in the Pact Worlds, but they function using the remnants of the vast demiplane network utilized by the now extinct kishalee civilization. The advantage of dimensional comm units is that their text and verbal communications are instantaneous, whether in the same system or through interstellar space, but because of the degraded state of the kishalee dimensional network, they work only sporadically. Prior to use, a dimensional comm unit must be linked with at least one other unit—a process that takes only a minute when all units to be linked are on the same planet. Dimensional comm units nearly always work when used on the same planet to reach other linked devices. Over greater distances, each time a dimensional comm is used, there is a 50% chance that it will function properly if used in the same system or a 25% chance if the communication is interstellar (this is rolled in secret by the GM), but only with linked dimensional comm units. If two linked dimensional comm units make a connection, they retain that connection for 24 hours. If the dimensional comm units don't manage to connect, the users can try again after 24 hours. Dimensional comm units do not function within the Drift or on other planes.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|dimensional comm unit | 6 | 4,500 | — |
</div>
<div class="statblock">
* <<levels>>
* ''School'' conjuration (teleportation)
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' you and one creature within range
* ''Duration'' instantaneous
* ''Saving Throw'' Reflex half
* ''Spell Resistance'' no
</div>
You instantly transfer yourself from your current location to a spot within range that’s occupied by another creature, otherwise functioning as per //[[dimension door]]//. You take 1d6 bludgeoning damage, and the other creature takes 3d6 bludgeoning damage (Reflex half). Attempt a [[bull rush]] combat maneuver against the other creature, using your caster level + your key ability score modifier + 2 as your attack bonus. Compare the result to the target’s KAC + 8, as normal. For every 5 feet the creature travels this way, it takes an additional 1d6 bludgeoning damage. If your bull rush combat maneuver fails, you immediately move to the nearest available space; this movement doesn’t provoke an attack of opportunity.
This fusion infuses the disruption of kishalee weapons into the weapon's output. Half of the weapon's damage type is replaced with sonic damage, and it gains the [[stagger]] critical hit effect. You can activate or deactivate the //dimensional disruption// fusion as a swift action. If the weapon already deals two types of damage, replace one of them with sonic (you decide which damage type is replaced each time you activate the //dimensional disruption// fusion). If the weapon already has a critical effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the stagger effect, though you can apply the staggered effect only if the target takes sonic damage from this fusion. This fusion can never cause a weapon that normally targets KAC to target EAC.
Dimensional disruption weapons were available in various forms and strengths, but those left within the Gate of Twelve Suns are pistols (small arms), rifles (longarms), and a few [[grenades|disruption grenade]]. A dimensional disruption weapon creates a streamlike gravitational wave function that disrupts subatomic fields in an effect similar to a sonic attack, but it can [[stagger]] a target rather than deafen it, as the wave function momentarily disrupts the fabric of space around the target.
Disruption pistols and rifles expend twice the usage and have half the range when used on any plane other than the Material Plane. If used in the Drift, they deal damage to the user rather than the target on any attack roll of a natural 1.
As a move action, you teleport up to 10 feet, extracting yourself from any impediments. If you are [[entangled]], [[grappled]], or [[pinned]], these conditions end. If you are [[prone]] and would move to a solid surface, you are now standing. If you are [[off-kilter]] due to being in zero gravity, you right yourself. You must have line of sight to your destination. This movement doesn't provoke attacks of opportunity. After you use this ability, you can't use it again for 1d6 rounds. You must know the [[flash teleport]] paradigm shift to learn this paradigm shift.
These [[manacles]] are crafted from a special hardened ceramic etched with mystic symbols. They are opened with a security code. A creature restrained by //dimensional fetters// that attempts to use a teleportation effect or spell fails unless it succeeds at a DC 30 Will saving throw.
<div class="table-wrapper">
|Item | Level | Price | Bulk |h
|//dimensional fetters// | 8 | 9,200 | 1 |
</div>
This augmentation grafts into your pituitary gland or other organs responsible for regulating growth, forcing your body to conform to smaller or larger versions of yourself from parallel realities. Once per day as a full action, you can activate the augmentation to either grow one size category larger (maximum Large) or shrink to one size category smaller (minimum Tiny) than your natural size. If you grow, your weight increases by a factor of 8, you gain a +1 enhancement bonus to Strength ability checks and skill checks, and your reach increases by 5 feet if your new size is Small or Large. If you shrink, your weight decreases by a factor of 8, you gain a +1 enhancement bonus to Dexterity ability checks and skill checks, and your reach decreases by 5 feet if your new size is Tiny (minimum 0-foot reach) or Medium (minimum 5-foot reach). If you attempt to grow to a size that your current space can't accommodate, the transformation fails. Your equipment resizes to remain functional, and your other statistics are unchanged. Any equipment that leaves your possession for more than 1 minute reverts to its normal size over the following round.
An //experimental dimensional gland// can sustain this transformation for a number of minutes equal to your Constitution modifier (minimum 1 minute). An //immersive dimensional gland// can sustain the transformation for a number of hours equal to 1 + your Constitution modifier (minimum 1 hour), and you can spend 1 Resolve Point as a full action to increase the duration by an additional number of hours equal to your Constitution modifier. Once the duration expires, or once you dismiss the effect as a full action, you revert to your original size.
<div class= "table-wrapper">
|Augmentation | Level | Price | System |h
|//dimensional gland, experimental// | 5 | 3,100 | endocrine |
|//dimensional gland, immersive// | 13 | 50,000 | endocrine |
</div>
As a reaction when you would take damage from an ongoing condition (such as [[bleeding]] or [[burning]]), you can heal your recurring wounds by replacing them with already-sealed wounds. This ends the triggering condition before you take damage from it this turn. At 11th level, if you have a temporary [[blinded]] or [[deafened]] condition with a duration of less than 1 minute, you can spend 1 Resolve Point to end one or both of these conditions as well when using this ability.
Suspected to have been left behind by an ancient alien civilization that abandoned its home planet sometime during the Gap, a //dimensional modulator// looks like an asymmetrical computer with a display depicting several vertical columns of glowing digital runes that continuously morph and shift. The display is attached seamlessly to a cylindrical clockwork engine the approximate size and weight of a fire extinguisher, containing myriad ancient-looking cogs and gears incongruously integrated with more modern parts. A series of tuning forks of varying lengths, which protrude from the top of the apparatus, move when a large mechanical crank affixed to one side is operated. Three times per day as a standard action, you can aim the device at a single creature within 30 feet and turn the crank clockwise five full turns; this requires the use of two hands. This causes the //dimensional modulator's// engine to generate bright flashes of energy, the symbols on its display to change rapidly, and the tuning forks to spin, rise, and fall, emanating an eerie tone. The target must then succeed at a DC 22 Fortitude save or be immediately transformed into a two-dimensional creature for 1d4 rounds. If the target succeeds at the saving throw, there is a 50% chance that you are affected by the //dimensional modulator// instead. You must attempt the same saving throw, but if you fail, you are transformed for 1d6 rounds instead.
Any creature that becomes two-dimensional in this way is perfectly flat and thin as paper, as if the creature is an animated painting or living shadow. Any equipment a two-dimensional
creature is holding at the time of transformation transforms with the creature. Such a creature can only move and take the combat banter action to speak. They can pass through other creatures' spaces without provoking attacks of opportunity and can move along ceilings, floors, walls, and other flat surfaces as if affected by //[[spider climb]]// (though they need not have any limbs free to do so) at double their normal land speed. A two-dimensional creature can attempt [[Perception]] and [[Stealth]] checks, gaining a +10 circumstance bonus to Stealth checks if they move along a wall covered in paintings, graffiti, or other images. A two-dimensional creature can still be the target of attacks, spells, and special abilities, but they gain a +8 circumstance bonus to Armor Class, a +4 circumstance bonus to all saving throws, and [[DR]] 20/magic. If a creature dies while two-dimensional, their image is etched permanently onto the flat surface where they perished.
Some believe the aliens who created the //dimensional modulators// are still alive today, having transformed themselves into creatures perceived in more dimensions than most denizens of the Pact Worlds can comprehend.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//dimensional modulator// | 14 | 56,000 | 2 |
</div>
<div class="statblock">
* ''CR'' 8; ''XP'' 4,800
* CE Medium outsider (chaotic, evil, extraplanar)
* ''Init'' +3; ''Senses'' [[darkvision]] 60 ft.; ''Perception'' +16
!!! DEFENSE
* ''HP'' 125
* ''EAC'' 20; ''KAC'' 22
* ''Fort'' +11; ''Ref'' +9; ''Will'' +9
* ''Defensive Abilities'' resist conjuration; ''DR'' 5/lawful
!!! OFFENSE
* ''Speed'' 30 ft.
* ''Melee'' claw +20 (3d4+13 S plus [[grab]])
* ''Spell-Like Abilities'' (CL 8th)
** 1/day—//[[displacement]]//
** 3/day—//[[dimensional anchor]]//, //[[plane shift]]//
** At will—//[[dimension door]]//
!!! STATISTICS
* ''Str'' +5; ''Dex'' +3; ''Con'' +5; ''Int'' –2; ''Wis'' +2; ''Cha'' +0
* ''Skills'' [[Mysticism]] +16, [[Sense Motive]] +16, [[Stealth]] +16
* ''Languages'' Aklo
* ''Other Abilities'' dimension mastery, planar mastery
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' solitary, pair, or gang (3–8)
!!! SPECIAL ABILITIES
''Dimension Mastery ([[Ex]])'' After being affected by //[[dimension door]]//, a dimensional shambler can take actions normally. In addition, the shambler can attempt a [[Mysticism]] check to ignore effects that prevent planar travel (DC = 10 + the level or CR of the effect or its creator, whichever is higher). If successful, the shambler ignores the effect for 1 round.
''Planar Mastery ([[Ex]])'' When a dimensional shambler uses //[[plane shift]]//, it does so as a full action during which it shimmers and fades to transparency. The shambler can arrive in a specific location if it succeeds at a DC 20 [[Mysticism]] check. In addition, a dimensional shambler can take one unwilling creature with it when it uses //plane shift//, provided the
shambler has the target [[grappled]] or [[pinned]]. The creature can negate the //plane shift// effect on itself with a successful DC 16 Will save.
''Resist Conjuration ([[Ex]])'' Dimensional shamblers are immune to effects that have the calling or summoning descriptors. A shambler can sense when it has been targeted by such an effect and use //[[plane shift]]// to travel to the location of the effect's creator.
</div>
Dimensional shamblers are lean, humanoid-shaped beings that move as if intoxicated. They are relentless planar explorers. Violence and abduction define their interactions with other creatures.
As a standard action, you can attempt to hack an active spell effect that you're aware of to reduce its duration. You must be able to touch the area, creature, or object affected by the spell that you want to hack. As part of the hack, attempt a [[Mysticism]] check with a DC equal to 15 + 1-1/2 × the caster level of the spell. If you succeed, you reduce the spell's duration by 50%. If this reduces its duration to less time than the effect has already been active, the spell ends as if dispelled. If you fail the check by 5 or more, you can't attempt to hack that spell again for 24 hours. This ability does not affect spells with an instantaneous or permanent duration.
When a //diminisher grenade// explodes, it twists space-time enough to accelerate the duration of magic and other effects in the blast radius. Any existing effect that has a duration measured in rounds has its remaining duration reduced by 2d4 rounds. If this reduction drops the remaining duration to 0 or less, the effect ends.
A //diminisher grenade// affects only items and spells of the indicated level or lower or, for other effects, only those created by creatures with a CR or level equal to or lower than that listed.
* ''Mk 1:'' Item level or CR 3; spell level 1st
* ''Mk 2:'' Item level or CR 6; spell level 2nd
* ''Mk 3:'' Item level or CR 9; spell level 3rd
* ''Mk 4:'' Item level or CR 12; spell level 4th
* ''Mk 5:'' Item level or CR 15; spell level 5th
* ''Mk 6:'' Item level or CR 18; spell level 6th
<div class="table-wrapper">
|Weapon | Level | Price | Range | Capacity | Bulk |Special |h
|//diminisher grenade//, mk 1 | 3 | 270 | 20 ft. | drawn | L |[[explode]] (10 ft.; see text) |
|//diminisher grenade//, mk 2 | 6 | 675 | 20 ft. | drawn | L |[[explode]] (15 ft.; see text) |
|//diminisher grenade//, mk 3 | 9 | 2,100 | 20 ft. | drawn | L |[[explode]] (20 ft.; see text) |
|//diminisher grenade//, mk 4 | 12 | 5,700 | 20 ft. | drawn | L |[[explode]] (20 ft.; see text) |
|//diminisher grenade//, mk 5 | 15 | 17,000 | 20 ft. | drawn | L |[[explode]] (20 ft.; see text) |
|//diminisher grenade//, mk 6 | 18 | 51,000 | 20 ft. | drawn | L |[[explode]] (20 ft.; see text) |
</div>
The //dimming// weapon fusion douses any technological lights carried by the targets of its attacks. On a hit with a //dimming// weapon, any technological light sources that the target is carrying or wearing, such as [[portable lights]], cease to function until the end of your next turn. This doesn't affect any other functions of these light sources other than their light-producing capability.
The term "dinosaur" refers to a category of reptilelike fauna associated with a planet's prehistoric evolutionary scale. Dinosaurs vary in size, although many are quite large, and they come in a variety of forms. A ceratopsid is a quadruped that has bony frills extending from its head back over its shoulders, as well as horns that adorn its face; one example is the herbivorous triceratops. Dromaeosaurids are bipedal, feathered carnivores, like the pack-hunting deinonychus (also called a raptor). Plesiosaurs are marine reptiles with long necks and toothy mouths that dwell and hunt near the water's surface. Pterosaurs are flying reptilian beasts with membranous wings and long, sharp, triangular beaks. Sauropods are immense, lumbering quadrupeds with long necks and tails and towering stature, such as brachiosaurus and diplodocus. Theropods are bipedal dinosaurs, generally carnivorous, with fearsome, fanged jaws and clawed digits, like the tyrannosaurus. Thyreophorans are quadrupedal dinosaurs with armor-plated backs and tails weaponized with bludgeoning bone or piercing spikes, including the ankylosaurus and the stegosaurus.
<$list filter="[tag<currentTiddler>]">
<$macrocall $name="collapse" tiddler={{!!title}}/>
</$list>
!! Creating Dinosaurs
The dinosaurs in this entry serve a couple of purposes. Employ them as written when you need statistics for this sort of creature. To create a unique dinosaur, use the stat blocks here and your concept as starting points. Decide what type of natural weapon the animal has, altering the damage type to suit the weapon. Then add elements from [[Environmental Grafts]]. Tailor anything you want to fit your concept.
<div class="statblock">
* ''Level'' 11; ''Price'' 65,000
* Colossal land vehicle (160 ft. wide, 1,200 ft. long, 40 ft. high)
* ''Speed'' 70 ft., full 550 ft., 65 mph (fly)
* ''EAC'' 23; ''KAC'' 24; ''Cover'' total cover
* ''HP'' 180 (90); ''Hardness'' 5
* ''Attack (Collision)'' 13d10 B (DC 12)
* ''Modifiers'' –5 [[Piloting]], –1 attack (–3 at full speed)
* ''Systems'' autopilot ([[Piloting]] +17), enhanced sensors ([[sense through]] [vision; clouds only] 100 ft.), expansion bay
* ''Passengers'' 50
</div>
These cargo haulers are used predominantly on planets with ultra-dense, carbon dioxide-rich atmospheres. Dense atmospheres allow the wingships to carry heavy loads as basic ground-effect vehicles, providing significant cost savings over orbital launch or true anti-grav propulsion. They're often hardened against the toxic atmospheres of the planets they operate on and can carry several hundred tons of cargo at speed.
You can persuade others to be friendly toward you, resolve conflicts and differences, and learn common knowledge and rumors floating around a settlement.
<$list filter="[tag<currentTiddler>tag[Tasks]]">
<$macrocall $name="collapse" tiddler={{!!title}}/>
</$list>
You’re an expert negotiator who can slyly maneuver in social circles as readily as you maneuver across a battlefield.
* ''Associated Skills:'' [[Culture]] and [[Diplomacy]]. You can attempt a Diplomacy check with a +5 bonus to make a [[trick attack]] against a foe by calming or tricking them into thinking you’re not a threat. Each time you use Diplomacy to make a trick attack, this bonus decreases by 1d4 (minimum +0) until the end of the encounter.
* ''Specialization Exploit:'' [[infectious charm]]
* ''Influencer ([[Ex]])'': At 11th level, when you exceed the DC of a [[Diplomacy]] check to [[improve the attitude|Change Attitude (diplomacy)]] of a creature by 5 or more, you can improve their attitude by one additional step.
You have been trained to make peace and strive for amicable solutions in the most tension-filled situations. You could be a benevolent consul, seeking the best for all parties, or a political bully, forcing others into line. It's possible you serve as an agent of a nation, religion, or species. No matter how you use your influence, you spend much of your time negotiating with potentially unfriendly people when only your words stand between you and violence. That doesn't mean you don't carry a gun, but it does mean you generally try talking first.
!! Theme Knowledge (1st)
Thanks to your training to read body language and vocal inflections, it is difficult to lie to you. You believe a truthful statement contains deceptions or that a lie is a truthful state only when you fail a [[Sense Motive]] check to [[detect a deception|Detect Deception]] by 10 or more. [[Diplomacy]] is a class skill for you, though if it is a class skill from the class you take at 1st level, you instead gain a +1 bonus to Diplomacy checks. In addition, you gain an ability adjustment of +1 to Charisma at character creation.
!! Friends in High Places (6th)
Your connections with important people can open doors that would otherwise be closed. You can spend time negotiating with the proper authorities to gain access to people or places that might normally be barred to you, such as contacting a law officer to get access to a crime scene or calling an important politician to arrange a meeting. The GM determines how much time is required to gain such access, but doing so takes at least 1d4 hours. Gaining access requires a successful [[Diplomacy]] check (DC = 10 + the CR or level of the individual sought; the GM can increase the DC by 5 or more if access would normally be restricted). This ability doesn't alter the attitude of any person you might gain access to by using it.
!! Diplomatic Immunity (12th)
You are a famous diplomat, so people who should recognize you by name and appearance do so with a successful DC 10 [[Culture]] check (DC 15 to recognize you only on sight). Reduce by 5 the DC of Diplomacy checks to talk your way out of trouble for any indiscretions you commit. In addition, few people wish to face the consequences of killing famous diplomats. Sapient enemies who know who you are attempt to subdue you rather than kill you, unless you give them a plausible self-defense stance by taking actions that threaten their lives. All aspects of this ability function at the GM's discretion. Egregious illegal activity is still likely to land you in deep trouble, and enemies who care little for legal or social repercussions might try to kill you despite your reputation.
!! Job Satisfaction (18th)
In a galaxy where violence all too often seems inevitable, seeing your words make an impact can reinforce your commitment to peace. Up to twice per day, after you successfully improve a creature's attitude toward you by at least one step, you regain 1 Resolve Point.
You quickly understand individuals whom you engage in conversation, and you can encourage rumor and gossip.
''Prerequisites:'' [[Diplomacy]] 1 rank
''Benefit:'' When you’re in a social setting—such as a banquet, party, or rave—and attempt to use [[Diplomacy]] to [[gather information]] on a specific individual who’s present, you can perform the gather information task in 10 minutes instead of requiring 1d4 hours.
You manage to pull through one last time, even when you have nothing left to give.
''Prerequisites:'' Con 15.
''Benefit:'' Once per day, when you are reduced to 0 Hit Points and have no Resolve Points remaining, you immediately stabilize.
When you cast a polymorph spell on a target with the shapechanger subtype and that target attempts to end your polymorph effect using its [[change shape]] ability, that foe must attempt a Will save. If the foe fails its Will save, it fails to transform into the form allowed by its change shape ability and can't attempt to do so again for the rest of your polymorph spell's duration.
Some technology and spells allow you to redirect an effect to new targets or areas. Redirecting requires a move action unless the technology or spell states otherwise.
<div class="statblock">
* <<levels>>
* ''School'' enchantment (mind-affecting)
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' up to one creature/level, no two of which can be more than 30 ft. apart
* ''Duration'' 1 round/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' yes
</div>
You flood targets' minds with a magical effect similar to a computer virus that duplicates every sensation of lifting, carrying, and being burdened. Targets become [[encumbered]], or they become [[overburdened]] if already encumbered.
Directive 9 agents fulfill a variety of roles in their organization and the communities they infiltrate, from assassins and bruisers to diplomats and hackers. Despite these differences, certain characteristics connect agents’ expertise, most notably their ability to use specialized gear, escape sticky situations, and think on their feet.
The Directive-9 field agent archetype grants alternate class features at 2nd, 4th, 6th, 9th, and 12th levels.
!! Sly Agent (2nd)
You’re a master of observation while avoiding being observed yourself. [[Perception]] and [[Stealth]] are class skills for you. For each of these skills that’s already a class skill for you (or becomes a class skill) from a source other than this archetype, you gain the ability to roll that skill twice and use the better result once per day.
!! Skirt Blindsense (4th)
Directive 9 trains its agents early in how to avoid detection by creatures with exceptional senses. If a creature with [[blindsense]] attempts a [[Perception]] check to notice you when you’re hiding using [[Stealth]], the perceiving creature becomes aware of your location only if its check exceeds your Stealth check by 5. The same applies to creatures with [[blindsight]], except that they merely become aware of your location (rather than observing you) unless their Perception check exceeds your Stealth check by 5. This ability applies against creatures with blindsense, or blindsight via scent, sound, or vibration. At 11th level, this ability applies against creatures with blindsense, or blindsight via emotion, life, or thought. This ability skirts detection via scent for only 10 minutes, after which creatures with scent can detect and follow your trail.
!! Tricky Target (6th)
Other spies find you particularly difficult to pin down. If a creature you’re observing targets you with a [[trick attack]] or a [[stunt and strike]], you can attempt an [[Acrobatics]] or [[Sense Motive]] check as a reaction. If your result equals or exceeds that of the trick attack or stunt and strike skill check, any extra damage or negative status effects from the trick attack or stunt and strike are negated, although the action still resolves as a regular attack. If your result exceeds the skill check by 5 or more, the creature performing the trick attack or stunt and strike gains the [[off-target]] condition until the end of its next turn.
!! Burrowed Loyalty (9th)
The loyalty of Directive 9 runs deep, and its agents are trained and conditioned to remain loyal even when under intense or supernatural pressure. When under the influence of a mind-affecting effect that commands you to act against the interests of the Veskarium, you can ignore those commands for 1 round. You don’t have to use this ability immediately when targeted by a mind-affecting effect; you can wait until any time during the effect’s duration to use Burrowed Loyalty. This ability recharges when you take 10 minutes to recover Stamina Points, but you can spend 1 Resolve Point to recharge it immediately.
!! Spy Tool (12th)
Whether well prepared or excellent at improvising, you always have the tool you need. You can cobble together a useful spy tool from objects in your environment or on your person. Creating a spy tool takes 10 minutes, and the tool functions like any single basic melee weapon, grenade, small arm, or technological item of light or negligible bulk and an item level no greater than your level – 2. Weapons created using this ability can’t be fitted with weapon accessories or fusion seals, and they don’t come with batteries or ammunition; you must supply such resources separately. The spy tool is unstable, and only you can use it effectively. If anyone else tries to use the spy tool, it collapses harmlessly into junk. Once you use this ability, you must spend 1d4 hours in a typical settlement or 10 minutes at a Directive 9 base of operations replenishing the materials needed to use it again.
Pirates are the most common users of dirge cannons. The potbellied, shoulder-resting weapons cause a brief but intense sound burst at frequencies and pressure sufficient to rupture living cells while leaving inorganic objects unharmed. The result is a weapon that can eliminate a starship's crew without causing any damage to the vessel or its cargo. Those who prefer lighter damage favor harmonic and resonant cannons, leaving anharmonic and parametric models for situations that call for carnage.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|dirge cannon, harmonic | 2 | 900 | 1d8 So | 20 ft. | [[deafen]] | 20 charges | 4 | 3 |[[antibiological]], [[blast]], [[unwieldy]] |
|dirge cannon, resonant | 7 | 4,270 | 2d6 So | 30 ft. | [[deafen]] | 40 charges | 4 | 3 |[[antibiological]], [[blast]], [[unwieldy]] |
|dirge cannon, anharmonic | 13 | 49,900 | 5d6 So | 40 ft. | [[deafen]] | 80 charges | 4 | 3 |[[antibiological]], [[blast]], [[unwieldy]] |
|dirge cannon, parametric | 16 | 172,000 | 7d6 So | 50 ft. | [[deafen]] | 80 charges | 4 | 3 |[[antibiological]], [[blast]], [[unwieldy]] |
</div>
The oscillating sonic waves discharged from a dirge pistol work like those fired from a [[dirge cannon]]. Raiders and hijackers prize these weapons for their effect against living targets, which can leave many valuables unharmed. Harmonic and resonant dirge pistols generate stable oscillations, while the anharmonic, parametric, and radial dirge pistols have concentric generator cylinders to produce dissonant and more harmful output.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|dirge pistol, harmonic | 1 | 440 | 1d3 So | 20 ft. | [[sicken]] | 20 charges | 1 | L |[[antibiological]] |
|dirge pistol, resonant | 6 | 4,950 | 1d8 So | 40 ft. | [[sicken]] | 20 charges | 1 | L |[[antibiological]] |
|dirge pistol, anharmonic | 10 | 20,500 | 3d4 So | 40 ft. | [[sicken]] | 20 charges | 1 | L |[[antibiological]] |
|dirge pistol, parametric | 15 | 133,000 | 6d4 So | 60 ft. | [[sicken]] | 20 charges | 1 | L |[[antibiological]] |
|dirge pistol, radial | 19 | 660,000 | 10d4 So | 60 ft. | [[sicken]] | 20 charges | 1 | L |[[antibiological]] |
</div>
Cosmopolitan Arkanen, prominent among Liavara's many moons, prides itself on being home to one of the most learned and urban populations in the Pact Worlds. Arkanen home to two sapient species with a deeply intertwined history: dirindis and [[sazarons]]. The two species co-govern their world and work on most major enterprises collaboratively. Dirindis provide creativity, optimism, and ideas, while the scholarly sazarons make sure projects stay on schedule and on budget. The two species get along well, complementing each other's strengths and respecting each other's differences.
Dirindis are stout humanoids with three eyes and an affinity for humor and electricity. They greet each other with friendly zaps of electricity and outrageous retellings of recent adventures, and visitors to Arkanen are unlikely to avoid some enthusiastic zapping from the locals.
Dirindi family units are large and complex, with extensive networks of siblings and cousins. Dirindis often adopt friends of other species into this chaos, especially sazarons, gnomes, and humans. Dirindis are born to two biological parents, but most are polyamorous, committing to multiple partners for long-term caring relationships and sharing the raising and education of the young. Although dirindis can be found in every profession, they are drawn to social professions and are often bureaucrats, educators, merchants, and politicians.
Dirindis love to laugh and believe there is no tale that cannot be made better with embellishment. Prone to exaggeration and hyperbole, they use allegories and jokes to approach deeper truths about the conditions and relationships of sapient beings. They're not out to deceive; to a dirindi, jokes aren't funny unless everyone gets to share in them. Dirindis treat con artists and other social predators as outcasts, and Arkanen law punishes such offenders harshly. While dirindis support ideals of honesty and disclosure, they're often hazy with details and don't mind filling knowledge gaps with conjecture. Throughout the Pact Worlds, the phrase "as accurate as a dirindi fact-checker" conjures their trademark lax research and unreliable newscasts. Despite this—or perhaps because of it—dirindi newscasts are among the most popular in the Pact Worlds. What they lack in strict accuracy, they make up for in raw enthusiasm. As they are gifted linguists, dirindis can broadcast in virtually every known language of the Pact Worlds.
Parallel to but separate from the dirindi population on Arkanen is that of the moon Osoro, which dirindis populated before the Gap. Osoro has large predators and toxic-gas seas, but its highly charged atmosphere and frequent lightning storms proved irresistible for the dirindis who settled there. Proud of their pioneer heritage, they often look upon their Arkanen brethren as soft urbanites. Few sazarons travel to Osoro, and the dirindis on this moon have become more serious, self-reliant, and survival oriented. They still tell wildly exaggerated tales of [[irokiroi]] hunts and other adventures, and still celebrate some of the same holy days as their counterparts on Arkanen, but they see themselves as entirely independent.
!! Racial Traits
* ''Ability Adjustments:'' +2 Dex, +2 Cha, –2 Wis
* ''Hit Points:'' 4
* ''Size and Type:'' Dirindi are Medium humanoids with the dirindi subtype.
* ''Convivial:'' Dirindis know a number of bonus languages equal to twice their Intelligence bonus, half of which must be chosen from either the prevalent languages of the Pact Worlds or the racial languages their allies speak. They also gain a +2 racial bonus to [[Diplomacy]] checks.
* ''Dirindi Senses:'' Dirindis have [[blindsight]] (electricity) with a range of 60 feet and [[low-light vision]]. They gain a +2 racial bonus to [[Perception]] checks.
* ''Electrical Affinity:'' Dirindis have [[resistance]] 5 to electricity, and they gain the following spell-like abilities. The caster level for these effects is equal to the dirindi's level.
** 1/day—//[[jolting surge]]//
** At will—//[[energy ray]]// (electricity only)
!! Electrical Affinity Graft
{{Electrical Affinity}}
You make an unorthodox attack to briefly hinder the target. A dirty trick could be throwing sand in the target's eyes, jamming a rock into his actuators, or any other improvised action designed to put your opponent at a disadvantage. Your target is [[blinded]], [[deafened]], [[entangled]], [[off-target]], [[shaken]], or [[sickened]] (your choice) for 1 round, plus 1 additional round for every 5 by which the result of your attack roll exceeds the target's KAC + 8. The target can remove the condition as a move action. A dirty trick is normally a melee attack, but a GM can allow certain actions to count as dirty tricks at range, in which case you take a –2 penalty to your attack roll for every 5 feet between you and the target.
Whenever you attempt a [[Computers]] check as part of your stunt and strike and succeed, you can cause the target to gain one of the following conditions until the start of your next turn instead of the [[flat-footed]] condition: [[blinded]], [[deafened]], [[entangled]], [[off-target]], [[shaken]], or [[sickened]]
(your choice).
You can use Engineering to disable a lock, a trap, or a mechanical or technological device, or to disarm an explosive, as long as the device is unattended and you can access it. The amount of time this takes depends on the complexity of the device but typically requires at least one full action. The DC of the check is determined by the GM and is based on the complexity of the device. For extremely complex devices or systems, the GM might require multiple checks. The GM rolls the Engineering check to disable a device in secret, so you don't necessarily know whether your attempt has succeeded or failed. If you succeed, you disable the device. If you fail the check and discover your error, you can attempt to disable the device again. If you fail the check by 5 or more, something goes wrong. If the device is an explosive or a trap, you trigger it. If you are attempting some sort of sabotage, you think the device is disabled, but it still works normally.
You can also use the disable device task to rig a device to work normally for a while, and then become disabled sometime later. This increases the DC of the check by 5. If you want to leave no trace of your tampering, the DC increases by an additional 5. If you succeed at the check, you can rig the device to become disabled up to 1 round later for each rank of Engineering you have. If you fail the check by 5 or more, your efforts have the same effect as if you were merely attempting to disable the device.
Due to the danger, you cannot take 20 on an Engineering check to disable a device.
The DC for an Engineering check to disable a device is based on the complexity of the device. The following chart provides base DCs by complexity, examples of such devices, and the time it takes to disable such devices. The GM can adjust these DCs and times to reflect other circumstances. Systems with redundancies or similar safety measures could have DCs 1 to 5 higher than those listed.
<div class="table-wrapper">
|Device |Example | Time | DC |h
|Simple device |Jam a door | 1 round | 10 |
|Tricky device |Sabotage a simple propulsion system | 1d4 rounds | 15 |
|Difficult device |Disarm or reset a sentry turret or a similar trap | 2d4 rounds | 20 |
|Complex device |@@.constrained Disarm an explosive or a security system from a control panel or similar device@@ | 2d4 rounds | 25 |
|Equipment |Disable an armor upgrade, powered armor, or a weapon | 2d4 rounds | 15 + 1-1/2 × item's level |
|Simple lock |— | 1 round | 20 |
|Average lock |— | 1 round | 25 |
|Good lock |— | 1 round | 30 |
|Superior lock |— | 1 round | 40 |
</div>
You can use Mysticism to disable a magical trap or other magical item. This functions as the disable device task of the [[Engineering]] skill, and the DC of the check is based on the trap itself. You can't take 20 on a Mysticism check to disable a magic device.
A character with root access to a computer can disable or manipulate a countermeasure or module as a standard action with a DC 10 Computers check. If you have access (but not root access) to a computer, you can attempt a Computers check to activate, add, disable, or manipulate any countermeasure or module. If you want to affect a countermeasure or module that is behind a firewall, you must first [[hack the system|Hack System]] to gain access to it. Activating or disabling a countermeasure or module generally takes a standard action. Adding or removing a module generally takes 1 minute per tier of the computer. All of these tasks have a DC equal to the DC to hack the system. You cannot take 20 on a Computers check to disable or manipulate a module.
You knock an item the target is holding out of the target's hands and onto the ground. If you have a hand free, you can automatically grab the item with your hand before it falls.
When you attempt a disarm combat maneuver while wielding a weapon with the disarm special property, you gain a +2 bonus to your attack roll.
For your [[debilitating trick]], you can attempt to disarm the target. Choose an item the target is holding that would be subject to a standard disarm combat maneuver. The target must succeed at a Reflex save or drop that item. If the target gains a bonus to its KAC against disarm combat maneuvers it adds this bonus to its saving throw, and if it is immune to the disarm combat maneuver it is immune to this operative exploit. Once you have used this ability to attempt to disarm a creature, that creature is immune to your disarming attack for 24 hours.
For your [[debilitating trick]], you can attempt to scare your opponent into dropping whatever they're holding. Attempt an [[Intimidate]] check to [[demoralize]] a target within 30 feet of you. If you succeed, choose an item the target is holding that would be subject to a standard [[disarm|Disarm (combat maneuver)]] combat maneuver. The target must succeed at a Will save or fumble that item. A fumbled item isn't dropped, but the target can't operate the item without spending a move action to restore its grip on the item, and until the target restores its grip, combat maneuvers made to [[disarm|Disarm (combat maneuver)]] the fumbled item gain a +5 bonus. If the target fails its Will save by 5 or more, it instead drops the item as if you had disarmed it.
This ability can instead impede a target using a weapon with the [[integrated]] weapon special property. Failing the Will save by any amount causes the target to believe your attack damaged the integrated weapon in some way, preventing them from using that weapon for 1d6 rounds. As a move action, the target can check the affected weapon to end this effect.
Once you've used this ability against a creature, it becomes immune to your disarming command for 1 hour.
When you score a critical hit with a weapon that has the [[disarm|Disarm (weapon property)]] special property, you can choose to forgo the normal benefits of a critical hit (both the doubled damage and any critical hit effects). If you do, the attack deals normal damage. Roll the attack a second time to perform a disarm combat maneuver against the target.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' up to one creature/level, no two of which can be more than 30 ft. apart
* ''Duration'' concentration, up to 1 round/level
* ''Saving Throw'' Will negates
* ''Spell Resistance'' no
</div>
Each round, you concentrate on one target within range. You know if the target deliberately and knowingly speaks a lie by discerning disturbances in its aura caused by lying. The spell does not reveal the truth or uncover unintentional inaccuracies, and it doesn't necessarily reveal evasions. Each round, you can concentrate on a different target.
If you overhear or otherwise intercept a secret message, you can use Sense Motive to learn the gist of its true meaning. Doing so in combat is part of combat banter. Your Sense Motive check is opposed by a Bluff check attempted by the creature passing the secret message. If you succeed, you learn the information contained in the secret message. If you fail (or if there is no secret message), you don't detect any hidden meaning in the message. If you fail the check by 5 or more, you might infer false information, as determined by the GM. Often, the GM rolls these checks in secret and informs you of the results.
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' one creature or technological object
* ''Duration'' instantaneous
* ''Saving Throw'' Fortitude negates (object)
* ''Spell Resistance'' no
</div>
You can dissipate the charges from one technological object, temporarily depower one electrically powered technological object that does not use charges, or severely hinder a construct with the technological subtype. If the spell targets an object with charges, the object loses all of its remaining charges. If the object is powered by electrical means other than charges, its functions are suppressed for 1d4 rounds. If the spell targets a creature not of the technological subtype, it affects a random charged or electrically powered item in that creature's possession. If the target is a construct with the technological subtype, it is staggered and cannot use any energy-based attacks for 1d4 rounds. A construct with the technological subtype that is affected by this spell can attempt a Fortitude saving throw at the end of each round to shrug off the effect.
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Targets or Area'' one creature or technological object, or a 20-ft.-radius burst
</div>
This spell functions as //[[discharge]]//, except it can discharge multiple technological objects. You can use it in one of two ways: an area discharge or a targeted discharge.
''Area Discharge:'' When used in this way, the spell affects everything within a 20-foot-radius burst. Each creature in the area is affected as though by discharge (affecting only one object in the creature's possession), and each unattended object is similarly affected.
''Targeted Discharge:'' If this spell targets a single creature, it can discharge one randomly determined object from the target's charged or electrically powered possessions for every 4 caster levels you have.
Not all those who study magic do so in order to cast spells—some wish only to defend themselves against them. Operatives with the disciple specialization spend as much time training their minds as they do their bodies, meditating to steel themselves against harmful magical effects. Their familiarity with magical traditions and techniques makes them especially adept at fighting spellcasters. Magical organizations, especially those with precious artifacts in need of protection, often seek out non-spellcasters with mental fortitude to train as disciples, tasking them with guarding their treasures upon the completion of their training.
* ''Associated Skills:'' [[Mysticism]] and [[Perception]]. By peering into the realms of reality that normally remain hidden, you can attempt a Mysticism check with a +4 bonus to make a [[trick attack]]; also, Mysticism is a class skill for you.
* ''Specialization Exploit:'' [[experiential learning]]
* ''Spell Resistance ([[Ex]]):'' At 11th level, you learn methods to defend yourself against a specific individual's magic. You can select a target you have observed for at least 1 round of combat or 5 minutes outside of combat. You gain [[spell resistance]] equal to 11 + your character level against that target for 1 minute. Once you've used this ability, you can't use it again that day, but you can spend 1 Resolve Point to recharge it immediately.
Many kasathas worship the mysterious deity known as the Black Butterfly, a goddess born when an aspect of Desna split off and attained its own divinity, purpose, and adherents. On the world-ship Idari, the Temple of the Black Butterfly trains those of stalwart mind and body to oppose creatures of the void. Many disciples of the Stillness living at the temple take a vow of silence to better commune with their deity, but others choose to renounce worldly pleasures or personal attachments while retaining their use of speech. Soldiers, solarians, and vanguards often join the order, and most live as ascetic warriors protecting their communities while passing techniques down to younger disciples.
This archetype grants optional alternate class features at 2nd, 4th, 9th, and 18th levels. At each of these levels, you can choose the alternate feature or the class feature for your class.
!! Sense Evil (2nd)
Once per day, you can detect the presence of evil creatures within 60 feet of yourself as a standard action. As a full action, you can concentrate on an evil creature you can sense with this ability and designate it as your target. You lower the DCs of checks to [[recall knowledge]] about or to [[track|Follow Tracks]] the target by 5 for 24 hours.
!! Swiftness (4th)
Your land movement speed increases by 5. If you have any other movement speeds, such as fly or climb, those also increase by 5.
!! Silent Prayer (9th)
As a reaction, you can spend 1 Resolve Point to send a silent prayer, regaining a number of Stamina points equal to your character level + your key ability modifier. Once you’ve benefited from your silent prayer, you can’t gain the benefits of this ability again until you take a 10-minute rest to recover Stamina Points. At 12th level, you can spend 1 additional Resolve Point to gain a number of temporary hit points equal to your character level + your key ability modifier in addition to recovering the Stamina Points granted by this ability.
!! Perfect Stillness (18th)
Through years of meditation and mindful practice, you’ve attained perfect stillness. As a full action, you gather your thoughts and still your body, even slowing down your respiration and heart rate to the point of being undetectable; at the same time, you gather shadows around you to cloak your form. You become [[invisible]] for a number of rounds equal to your character level. You aren’t detectable by divination spells or technological surveillance for the duration of this ability. While active, you’re immune to mind-affecting effects, disease, paralysis, poison, sleep, and stun. If you’re already affected by one of these conditions, you immediately reroll your saving throw with a +2 insight bonus.
By aiming carefully, you can cause your sonic weapons to emit a terrible noise on impact, aggravating the senses of creatures that rely heavily on hearing.
''Benefit:'' As a standard action, you can make a single attack with a weapon that deals sonic damage and uses charges; this attack uses three times as many charges from the battery or power cell as normal. In addition to your normal weapon effects and damage, all creatures within 20 feet of the target must attempt a Fortitude save with a DC equal to 10 + 1/2 the weapon’s item level + the ability modifier you applied when making the attack with that weapon. Any creature that fails the save and possesses [[blindsense]] (sound or vibration) or [[blindsight]] (sound or vibration) is unable to use those abilities until the beginning of your next turn.
Your nanites rapidly break down and reform your body, granting you extraordinary flexibility and the ability to melt into an amorphous form.
!! Reactive Spray (1st)
When you take damage from a significant enemy, you can take a reaction to form a temporary [[cloud array]], using your nanocyte level to determine the cloud's size and effects. This cloud lasts until the end of your next turn and doesn't count against the maximum number of arrays that you can maintain simultaneously. If the triggering attack was a critical hit, you can also take a [[guarded step]] immediately after creating the cloud as part of this reaction.
!! Slithering Shape (5th)
By using a [[nanite surge]] as a move action, you can melt your body and equipment into a shapeless pool of your size consisting of nanites. You can remain in this form for 1 minute per nanocyte level or until you revert to your natural form as a move action, though you can extend the duration by an additional 1 minute per nanocyte level by spending an additional nanite surge. While transformed, your speed is 20 feet, you gain [[darkvision]] with a range of 30 feet, you can move through an area as small as one-quarter of your own space without squeezing, and you can squeeze through openings as small as 1 inch wide. You gain a circumstance bonus equal to your Constitution modifier to [[Acrobatics]] checks to escape and to your KAC to resist being [[grappled]] or [[pinned]]. You also gain [[DR]] 5/magic; this doesn't stack with other forms of damage reduction. You're unable to speak, attack, cast spells, use items, or perform tasks that require fine manual dexterity while transformed. This is a [[polymorph|Polymorphing]] effect.
!! Fluid Form (9th)
Your body easily liquefies and bends around devastating attacks. You're immune to the [[wound]] and [[severe wound]] critical hit effects. When you use [[defensive dispersal]], you can also activate your reactive spray ability as part of the same reaction.
!! Nanosmoke (13th)
When you activate your slithering shape ability, you can instead transform into a thick nanite vapor. In addition to the effects of slithering shape, you gain a fly speed of 20 feet with perfect maneuverability, and you can move through openings as small as 1 inch wide without squeezing. While in this form, you can't be [[entangled]], [[flanked]], [[flat-footed]], [[grappled]], [[off-kilter]], [[off-target]], [[pinned]], [[prone]], or [[staggered]], and you're immune to critical hits; you retain any such conditions you have when you use this ability. You take only half damage from any effect that targets only one creature.
!! Swarm Shadow (17th)
Once per day as a standard action, you can disperse your body and equipment into nanites that form a barely perceptible shell around an adjacent ally. You provide your ally the benefits of your [[sheath array]], including those gained from spending [[nanite surges]] or from knacks that affect your sheath array. While in this form, you share your ally's space, automatically move where they move, and have concealment, allowing you to hide in plain sight. You can maintain this passive form for up to 1 hour per nanocyte level, and you can end the effect as a move action to appear in any empty space adjacent to your ally.
You can attempt to conceal the fact you are wearing armor by removing the bulkiest pieces and dressing carefully. Doing so takes 10 minutes of work for light armor and 1d3×10 minutes of work for heavy armor and reduces the Armor Class bonus by 1 for light armor or 3 for heavy armor (to a minimum of +0). You can't conceal power armor in this way. Then, roll a [[Disguise]] check (with a –4 penalty if you are concealing heavy armor). This sets the DC of the [[Perception]] checks of anyone observing you to notice you are wearing armor. If you are physically searched, the searcher gains a +4 bonus to the check. It takes the same amount of time to return your armor to normal.
Ailments find it hard to take hold in your system.
''Prerequisites:'' Con 11.
''Benefit:'' You gain a +2 enhancement bonus to saving throws against disease.
You shake off ailments swiftly.
''Prerequisites:'' Con 17, [[Disease Adaptation]].
''Benefit:'' When you fulfill a disease's cure condition, you move two steps toward healthy instead of one.
<$list filter="[list[$:/StoryList]is[current]]">
Diseases are typically inhaled contagions (though these are usually filtered out by a standard space suit or suit of armor) or injury contagions. If a disease lacks a Cure entry, its progression may be irreversible without powerful magic or technology, but a successful casting of //[[remove affliction]]// usually prevents further deterioration. Physical and mental diseases have separate tracks.
</$list>
<<list-links "[tag[Diseases]!suffix[Track]sort[title]]" class:index>>
<$list filter="[list[$:/StoryList]is[current]]">
<$list filter="[tag[Diseases]suffix[Track]]" >
<$macrocall $name="section" tiddler=<<currentTiddler>> />
</$list>
</$list>
Scoring a critical hit with a weapon with the //disentanglement// fusion alters the target at a subatomic level, causing debilitating and horrific mutations. The weapon gains the [[mutation]] critical hit effect. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the mutation effect.
You are able to change your appearance to blend in and deceive others.
<$list filter="[tag<currentTiddler>tag[Tasks]]">
<$macrocall $name="collapse" tiddler={{!!title}}/>
</$list>
<div class="statblock">
* <<levels>>
* ''School'' illusion
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Duration'' 10 minutes/level (D)
</div>
You make yourself—and any clothing, armor, weapons, and equipment on you—look different. You can seem up to 1 foot shorter or taller, thin, fat, or in between. You can't change your creature type (although you can appear as another subtype). Otherwise, the extent of the apparent change is up to you. You could merely add or obscure a minor feature, or you could look like an entirely different person or gender.
The spell does not provide the abilities or mannerisms of the chosen form nor does it alter the perceived tactile (touch) or audible (sound) properties of you or your equipment.
If you use this spell to create a disguise, you gain a +10 circumstance bonus to the [[Disguise]] check (since it counts as altering your form). A creature that interacts with you directly can attempt a Will saving throw to recognize your appearance as an illusion.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' one creature or object, or up to a 10-ft. cube of nonliving matter
* ''Duration'' instantaneous
* ''Saving Throw'' Fortitude partial (object)
* ''Spell Resistance'' yes
</div>
When you cast this spell, a thin, green ray springs from your pointing finger. You must make a ranged attack against your target's EAC, but you can add your key ability score bonus to this attack instead of your Dexterity modifier if it is higher. If you hit, the target takes 14d20 damage. Any creature reduced to 0 Hit Points by this spell is entirely disintegrated, leaving behind only a trace of fine dust. A disintegrated creature's equipment is unaffected. Only one target is affected per casting of this spell.
When used against an object, the ray simply disintegrates as much as a 10-foot cube of nonliving matter. Thus, the spell disintegrates only part of any very large object or structure targeted. The ray affects even objects constructed entirely of force, but it does not affect other magical effects that are not an object, creature, or force effect.
A creature or object that succeeds at a Fortitude saving throw is partially affected, taking only 4d20 damage. If this damage reduces the creature or object to 0 Hit Points, the target is entirely disintegrated.
This [[adamantine]] ring is 1 foot in diameter and surrounded by coils and circuitry. When activated, the disintegration hoop completely obliterates all matter placed through the center. Creatures that place an appendage into the hoop take 4d20 electricity and fire damage as the appendage is disintegrated, and creatures small enough to fit entirely within the hoop instead take 14d20 electricity and fire damage. In either case, a creature that would be forced through the hoop can attempt a DC 14 Reflex save to avoid passing into the hoop. Appendages destroyed by the disintegration hoop can be restored only with //[[regenerate]]// or a similarly powerful effect; creatures slain by the hoop can be restored only with //[[miracle]]// or //[[wish]]//. Attempts at creating larger disintegration hoops have thus far been disastrous failures, although rumors persist of larger, stable disintegration hoops that use advanced technology.
<div class="table-wrapper">
|Item | Level | Price | Bulk | Capacity | Usage |h
|disintegration hoop | 20 | 750,000 | 1 | 100 | 10/round |
</div>
A disintegration lash is a marvel of bioengineering—a technological living organism that feeds on matter by breaking it down with its own high-energy proton-decoupling field. The result is a black, snakelike lash crackling with red-tinged energy, making this a weapon commonly wielded by those looking to intimidate their foes. Disintegration lashes are designated in the standard method for disintegrator weapons: liquidator, decimator, executioner, and eradicator.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|disintegration lash, liquidator | 3 | 1,450 | 1d6 A | [[corrode]] 1d6 | L |[[living]], [[powered]] (capacity 20, usage 1), [[reach]] |
|disintegration lash, decimator | 8 | 9,800 | 1d10 A | [[corrode]] 1d6 | L |[[living]], [[powered]] (capacity 20, usage 1), [[reach]] |
|disintegration lash, executioner | 16 | 113,000 | 2d20 A | [[corrode]] 2d6 | L |[[living]], [[powered]] (capacity 20, usage 1), [[reach]] |
|disintegration lash, eradicator | 20 | 850,000 | 4d20 A | [[corrode]] 4d6 | L |[[living]], [[powered]] (capacity 20, usage 1), [[reach]] |
</div>
This wide-barreled cannon emits a stream of red-tinged energy that originates from the weapon's heavy proton tank, affecting all enemies in a line. Like most disintegrator weapons, they are available in liquidator, decimator, executioner, and eradicator models.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|disintegrator cannon, liquidator | 6 | 4,800 | 1d20 A | 40 ft. | [[corrode]] 1d6 | 40 charges | 4 | 3 |[[line]], [[unwieldy]] |
|disintegrator cannon, decimator | 11 | 29,500 | 3d10 A | 40 ft. | [[corrode]] 2d6 | 40 charges | 4 | 3 |[[line]], [[unwieldy]] |
|disintegrator cannon, executioner | 16 | 220,000 | 5d10 A | 40 ft. | [[corrode]] 3d6 | 80 charges | 8 | 3 |[[line]], [[unwieldy]] |
|disintegrator cannon, eradicator | 20 | 765,000 | 5d20 A | 40 ft. | [[corrode]] 4d6 | 80 charges | 8 | 3 |[[line]], [[unwieldy]] |
</div>
This hefty pistol has two small internal tanks that generate the energy needed to deliquesce the wielder's targets. Disintegrator pistols come in liquidator, decimator, executioner, and eradicator models.
<div class="table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|disintegrator pistol, liquidator | 6 | 4,500 | 1d10 A | 15 ft. | — | 20 charges | 2 | L |— |
|disintegrator pistol, decimator | 11 | 28,000 | 1d20 A | 20 ft. | — | 20 charges | 2 | L |— |
|disintegrator pistol, executioner | 16 | 200,000 | 2d20 A | 25 ft. | [[corrode]] 1d6 | 40 charges | 4 | L |— |
|disintegrator pistol, eradicator | 20 | 745,000 | 3d20 A | 30 ft. | [[corrode]] 2d6 | 40 charges | 4 | L |— |
</div>
Rather snub nosed compared to other longarms, a disintegrator rifle is heavier than it looks due to the row of round energy-generating compartments atop its frame. These compartments generate enough energy for the weapon to liquefy enemies' bodies. Well-connected customers can purchase liquidator, decimator, executioner, and eradicator disintegrator rifles.
<div class="table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|disintegrator rifle, liquidator | 6 | 4,740 | 1d20 A | 30 ft. | [[corrode]] 1d6 | 40 charges | 4 | 2 |— |
|disintegrator rifle, decimator | 11 | 29,000 | 3d10 A | 30 ft. | [[corrode]] 2d6 | 40 charges | 4 | 2 |— |
|disintegrator rifle, executioner | 16 | 210,000 | 5d10 A | 30 ft. | [[corrode]] 3d6 | 80 charges | 8 | 2 |— |
|disintegrator rifle, eradicator | 20 | 745,000 | 5d20 A | 30 ft. | [[corrode]] 4d6 | 80 charges | 8 | 2 |— |
</div>
The disintegrator submachine gun is a compact, power-hungry firearm designed to reduce anything in its path to sludge. The weapon is especially popular with unscrupulous mercenaries and Devourer cultists, who don't mind (or even celebrate) the collateral damage inflicted.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|disintegrator SMG, liquidator | 3 | 1,490 | 1d4 A | 40 ft. | [[wound]] | 20 charges | 4 | L |[[automatic]] |
|disintegrator SMG, decimator | 9 | 13,700 | 3d4 A | 40 ft. | [[wound]] | 20 charges | 4 | L |[[automatic]] |
|disintegrator SMG, executioner | 15 | 118,000 | 3d8 A | 50 ft. | [[wound]] | 40 charges | 5 | L |[[automatic]] |
|disintegrator SMG, eradicator | 20 | 888,000 | 5d10 A | 60 ft. | [[wound]] | 80 charges | 8 | L |[[automatic]] |
</div>
These powerful weapons are more formally referred to as high-energy proton decouplers, as they produce streams of energized fields that corrode and break down matter much in the way a subatomic acid would. However, since their effects appear to turn metal to slag, plastic to noxious vapor, and flesh to goo, they're commonly known as disintegrators.
Most military units eschew disintegrators due to the weapons' relatively short ranges and high energy consumption. Because they cause horrific pain, however, they are popular among bounty hunters, pirates, and other combatants who seek to intimidate as much as to kill. Devourer cultists in particular revere disintegrators because the weapons slough away their enemies' flesh, as if some unseen force were consuming it.
The most common disintegrator weapons follow a similar model sequence: liquidator, decimator, executioner, and eradicator. A few types of disintegrator weapons employ alternate model sequences.
Dismissing an active spell is a standard action.
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' see text
* ''Duration'' instantaneous
* ''Saving Throw'' Will negates, see text
* ''Spell Resistance'' yes
</div>
The spell instantly forces one or more extraplanar creatures off your current plane, whisking them away instantly—usually to the creature's home plane, but there is a 20% chance of sending the target to a random plane other than its own. You can improve the spell's chance of success by presenting one object or substance that the target fears, hates, or otherwise opposes; you gain a +1 circumstance bonus to your caster level check to overcome the target's [[spell resistance]] (if any), and the save DC of the spell increases by 2. At the GM's discretion, certain rare items might work twice as well, providing a +2 circumstance bonus to the caster level check to overcome spell resistance and increasing the spell's save DC by 4.
''4th:'' When you cast //dismissal// as a 4th-level spell, it affects one extraplanar creature.
''5th:'' When you cast //dismissal// as a 5th-level spell, it affects a number of extraplanar creatures whose total CR can't exceed your level + 2, no two of which can be more than 30 feet apart.
You embody the social entropy that occurs within societal systems when participants within social hierarchies become dissatisfied and rebel against it.
!! Aspect Insight
You gain [[Improved Feint]] as a bonus feat and a +2 insight bonus to [[Diplomacy]] checks. Select one of your class skills; that skill is no longer a class skill for you, but you gain [[Bluff]] as a class skill instead. At 5th level, you gain a +2 bonus when you use Bluff to [[feint]] in combat.
!! Aspect Embodiment
Once per combat, when you hit a target with your [[entropic strike]], and that target is suffering a penalty due to your successful use of [[Bluff]], [[Diplomacy]], or [[Intimidate]] (for example, if you’ve successfully [[feinted]] or [[demoralized]] them), you can gain 1 Entropy Point without taking any additional action.
!! Aspect Catalyst
Each foe within 10 feet must succeed at a Will save or be [[confused]] for 1d4 rounds. While confused, the creature always acts normally and isn’t forced to attack the last creature that attacked it, but it still suffers all the other negative effects of being confused.
''Improved:'' Each foe within 10 feet must succeed at a Will save or be confused for 1d4 rounds.
!! Aspect Finale
As a reaction when you hit a target with your entropic strike, and that target is suffering a penalty due to your successful use of Bluff, Diplomacy, or Intimidate (for example, if you have performed a successful feint or demoralized them), you can spend 1 Entropy Point to deal 1d4 Intelligence and Charisma damage to the target, but this effect can’t lower the target’s Intelligence or Charisma below 1.
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Casting Time'' 1 standard action
* ''Range'' medium (100 ft. + 10 ft./level)
* ''Targets'' one creature, object, spell, or spellcaster
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' no
</div>
You can use //dispel magic// to end one ongoing spell that has been cast on a creature or object, to temporarily suppress the magical abilities of a magic item, or to counter another spellcaster's spell. A dispelled spell ends as if its duration had expired. Some spells, as detailed in their descriptions, can't be defeated by //dispel magic//. //Dispel magic// can dispel (but not counter) spell-like abilities just as it does spells. The effect of a spell with an instantaneous duration can't be dispelled.
You choose to use [[dispel magic]] in one of two ways: as a targeted dispel or as a counter.
''Targeted Dispel:'' One creature, object, or spell is the target of the [[dispel magic]] spell. You can also use a targeted dispel to specifically end one spell affecting the target or one spell affecting an area (such as //[[zone of truth]]//). You must name the specific spell effect to be targeted in this way or otherwise uniquely identify it (such as "that burning wall" or "the spell that's giving him those duplicates"). Attempt a dispel check (1d20 + your caster level) with a DC equal to 11 + the spell's caster level. If you succeed, the spell ends. If you don't specify a spell and there is more than one possible spell on the target, your targeted dispel attempts to dispel a spell at random.
If you target a force, an object, or a creature that is the effect of an ongoing spell (such as //[[unseen servant]]//), you attempt a dispel check to end the spell that conjured the object or creature.
If the object that you target is a magic item, you attempt a dispel check against the item level (DC = 11 + the item level). If you succeed, all the item's magical properties are suppressed for 1d4 rounds, after which the item recovers its magical properties. A suppressed item becomes nonmagical for the duration of the effect. A magic item's nonmagical physical properties are unchanged: a suppressed holy laser pistol is still a laser pistol. Artifacts and deities are unaffected by mortal magic such as this.
You can choose to automatically succeed at your dispel check against any spell you have cast.
''Counter:'' You can use the energy of dispel magic to disrupt the casting of other spells. First, select an opponent and take the ready action to cast //dispel magic// when that target casts a spell. This is considered a purely defensive action. When that readied action is triggered, you cast //dispel magic// and must attempt a dispel check (1d20 + your caster level) to counter the other spellcaster's spell. The DC is equal to 11 + the other spellcaster's caster level. If the check is successful and the target is in range, the spell fails and has no result.
<div class="statblock">
* <<levels>>
* ''School'' abjuration
* ''Targets or Area'' one creature, object, spell, or spellcaster; or a 20-ft.-radius burst
</div>
This spell functions like //[[dispel magic]]//, except it can end more than one spell on a target and it can be used to target multiple creatures. You choose to use //greater dispel magic// in one of three ways: a targeted dispel, an area dispel, or a counter.
''Targeted Dispel:'' This functions as a targeted //dispel magic//, but you can dispel one spell for every 4 caster levels you have, attempting a separate dispel check for each spell. Additionally, //greater dispel magic// has a chance to dispel any curse that //[[remove affliction]]// can remove, even if //dispel magic// can't dispel that effect. The DC of this check is equal to the curse's DC.
''Area Dispel:'' When //greater dispel magic// is used in this way, the spell affects everything within a 20-foot-radius burst. Attempt one dispel check and apply that check to each creature or object in the area, as if it were targeted by //[[dispel magic]]//.
If you don't specify spells and there is more than one possible spell on the target, your targeted dispel attempts to dispel spells at random. Magic items themselves are not affected by an area dispel but additional magical effects on them may be dispelled.
For each ongoing spell effect whose point of origin is within the area of the //greater dispel magic// spell, apply the result of the dispel check to dispel the spell. For each ongoing spell whose area overlaps that of the //greater dispel magic// spell, apply the result of the dispel check to end the effect, but only within the overlapping area.
If an object or a creature that is the effect of an ongoing spell is in the area, apply the result of the dispel check to end the spell that conjured that object or creature (returning it whence it came) in addition to attempting to dispel one spell targeting the creature or object. You can choose to automatically succeed at your dispel check against any spell you have cast.
''Counter:'' This functions as countering with //[[dispel magic]]//, but you receive a +4 bonus to your dispel check to counter the other spellcaster's spell.
A target affected by the dispelling critical hit effect is the subject of a targeted //[[dispel magic]]//, as the spell, using the weapon's item level as the dispel check's caster level.
A weapon with the //dispelling// fusion gathers spare wisps of latent magic during combat, which it can then unleash in a focused effort to dispel magic. The weapon gains [[dispelling|Dispelling (critical)]] as a critical hit effect in combat. This ability manifests only in high-stakes situations, so you must be in combat and facing a significant enemy for it to gain this critical hit effect. If there's any doubt about whether you're in combat or able to access the critical hit effect, the GM decides. If the weapon already has a critical hit effect, when you score a critical hit, you can apply either the weapon's normal critical hit effect or the dispelling effect.
{{Dispelling (critical)}}
Holographic mystic sigils project from your hand when you activate this implant. Your hand must be free to do so. As a reaction, you can gain a +1 insight bonus to your AC against a spell that requires a successful attack roll. Alternatively, as a standard action, you can use //[[dispel magic]]// as a spell-like ability with a caster level equal to your level, but it can't counter spells and it can't target anything other than you unless you touch the target. To affect an unwilling target, you must hit it with a melee attack against its EAC; you activate the augmentation as part of the attack roll, and you can add your key ability score modifier to this attack roll instead of your Strength modifier if it is higher. Once you use //[[dispel magic]]// this way, you can't use your //dispelling hand// for either of its uses until you've rested for 10 minutes to regain Stamina Points, though you can spend 1 Resolve Point at any time to recharge it immediately.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|//dispelling hand// | 9 | 14,300 | hand |
</div>
You can stab, slice, or smash the magic right off of something—or someone.
''Prerequisites:'' Base attack bonus +10, [[Mysticism]] 10 ranks.
''Benefit:'' When you are wielding a magic weapon (normally a weapon with a weapon fusion, but anything that bypasses [[DR]]/magic qualifies), as a standard action you can spend 1 Resolve Point to cast [[dispel magic]] for the targeted dispel function. You can use this only against an adjacent target. Once you have used this ability, you cannot do so again until you regain Stamina Points after a 10-minute rest.
As a standard action, you can taunt an enemy within 60 feet. Attempt an [[Intimidate]] check with the same DC as a check to [[demoralize]] that enemy (though this isn't a check to demoralize, so you can't use abilities that would apply to a demoralization attempt, like the [[rattling presence]] expertise talent). If you fail, that enemy is [[off-target]] until the end of your next turn. If you succeed, that enemy is instead [[shaken]] until the end of your next turn. This is an emotion and fear effect.
At 6th level, you can spend 1 Resolve Point to treat a failed Intimidate check for dispiriting taunt as if it were a success.
This is a language-dependent, mind-affecting, sense-dependent effect.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 round
* ''Range'' touch
* ''Targets'' one object of negligible bulk
* ''Duration'' instantaneous
* ''Saving Throw'' none (object)
* ''Spell Resistance'' no (object)
</div>
You move one of your memories into the target object. You can select up to 5 minutes of continuous memory, or you can select every memory associated with one person, place, or object you name when you cast this spell. If you select continuous memory, you lose those memories, and if you try to recall them, you remember a blank gap instead of any details. If you select a person, place, or object, you remember events related to that thing, but not the presence or details of the thing you named. For example, if after a visit to Castrovel with your sister you use this spell to forget Castrovel, you remember traveling with your sister, but you forget where you went. Alternatively, if you used this spell to forget your sister, you remember going to Castrovel with someone, but not who was with you. Anyone touching the object into which you placed your memories can recall those memories by speaking a command word that you designate at the time of casting.
Alternatively, you can designate no command word so that no one can recall the memories when touching the object. If the object is destroyed, the memories placed within return to you.
<div class="statblock">
* <<levels>>
* ''School'' illusion
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one creature
* ''Duration'' 1 round/level (D)
* ''Saving Throw'' Will negates (harmless)
* ''Spell Resistance'' yes (harmless)
</div>
The target of this spell appears to be about 2 feet away from its true location. The creature benefits from a 50% miss chance as if it had total concealment. Unlike actual total concealment, displacement doesn't prevent enemies from targeting the creature normally. //[[True seeing]]// reveals the target's true location and negates the miss chance. If a creature with [[blindsense]] can also see the displaced creature, the visual and blindsense information combined are enough for the creature with blindsense to attack the displaced creature without a miss chance, unlike normal for blindsense.
This optical device bends light around you. It must be installed in a suit of armor for 24 hours before it functions, and when the upgrade is removed from the armor, no other upgrade can use its vacated slot for 24 hours. You can activate the //displacement field// as a move action to gain the benefits of a //[[displacement]]// spell until you spend another move action to deactivate it or it runs out of charges. A //displacement field's// charges replenish each day.
<div class="table-wrapper">
|Upgrade | Level | Price | Slots | Armor Type | Bulk | Capacity | Usage |h
|//displacement field// | 15 | 120,000 | 2 | any | 1 | 10 | 1/round |
</div>
A disposal blade is made of salvage from a standard garbage disposal mounted on the back of a metal wrist covering. When activated, its many sharp blades spin rapidly to tear flesh. You must be very careful when wielding a disposal blade, and though your hand isn't technically holding the weapon, you can't use that hand for anything else.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Critical | Bulk |Special |h
|disposal blade, tactical | 1 | 300 | 1d6 S | wound | 1 |powered (capacity 20, usage 1) |
|disposal blade, advanced | 6 | 4,250 | 2d6 S | wound | 1 |powered (capacity 20, usage 1) |
|disposable blade, ultrathin | 11 | 25,000 | 4d6 S | wound | 1 |powered (capacity 20, usage 1) |
|disposable blade, zero-edge | 16 | 170,000 | 8d6 S | wound | 1 |powered (capacity 20, usage 1) |
</div>
This augmentation infuses your skin with a host of iridescent nanites that swirl in hypnotic patterns. Internally, some of the nanites cluster around your voice box, slightly modifying your voice to create a kind of rhythmic reverberation. As a standard action, you can activate the nanites. After the first round, you must use a swift action each round to maintain the effect. A creature that can see or hear you when the nanites are activated must succeed at a Will saving throw (DC = 14 + your key ability score modifier) or be [[shaken]] for as long it can see or hear you and you continue the effect. If the creature succeeds at the saving throw, it is immune to the effect of the nanites for 24 hours. You can choose for the nanites to not affect allies. If the creature can both see and hear you, it takes a –2 penalty to the saving throw. This is a mind-affecting, sense-dependent effect. You can use the augmentation for 8 rounds per day, though these rounds need not be consecutive.
<div class="table-wrapper">
|Augmentation | Level | Price | System |h
|disquieting nanites | 8 | 10,000 | skin and throat |
</div>
As a reaction when you or an ally is targeted with an attack originating within 100 feet, you can spend 1 Resolve Point to impose a –2 penalty on the attack roll. If the attack is coming from a creature, that creature can attempt a Will saving throw to negate this effect. Once you've targeted an attacker with this paradigm shift, you can't target the same attacker with this paradigm shift again for 24 hours. At 8th level, the penalty changes to –3, and at 14th level, the penalty changes to –4.
As a standard action, you can expend an unused spell slot to target a creature within 100 feet and swap in alternate physiologies or circuitry in its body in this version of existence, imposing the [[shaken]] condition for a number of rounds equal to the level of the spell slot expended.
As a standard action, you can touch a weapon to temporarily replace it with an incapacitating variant drawn from an alternate reality, causing the weapon to deal nonlethal damage (Will negates).
For your debilitating trick, you can attempt to hinder your opponent's ability to cast spells and spell-like abilities. The target must succeed at a Will save or be unable to cast spells or spell-like abilities for 1 round. Once you've used this ability to attempt to hinder an opponent's spellcasting, that creature is immune to your disrupting shot for 24 hours. You must have the [[deactivating shot]] and [[staggering shot]] exploits to choose this exploit.
Your weapons absorb ambient magic, potentially disrupting spellcasting. When you hit a target with an analog weapon, the target must attempt a Will save whenever they cast a spell before the beginning of your next turn. If they fail the save by 4 or less, the spell is weakened—treat its caster level as 2 lower, reduce any saving throw DC by 2, and the caster takes a –2 penalty to attack rolls with the spell. If they fail the save by 5 or more, the spell fails. Once a creature attempts a save against this gear boost, it’s immune to the ability for 24 hours.
Disruption grenades work in a way similar to the [[rifles and pistols|Dimensional Disruption Weapons]]. Temporal disruption grenades, on the other hand, slow down the rate of subatomic movement, halting those affected by it for a short period of time but not otherwise damaging those within the blast.
The radius of a disruption grenade's explosion is reduced to 10 feet if it used on any plane other than the Material Plane. If used in the Drift, those caught in the blast radius can roll their saving throws twice and take the better result when attempting to halve the amount of damage taken or negate any secondary effects.
<div class="table-wrapper">
|Grenade | Level | Price | Range | Capacity | Bulk |Special |h
|disruption grenade | 8 | 1,600 | 20 ft. | drawn | l |[[explode]] (2d10 So, [[staggered]], 20 ft.) |
|temporal disruption grenade | 10 | 2,900 | 20 ft. | drawn | l |[[explode]] ([[stunned]] 1 round [Fortitude negates], 20 ft.) |
</div>
Disruption pistols expend twice the usage and have half the range when used on any plane other than the Material Plane. If used in the Drift, they deal damage to the user rather than the target on any attack roll of a natural 1.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|disruption pistol, minor | 7 | 7,500 | 2d6 So | 40 ft. | [[stagger]] | 20 charges | 2 | L |[[boost]] 1d6 |
|disruption pistol, major | 12 | 40,000 | 3d6 So | 40 ft. | [[stagger]] | 40 charges | 4 | L |[[boost]] 2d6 |
</div>
Disruption rifles expend twice the usage and have half the range when used on any plane other than the Material Plane. If used in the Drift, they deal damage to the user rather than the target on any attack roll of a natural 1.
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|disruption rifle, minor | 9 | 15,000 | 3d8 So | 50 ft. | [[stagger]] | 40 charges | 5 | 2 |[[boost]] 1d8 |
|disruption rifle, major | 14 | 80,000 | 6d8 So | 40 ft. | [[stagger]] | 40 charges | 5 | 2 |[[boost]] 2d8 |
</div>
The //disruptive// fusion imbues a weapon with powerful positive energy designed to disrupt the magical forces that allow undead to exist. The weapon ignores any [[DR]] and [[energy resistance]] of undead creatures. Only weapons that deal bludgeoning damage can benefit from this fusion.
<div class="statblock">
* ''CR'' 11; ''XP'' 12,800
* CE Large monstrous humanoid
* ''Init'' +3; ''Senses'' [[blindsense]] (vibration) 30 ft., [[darkvision]] 60 ft.; ''Perception'' +20
!!! DEFENSE
* ''HP'' 180
* ''EAC'' 24; ''KAC'' 26
* ''Fort'' +15; ''Ref'' +13; ''Will'' +12
* ''Defensive Abilities'' [[Swarm mind]]; ''Immunities'' acid, fear effects; ''Resistances'' fire 10
!!! OFFENSE
* ''Speed'' 20 ft., climb 10 ft.
* ''Melee'' slam +28 (4d6+19 B; critical [[push]] 10 ft.)
* ''Ranged'' corrosive jet +23 (3d8+11 A & F; critical [[corrode]] 2d4)
* ''Offensive Abilities'' wing gust
* ''Space'' 10 ft.; ''Reach'' 10 ft.
!!! STATISTICS
* ''Str'' +8; ''Dex'' +3; ''Con'' +5; ''Int'' +1; ''Wis'' +0; ''Cha'' –2
* ''Skills'' [[Acrobatics]] +20, [[Athletics]] +25 (+33 to climb)
* ''Languages'' Shirren; [[telepathy]] 100 ft.
!!! ECOLOGY
* ''Environment'' any
* ''Organization'' pair or pack (1–2 plus 3–8 Swarm creatures)
!!! SPECIAL ABILITIES
''Corrosive Jet ([[Ex]])'' The Swarm dissolver can spew a jet of corrosive chemicals with a range of 30 feet. This attack has the [[line]] and [[unwieldy]] weapon special properties.
''Wing Gust ([[Ex]])'' A Swarm dissolver's vestigial wings have surprising power. As a standard action, a Swarm dissolver can beat its wings rapidly to create a powerful gust of wind in a 30-foot cone. All nonmagical flames in the cone are extinguished, and any Medium or smaller creatures in the area must succeed at a DC 18 Reflex save or be pushed 10 feet away from the Swarm dissolver and knocked [[prone]].
</div>
A Swarm dissolver's main focus is to protect smaller Swarm components and provide an impenetrable front line during combat, incinerating the most formidable foes while also accompanying [[corrovoxes]], [[mindreapers]], and other Swarm shock troops when they swoop in to clean up after a battle. A dissolver's exoskeleton is thicker than that of most other Swarm creatures, but its most prominent offensive feature—sturdy horns that curl back toward the dissolver's body— are surprisingly not its primary weapons; these horns instead function as a last-resort defense, allowing a dissolver to fling enemies away with a mighty shove. A dissolver's main mode of attack is actually hidden between its mandibles: two vascular conduits pump highly corrosive and combustible chemicals from within separate glands in the dissolver's abdomen. These chemicals are inert when separate but explode when combined, in a conflagration of acid and fire. Like many other Swarm components, a dissolver bears a set of insectile wings, but they aren't powerful enough for the massive, heavy creature to fly.
Inspired by the horrific spewing capability of its namesake Swarm component, and much like the [[acid cannon]], the dissolver has two biological glands that use power to produce a couple of highly reactive chemicals. These two chemicals are stable when separate. However, as with the corrovox’s weapon, when an electric jolt causes the dissolver to constrict and release these chemicals, they converge just outside the weapon’s maw, creating an acidic flash fire in a broad arc.
<div class= "table-wrapper">
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|dissolver, macrergate | 8 | 10,000 | 2d8 A & F | 40 ft. | [[corrode]] 2d4 | 40 charges | 4 | 2 |[[blast]], [[living]], [[swarm|Swarm (weapon property)]], [[unwieldy]] |
|dissolver, dinergate | 13 | 50,000 | 4d8 A & F | 40 ft. | [[corrode]] 4d4 | 40 charges | 5 | 2 |[[blast]], [[living]], [[swarm|Swarm (weapon property)]], [[unwieldy]] |
|dissolver, ergatoid | 18 | 380,000 | 9d8 A & F | 40 ft. | [[corrode]] 9d4 | 40 charges | 4 | 2 |[[blast]], [[living]], [[swarm|Swarm (weapon property)]], [[unwieldy]] |
</div>
<div class="statblock">
* <<levels>>
* ''School'' evocation (sonic)
* ''Casting Time'' 1 standard action
* ''Range'' touch
* ''Targets'' one creature
* ''Duration'' instantaneous
* ''Saving Throw'' none
* ''Spell Resistance'' yes
</div>
You harness the vibrations in your body and a body you strike. Attempt a melee attack against the target’s EAC. If your attack hits, the target takes 4d4 sonic damage (critical [[deafen]]; DC equals your spell save DC) and can’t take reactions for 1 round. Casting this spell doesn’t provoke attacks of opportunity.
Your solar manifestation is an extension of yourself, and you have learned to center your power outward. Any stellar revelations (including zenith revelations) that have a radius and are centered on you can be centered anywhere within 20 feet of you. While attuned or fully attuned, they can instead be centered anywhere within 40 feet of you.
<div class="statblock">
* <<levels>>
* ''School'' transmutation
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Duration'' 10 minutes/level (D)
</div>
Your speech is audible for up to half a mile outdoors or 1,000 feet indoors. The volume of your voice doesn’t change, so intervening obstacles and louder noises can still drown it out.
When you cast a spell with a range of close, medium, or long, you can spend 1 Resolve Point to double its range. Spells whose ranges are not defined by distance, as well as spells whose ranges are not close, medium, or long, do not benefit from this magic hack. If the spell affects an area, doubling its range doesn't alter the size of its area.
Increase the range increments of your ranged [[adaptive strike]] by 50%. As a swift action, you can spend 1 MP either to increase your ranged adaptive strike’s range increment by 100% (rather than by 50%) or to grant your melee adaptive strike the reach weapon special property; either effect lasts until the start of your next turn.
You exude entropy even as you dream. At the beginning of your turn, you can enter a dreamlike state until the beginning of your next turn. While in this state, you have the [[flat-footed]] and [[off-target]] conditions, and you gain Entropy Points from your entropic pool class feature at an accelerated rate in the following ways. First, each time you take damage equal to or greater than three times your character level from a single attack or effect (after applying any abilities that reduce that damage), you gain 2 Entropy Points from your entropic pool class feature instead of 1. Second, if you take damage from a critical hit, you gain 2 Entropy Points instead of 1, in addition to any you gain from the attack's normal damage. Finally, if you have no Entropy Points when the dreamlike state ends, you can spend 1 Resolve Point to gain 3 Entropy Points.
<div class="statblock">
* <<levels>>
* ''School'' illusion
* ''Casting Time'' 1 standard action
* ''Range'' close (25 ft. + 5 ft./2 levels)
* ''Targets'' one creature
* ''Duration'' instantaneous
* Saving Throw Will negates
* ''Spell Resistance'' no
</div>
You distract a creature with a sudden illusory noise or image. This functions as a [[feint]] action except that you can use your [[Mysticism]] skill in place of [[Bluff]], and you can apply the benefits of the [[Improved Feint]] and [[Greater Feint]] feats if you have them.
If your stunt and strike skill check and attack roll both succeed, your foe is [[off-target]] until the start of your next turn. This is a language-dependent effect.
Your shimmering power draws your enemies' focus to the real threat: you. As a move action, you can focus your attention on a creature within 30 feet of you. The target must attempt a Fortitude save. If it fails, it takes a –2 penalty to attack rolls for attacks that don't include you as a target for 1 round or until you leave photon mode.
You can hack a computer within 30 feet of a foe to distract that foe, such as with a sudden noise or an image. You must be able to access the computer (whether it is your own computer
or you are within range to access one manually or via [[remote hack]]). This functions as a [[feint|Feint (action)]] action except that it uses your [[Computers]] skill instead of [[Bluff]], so you can apply the benefits of [[Improved Feint]] and [[Greater Feint]] if you have them.
The creature can nauseate targets that it damages. A living creature that takes damage from a creature with the distraction ability is [[nauseated]] for 1 round; the target can negate the effect with a successful Fortitude save at the listed DC.
//Format:// ''Offensive Abilities'' distraction (DC 15).
<details>
<summary><h3>__________</h3></summary>
<div class="section">
<div class= "table-wrapper">
You're adept at swooping down on a foe.
''Prerequisites:'' Dex 14, base attack bonus +1.
''Benefit:'' If you start your turn flying, you can take a full action to [[charge]] at an enemy that's at least 10 feet below you. You don't take the –2 penalty to your attack for this charge.
You know how to dive out of the area of an effect.
''Prerequisites:'' Base Reflex save bonus +2.
''Benefit:'' When you attempt a Reflex save against an area attack or area effect, you can fall [[prone]] in an adjacent square and roll that Reflex save twice (taking the better result of the two). If you were in a threatened space, this movement provokes attacks of opportunity normally.
Originally developed alongside [[convergent lasers]], divergent lasers use multiple laser beams emitting from a blocky casing to produce a cone-shaped output. This weapon's damage is significantly less than that achieved by the convergent lasers, but the same systems that synchronize wavelengths in a convergent laser allow the divergent laser to focus on multiple targets. The single-color beam of a single-wave divergent laser sets it apart from the shimmering colors of a multiwave divergent laser. A wide-spectrum divergent laser has a nearly white beam and could be mistaken for a spotlight at a glance—though not by a target struck by one!
<div class="table-wrapper" >
|Weapon | Level | Price | Damage | Range | Critical | Capacity | Usage | Bulk |Special |h
|divergent laser, single-wave | 5 | 3,430 | 1d8 F | 60 ft. | [[burn]] 1d6 | 40 charges | 2 | 2 |[[blast]], [[unwieldy]] |
|divergent laser, multiwave | 12 | 41,200 | 4d8 F | 80 ft. | [[burn]] 2d6 | 40 charges | 2 | 2 |[[blast]], [[unwieldy]] |
|divergent laser, wide-spectrum | 18 | 414,000 | 7d8 F | 90 ft. | [[burn]] 3d6 | 40 charges | 2 | 2 |[[blast]], [[unwieldy]] |
</div>
Your broad experience has made you better at avoiding danger.
''Prerequisites:'' Eternal hope or ecstatic joy racial trait, character level 5th.
''Benefit:'' Choose two effect descriptors. You can spend 1 Resolve Point to reroll a failed saving throw against effects that have either of those descriptors. Once you use this ability, you can do so again only after a 10-minute rest to regain Stamina.
As a move action, you can use Bluff to create a diversion. Your Bluff check is opposed by the [[Sense Motive]] check of the creature you are attempting to beguile. If you succeed, you can either attempt the [[hide]] task of [[Stealth]] as if you had cover or concealment, or you gain a +10 bonus to perform the palm an object task of [[Sleight of Hand]] (your choice). Occasionally, your Bluff check might be opposed by several creatures (for instance, if you are on a crowded space station promenade); in such cases, the GM might decide to roll several Sense Motive checks, and you succeed only against creatures with Sense Motive results lower than your Bluff result.
When you attempt a [[Bluff]] check to perform the [[taunt]] captain action, you can distract the enemy captain rather than impose the taunt's usual penalties. If you succeed, the enemy captain loses their crew action for the round. If your result exceeds the Bluff check's DC by 5 or more, you also impose the taunt action's standard penalty on that starship, though this penalty lasts for only 1 round.
You can divert auxiliary power into one of your starship's systems, giving it a boost. This requires a successful Engineering check (DC = 10 + 1-1/2 times your starship's tier), and the results depend on where you decide to send this extra power. If you send it to the engines, your starship's speed increases by 2 this round. If you send it to the science equipment, all science officers receive a +2 bonus to their crew actions this round. If you send it to the starship's weapons, treat each damage die that rolls a 1 this round as having rolled a 2 instead. If you send it to the shields, restore an amount of Shield Points equal to 5% of the PCU rating of the starship's power core, up to the shields' maximum value. You can distribute the restored Shield Points across the shields' four quadrants as you see fit.
''Critical:'' For a crucial moment, you far surpass the power core's potential output. The results of a critical divert action depend on where you decided to send the extra power.
* //Engines:// You also divert power to the maneuvering thrusters, lowering the turn value of your starship by 1 this round.
* //Science Equipment:// You're able to divert power in an efficient and balanced way. Science officers can roll their checks twice this round and use the better result.
* //Shields:// You're able to efficiently route energy to the shields, doubling the number of Shield Points restored to 10% of the PCU rating of the starship's power core. If this would restore the shields over their maximum value, these excess Shield Points remain until the beginning of the next engineering phase, at which point any excess Shield Points are lost.
* //Starship Weapons:// The augmented weapons run at maximum safe power. For your starship's weapons, treat each damage die roll that results in a 1 this round as having rolled the die's maximum result instead.
You can keep your exocortex uploaded to a number of computers equal to half your Intelligence bonus (minimum 2) while using your [[terminal uplink]] mechanic trick. If your exocortex is uploaded to only one computer, you can monitor that computer's surroundings without preventing you from using your exocortex's memory module. Your uploaded exocortex is protected by a [[firewall]] countermeasure. You must have the [[terminal uplink]] exocortex ability to select this mechanic trick.
Divination spells enable you to learn long-forgotten secrets, predict the future, find hidden things, and pierce deceptive spells. In most circumstances, attempts to use divination magic to glean information about events during the Gap fail.
<div class="statblock">
* <<levels>>
* ''School'' divination
* ''Casting Time'' 10 minutes
* ''Range'' personal
* ''Duration'' instantaneous
</div>
Similar to //[[augury]]// but more powerful, a //divination// spell can provide you with a useful piece of advice in reply to a question concerning a specific goal, event, or activity that is to occur within 1 week. Casting this spell requires you to expend 1 Resolve Point. The advice granted by the spell can be as simple as a short phrase, or it might take the form of a cryptic rhyme or omen. If you don't act on the information, the conditions may change so that the information is no longer useful. The chance for a correct divination is 75%. If the die roll fails, you know the spell failed, unless specific magic yielding false information is at work.
As with //augury//, multiple castings of //divination// about the same topic by the same caster use the same die result as the first divination spell and yield the same answer each time.
You can use a //divination mirror// to display the results of [[divination]] spells that provide you with information or images, allowing others to see or otherwise experience this information as you do in real time. You must be within 30 feet of the mirror to use its capabilities. You can transmit to the mirror anything sensed by a magical sensor you create, such as with //[[arcane eye]]// or //[[clairaudience/clairvoyance]]//. The mirror can transmit sound, so you can cause it to reproduce what you hear from spells such as //[[augury]]//, //[[commune with nature]]//, //[[contact other plane]]//, //[[detect thoughts]]//, and [[divination|Divination (spell)]]. The mirror can display the aura of someone you subject to //[[discern lies]]//, as well as impressions and images you receive from spells such as //[[retrocognition]]// and //[[vision]]//. You can allow the mirror to transmit telepathic messages you receive so others present can hear that content. Divination spells that only change the nature of information you send and receive—such as //[[comprehend languages]]//, //[[tongues]]//, and //[[true seeing]]//—can't be used through the mirror.
<div class= "table-wrapper">
|Item | Level | Price | Bulk |h
|//divination mirror// | 8 | 8,500 | 2 |
</div>
<div class="statblock">
* <<levels>>
* ''School'' enchantment
* ''Casting Time'' 1 standard action
* ''Range'' personal
* ''Duration'' 1 round/level
</div>
You take on a terrifying aura that evokes a specific god, an aspect of divinity, a mystic concept, or another mighty force. For the duration, you are immune to fear effects, and you gain [[frightful presence]] as a supernatural ability with a range of 30 feet and a Will save DC equal to the spell's DC.
You gain power from the deity you faithfully worship.
''Prerequisites:'' Worship a deity of an alignment within one step of your own alignment.
''Benefit:'' Your benefit is determined by the deity you worship.
<div class="simple">
<details>
<summary>//Abadar//</summary>
When you make an attack as a standard action against a chaotic fey or chaotic outsider, your attack ignores any one form of [[DR]], [[resistance]], or [[immunity]] to damage the target has (your choice).
</details>
<details>
<summary>//Besmara//</summary> You can attempt a disarm combat maneuver against an opponent to remove any item of 1 bulk or less that the target could draw as a move or swift action.
</details>
<details>
<summary>//Damoritosh//</summary>
When you score a critical hit with a [[doshko]] that doesn't have the [[wound]] or [[severe wound]] critical hit effect, you can replace any critical hit effect it normally has with the wound critical hit effect. If you score a critical hit with a doshko that normally has the wound or severe wound critical hit effect, you also apply the [[knockdown]] critical hit effect to the target.
</details>
<details>
<summary>//Desna//</summary>
Your deity sometimes grants you bursts of luck. Once per day, you can reroll any one failed skill check.
</details>
<details>
<summary>//The Devourer//</summary>
If you are knocked [[unconscious]] or killed by a creature that is a legal target for a weapon you are wielding, as a reaction you can make a single attack against the creature. You can make this single attack despite being unconscious or dead.
</details>
<details>
<summary>//Eloritu//</summary>
Once per day you can cast //[[identify]]// as a spell-like ability, attempting a caster level check (use your character level as your caster level: 1d20 + your character level), in place of the normal [[Engineering]] or [[Mysticism]] check (though you still receive //identify's// +10 bonus).
</details>
<details>
<summary>//Hylax//</summary>
You gain [[limited telepathy]], as per the shirren racial ability. If you already have limited telepathy, you gain the ability to treat any creature that has a friendly or helpful attitude toward you as if it shared a language with you when determining whether you can use limited telepathy to communicate with it.
</details>
<details>
<summary>//Ibra//</summary>
When you attempt a skill check to recall knowledge about a very difficult question, you receive a +2 divine bonus to your check.
</details>
<details>
<summary>//Iomedae//</summary>
When you make an attack as a standard action against an evil dragon or evil outsider, your attack ignores any one form of [[DR]], [[resistance]], or [[immunity]] to damage the target has (your choice).
</details>
<details>
<summary>//Lao Shu Po//</summary>
When you attack a [[flat-footed]] target in the surprise round of combat, if your attack hits, it deals 1d6 additional damage of the same type as its normal damage to a single target affected by the attack.
</details>
<details>
<summary>//Nyarlathotep//</summary>
Once per day when an attack, effect, or spell imposes a condition on you, as a reaction you can delay that condition so it takes effect on you 1 round later. The condition then lasts 1d4 rounds longer than it would have if you had not delayed it.
</details>
<details>
<summary>//Oras//</summary>
Select three feats that you do not have but whose prerequisites you meet. Once per day as a move action, you can gain the benefit of one of these feats for 1 minute. Each time you gain a level, you can replace one of these three selected feats with a different feat that you don't have but whose prerequisites you meet.
</details>
<details>
<summary>//Pharasma//</summary>
When you make an attack as a standard action against an undead creature, your attack ignores any one form of [[DR]], [[resistance]], or [[immunity]] to damage the target has (your choice).
</details>
<details>
<summary>//Sarenrae//</summary>
The first time you deal fire damage each round, you can convert half the fire damage into holy energy damage. Fire [[resistance]] or [[immunity]] does not apply to the holy energy portion of the damage.
</details>
<details>
<summary>//Talavet//</summary>
As a move action, you can grant yourself a bonus as if an ally had succeeded at an aid another check or successfully used covering fire against a foe of your choice. This doesn't stack with any use of those options. Once you have used this ability, you can't use it again until you spend 1 Resolve Point during a 10-minute rest to regain Stamina Points.
</details>
<details>
<summary>//Triune//</summary>
You can use a computer without having a user interface or [[hacking kit]] simply by touching it. You must still succeed at a [[Computers]] check to hack it if you do not have authorized access. Additionally, you have [[limited telepathy]] that functions only with constructs with the technological subtype.
</details>
<details>
<summary>//Urgathoa//</summary>
Once per day as a swift action, you can force a creature of your choice within 60 feet that is subject to a disease to immediately attempt a save against that disease as if enough time had passed to fulfill its frequency. The subject suffers the normal consequences of a failed save against the disease, but a successful save does not count toward a number of successful saves needed to end the disease.
</details>
<details>
<summary>//Weydan//</summary>
Whenever you first arrive on a new planet, you can select an appearance for yourself when you are on that planet. This becomes your natural appearance when on that planet (though you can use [[Disguise]] to alter this new appearance normally). This new appearance must be of the same type and subtype as your race, but you can change any other details. Anyone attempting to recognize you based on some other appearance must succeed at a [[Perception]] check with a DC equal to 20 + 1-1/2 × your character level.
</details>
<details>
<summary>//Yaraesa//</summary>
You can roll a skill check to recall knowledge twice and take the better of the two results. Once you have used this ability, you can't use it again until you spend 1 Resolve Point during a 10-minute rest to regain Stamina Points.
</details>
<details>
<summary>//Zon-Kuthon//</summary>
When you cast a spell or make an attack that deals damage, you can grant that spell or attack the pain descriptor. When you damage a creature with a pain effect, as a reaction, you can cause it to become [[flat-footed]] for 1 round. Once you use this ability, you can't use it again until you spend 1 Resolve Point during a 10-minute rest to regain Stamina Points.
</details>
</div>
''Special:'' If you change which deity you worship, this feat gives you no benefit until you next gain a character level. You then receive the benefit appropriate for the deity you now worship, if your alignment is within one step of that deity's.