<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
Encrypted(DADE408D4762472229A714D95373C6E3FFD682A7)
396452bd42c8d7ba11c240302003c7213921d4c7e4a87ba6195964d61ba3472130
217ced91b6db5f66ed584f818d90f1402302f1213333213d0efab0e7a5a183c7
f7cbd9e983d9e7d196b28f85e7de309763d88a053d9b7574f92eceaf61412b74
2b9a19e9af3239c5a1b58c02c7d4e868a769f2caf8724a5576f64b73a1f0918e
ed8784c4b93857fcf19d5a767edf842ed4ce46e89d553f4221313221cd4de39c
e4541216c7b5c1c20ecf4d1225b3ec046f6a25118cf60847013fb64b29414bea
b1d9f55ba183bb51eae4e140ed4950ed10b844edfd330318ce8edc2b70f1871e
1d991c5b7a18eab0942d1f368cc5d468add4da07ad2a1837357f5c2131322197
7b415fd286213021c698c8c12da4ad79213136302114ff892133332163065535
6f2ef6a98a56b99cbe4f0f213334215b29633697ef072d64daf73d76f20796e9
c78b78944021313021fd34b8dbd2b9563e818e5ab7f3454dc536ca93901969fa
6e7302dd4c04bd825204e54a54359196fc9e3bbdb0c3ec3c614b07695331e9bd
24e61421333421cfacc7d20ffc1d3ab0e3bccdd38f57806eaebcd1a821313121
986b1c62232c9c9e6f640f64287d7a2f37cdf4f059fce7b902b9a51c875003af
efb0047783a72df1b64d5ba3c321313021d9edb2557ffd235290a88532e4a295
778ee36421333321689321313021419a44cc64fb7138252c92afe4a8491f42c3
85977ff23d6c413659dca1be392f7628f67e339cea5bf52131312131ef471621
333921334846261ccd21313021e1bd7f21313121a72a5dc7c924beff21313121
1408587e21313021614d18d0fce718779aa276d067486d481f329594f454b702
c13ef69266afbba9156f2d71a4c9f317ccba23415621392156f133e42ff92a43
24b4259244b4c921333321202b52eb51a23eff984b8a02bc24b23b5579f67926
0826702131312132d5bbb1f71c2c858b9feb3f9e4168837d78302131312119ee
1d6be4dd7a2f1f1b4e2a3cb06dfbc8fc1f1390402dea94aa7eba5f5b4eed4701
d935f228f0a5187b2133332121313630214c185d8021313221c72e21333421de
26e63c6dae0fcee44846538185d5c4ff6a1f198ba33a8afb06dac8ea2c31afbc
9e9ead57d71a3612c54878599e8a053f94747dede76214bb8dfec492e6e50519
de8221333921e3aa646b6312bfb2b27c1cc069d6c9bb19a656083a497026d31c
7b64cf772b3421333321d0e8bc501438288831ca73a72cd6552b91455ec12133
34215fae3b16748ddf46d36990ba25bb638c44213339217ac1edad663883f98e
79def73cbf8713a14648c4b191eff38706378b727dbb235601e1dfe1afa84da9
626c248e9e4a704c5aba87a4e588b6e25d185b65ea0fbbc4cb92a274751b198e
4acbf321313321bbf89dca7cfe13f158c9ce02674f75f69b4b5446255bd415ca
63d06d07c923e552addd34a404401413d1066bcb3736a5213132219b18cb77a8
2131302117b3faa525c172358c8ea1ce3c69c1213130211424a4a26e61d92131
322166ffec660114e6ca86dd4c796d21333321433e54
Encrypted(66FE162AB5D6AA3BCFA163E0528F77FAC5C3B445)
57833ec74d1fdf6b9ef68cbab9c1714fc1ff0567b9f57a304f36a3ffca85922f33
65e1cfc99ab33bd820ac624db375d62fbaa54df24fdbcc2603bad9ba2d9b7daf
f568f5c2252c03854e72c1cae11d21333921976f8bab1fd72139218f16213333
2174df0e7f54c3a2547e14a2512131332173911968e5657d39f99f21313321d9
2130211ac5a9fc687ce6cca4b808b3a9401b75cde12c11185cba2edbac5c082e
41e49d300f0eaf903075c8522f507dc9dd7561cabe5ee392167c8fc7d8c7fd9e
3a03de887f06758a1b669b12a45dcde714c5a5bad1cfd23d3ac629e1ff66fd3e
21333421e4fa6eea9f0e8760168edc0f191d6874374a6f072996c068ecf1fbd0
a15df75fb8747d9afb6c513a1121313630217969ba012e75f07db6c86c2cdd76
cfba8614b089d6aa378eef50213136302145e004fb55e03c031993888dc3b436
c639213136302121313321a2efcbfe74903310c001c39e8be173bd85bad4b436
c02139218bb521313221e5213021a7e1bb4db677aee1d22d5af65e2cb42f3324
4254ed5d213334218c4e4e4359df8d2dc88d40768cc0e355fb256d7b21333921
dd1e075a50a5a1dfb360c6213334216d538d5d2131302130c92a9e9e6508a340
ef1171b626213136302141601918e0f8561fa933f58d517ab09b058314e665b7
9e45e97baa16cd7e1a37d1caca3eb47a3bbb7d7f840f0e3261f34795a8f49aea
d68a515e99e0c80899eba8ef16841138848ac6b93c4a778edc7266ffc0cd3951
a14e869e4ebb2b5159bd9b5b537a8ac420f5d0aa934d8e7913c76fe8e63d7f84
b7ddb7ea139a1f9a3d7cffa5be2a2e31263d6f4058771587386f21333421da21
3339213318af5b20d779f35a47d0d00487303cc859e821313021b6f86eca8cf5
ee3b21313221dbfd511c6239213333212131322120fd10bd417724cc3167cb46
a48411eb3995d584a98f68ccf8f8b40288859c99877955e54f3d565c3c516d20
a1efdb79e8b021313221ed1839f62528a2f69cb90ec53f6d9bfa82872130215d
787f288fcb35b41541d9e8f650ce2d034e9f614636f9aa1969d55159533061f1
239d78fe2e6ad4d53731edcfa84fedd3d253015cc921333421e8e0ceaf6382c1
cffafe075476ef9cf64162fd3b322a7db86fec1a688e73a9cd694454a4168d81
f923613f5a213339210fb7e9b51521333321e91a7cdc374f93b0387207213333
21b5ccb2bc8e3adae783f021333321805344c48e043696fa6d2133392112b36d
28709e213130216c3d180feb64963ec7e7879b0839b4971438af8a71eaeb3760
01c546598c0e3cce08ca6ee2bb064affacb226a6e323ba21333321de71da17b4
df2133392111762863a85e2cfd505120551b7be9f01dcdf8405a93f1573c7bd2
be599ed116bcdbfe9318b89f43d20360563fc0cbdef1
>Does the formula imply a given clause?
>Is the formula satisfiable?
>Are two formula's logically equivalent?
>Is the formula implied by a given term?
>How many satisfying assignments are there?
>What are the satisfying assignments of the formula?
>Does one formula imply the other?
>Does the formula evaluate to //True// under all variable assignments? (ie. tautology)
Encrypted(776C7B1AD8677BB74A03CA62F7A241C8BDEB148A)
45b97d08a6074a8796ee2f476cf4c5b1970ff97d9db62b87aa4b2133332152dd6c
a12bb88579362882feb6eb435586cc444d8975535fbb7ec8eae0513355213131
21e9c7440fda1334d98023ec58cd7017671a62a63db9fad23021333421bffd17
a2f43d7e94f2a3b632ef7ec82131302150293a975a70cd70512c54abc9213021
cc864f4dacb91673313acb529106142d4eaac05e98afedb42f599aad7eda9f21
313121e8f7b2157934794937416a6e42c8a36b5773f87f9911154a7aff883b06
83d333a81d90884744e998796eb73c21333921c804e8926b5bc9b402dc2e5129
5cf145edce213021499ebdf848bb8b9621333421315c402130218147dd031a7f
b3de213133215ecb4b6f213921f3dae0c696d8be901ec1a852ae6bb0a4023675
ddb24c4f2e15433e7d0f5d2131363021d9429e4fef7ec4f5134486b292bddafd
cde2f416e51dca58213130211d91e7c37a80bca86de88fb16bb5341da8586194
19aaf4c4d17191e90fe32131363021842c304013f6932421333421eb8e75ab63
494a47fbf023b2b235282de4371fb403be1d5bdf80adfe282429fb5a498140ea
c7f4102139212b5fb6d66f080387c785a6823b213339219b213921d9a36a16eb
8b5054bd6c52903902a66ff6da1c539199f19d347eb36097bc53dc2f91ae2131
33217ed78ae5e446bbe6646e984a2a69b3f8213021f88151b138e053ccf9ec19
e136ec5ecfc06ff49149712983ac15b940d342041a0715d4af02844e60eaad24
5b671f365723cd61c615c580e85d505ef4c8e821313121294749dee27eece959
dd1a3ed4bd559230c3372131322129670473022a23be7d90722621313121e851
a6429e4585bbbcd05da20f31ef434288447f87bb58ce0667e421333321df2a3c
4c49ebd33be3bc5e7fcc7b23baa76ee95d46a7ad6f642139214684d2b873f621
31332103c3d5f095c658fe0121313021c6c5a976c699033fac97293324bcd112
2fe4be8e047c85be45e634f5acc0e44c3501a376c446bec6e1b48cd54053afaf
d836d7cff81bad772eff6a8a692d213132212f725557d56739213921fbb003fb
8654adf429cf92343d213021ebe5886621333321cecbf4dff7c092cf94d28c60
7782acd8fce02fa6984187047be0dc31d4213130214416b248ed33a150c7e680
59bbae64b07cc912839664cc7fece95dac6074aaadfe014658fd5991cf447898
10a75f21333421295e6674cc9aef785e06c5deaf2131302194f0f4f2848605b5
bf74a6dc9038ed88158b806d9c89bc44334d98c1781f944463c0682133392115
94fd40fd9cc977ec7b789b3588213333218b377f6710f321302103b624ee8bfa
d36512f9c8d080c329a283dc9f6db0578669eda5a2eeff48ffea2bc0bfd3cf08
2131312135fdd13e792801
Encrypted(5908DED5BBB670DC96F129E606C17C935B83C730)
18821eb1de7061595e2e0671cf8e2a7b43b458cb39605e64896eb56e8035927135
aa6874e8d9ce0edf12b4125670a2a9405eda9a1d33ca5e04ee3f6bcf3c7766cf
d32d7545641e88a2af6eb87fcd81a8e6d57da7d252a4193e127aabceacac505d
f0ad3f48e9a69a5141f321392163836c08394397d9f3c804b77b80f87ea1cfa6
56024c4134cb7413513a21313321ed3c1621313121ef35fc344e6968583357f7
91c61033bcc47456923fd6ad2cd62faf3b8c8981dd52ef53a63f86aa791f783d
78410350f151392133342155369eb52e23dc244f3179cfc07f1997cba3184712
2d7acc40c7c81b213131216ee9cabd16f5406f6f66c78ba6ef2f4548e55db421
3021d70e9f2db1ead8714dd25dad072ef61e148b4d03e832c016685d3b71134d
53cd68e63e4ce807ac67d0d06f9b751eed0718a8ff233bee6f9fb42ac9371eee
cd70735e2dcf745a379ed37bcdf77e459b2131332129ec5ba7d8a2f82d213921
f43e3edf5b3ab84379ca189bac491535f321333421a14eecb3debeefb3cf4844
baba47ce2133342121313630215777caa9ffa3d3e57ddd64900656a82b7e1c03
29aa3bd207e13d213339211fafc2aa73ca97d91ecfc49ee0c77e65e13804fc21
33392136b5f160e721333921ee8de51a3621313021870f2449b01f3421333421
fec6213136302185e6d86d28b67860a2e1fe78ae213921797694f596fbe7ff84
2130215f2f6f66b2f9c53b7a203793426337bbcb33684375eaa4fbf96dff70e1
04e93021313021e4b34b7e72fdc9c3f6be3ab83683e5a5ea02c45f4c60213130
21067465c52131363021ad0228653c1c4f6c5e7c2a5d0fa6b9e6fe493087bfcd
f450cfcbcb2131363021d98b1ea94f72a40453c3e2bee91e76d342da35b66f12
9fb41c1b5925d82042f732d5c920705cd2e311dc35335acc608e5c94867eb7d3
94c09da39c77715fbe64ce607e5c8d1ce530be8c76e83823b208898b4878b3ed
57462fdc737721313021ecc9f7b8f53bd3fbff291a1004df6637da57e548564e
79cf384619072494213921068adfc15efe3ea4a821313321df829105b72ae724
ab8228d2f120deeaa9872b961afc87
Encrypted(55AF5AE03DDC4701178AF0B0E7ACC13A6498A4B3)
c4e450a6f3fcd821333921abf5bb21313021658dfc13a815b39a736a3a5d39e253
9601fa213339216462b44718464f4a1af92d98e2efe576b77b1a213131215878
7e4c39
Encrypted(54AAE5221FA4EE63418FEFB1DE721718C3B4E188)
c99fdb2d54b2ac2c487526329dc1d0169740d3f095fd559b306cf221333921b08b
e42d182130216923b74677f7c594515a9645dddd
Encrypted(998A724ACDB540D622C82B18FCD9199A2B2CCC4C)
e5a44315c8707028dec32dd884981c2484485e9ab54c5df9ac85cacf9f6774c297
383b91159b41f340b1cda88d5db8d877853096686b055f0188981df82d751472
85078c1952a64fff6d667194c48ece9241213130214976b3287c506b0465571e
5d39a5474d88507e6031efdb15c62131332171590593f0b09aa21f867dca4bb1
3f7a2c1b9156bf183d521e9bfa86537b30bd712aa74fbf8a01cd1e21313021aa
213333219313e577e518a2c3a62890d9be03cad1972a21302159622a83f7e3e6
199a665836a8213136302199776e687197b42f91ccc2e85ba96e38bb35c4a8fb
35849de85161265974374ad53aba4e4fa64c30266de23319b52133392166b792
d4c1a38d0f558f2338bad40313ef2d029e332c41c5ba4383462ae104dd4f10c9
b7aaa1dcf6ab2133332199f804e5e253581273a369e9068dca5f9d4c2130212b
e48795fd3ca129073e78d6e663a6772ea373b48b53a170db4bd9e4bd12b48ebc
3a87f7699e5f8e10d6a40e638ba36254c725f3b9c6b2622131363021b9655ca2
4a7a105d51e862cc568a2b61952dfad686d5ed9975470f6364e11062adc530ca
d3fbb2d0f475e537d9a1049870fbb7478e0552d760aed4d2113c3404745ba92a
67135ff5437a21313321e218f14148304c4fac543ea3f5e28d4ab1db752bafcd
16dbd2a8b929ec2395f5628117813cba2541abebefebbead9d31cfdcafa8231c
213333217f347e01374da207712131312133a5f52598776ec7d2f5311577495c
283cfcbbe6249712be2e41f2484468fe413a8ae2304c6546677db87921333321
87f63f70d80eeb335bb85e99a2231dcc47e495ad1e85f0213921fc6a6d90d5f9
21313221e4ada2213334213bac21313630212fd515841e2133392141e09d431f
a95fb7213021b44bccdeda5d5807eeac6d8f464a90d8d2cdc01e71f735e7b782
633f771d544541bd9775e9c7eeba9775cf66f7b417986321313121d2f8b6edd2
a1f92e98f92e2d46e44e2b138df641f9a7767abdb2d4d94a812bfb5538d301f3
46e401bc04db14474c2983c4d0591888eb5021313321624f21333321a207b14c
52aa655de21b21392147c6d254384064295f5b8e1d3b3221313221d84472ae6b
4b8c70d31b922131363021a7a221313121eb8263f0d465acffeb06e76bdb95e7
662b7a323938ee816021333321a62131363021503e1eec8087df5a2133332156
f29dc3a8f22130216ca23951db617b724a54b52671803b9b697c4c6fd79eed40
692db960588a640856d2b276e3019b4bc6f7b121333321cc7e81554d1757186b
a18f4f37dbd92133392113c0b1264ff54a0f6f16328fc621333321a35e9df2e3
e54003e9896586b4b018a49a978f71b84afcdc93c1db2aaae3afd82131312111
9d512de1332464b03504f8aeabbab8a38d316aee3b905c9180a19a26fc2b7895
b15f24230568d2511d65a18133e66f8db0ecc7e479f5d9a9c19c2bb212712c38
419e5e762e49e114297d0768545a646d1ff9a8775af2839c65e4ea6d21333921
957ade0e3ffe73eac2b7e9ba8344c044d77a33e8aff7a6898cbdf72bb36f38f8
80c3cde231fa1c17ac82485a49992659c8c42dca8dd42b5a78ac21302198f858
42ba83306a88e45eac1e0ec3c82ac695b2ffb48d2302c8c0bdd6f8c14ffefe5f
e1e24c3b0e8a452131363021202cf9bebcec9cd7e02133332194213021d58ba6
bee0b4c2c60e830221392184b3a2a3169757db8230fa84ae7812d45e13102131
363021936f2130214c136e87dcf7ae14e107aee630a908f21a39fee9ba351c3c
ef9e14d1507f7bcf24776e5d8c066ae74c45e0f597213921b17eb5213339218f
508932f61ef8bac0be4605365d7f7c36995e7e437dd77d49242b3f29ea213334
2113bd6730708d76f7d9c4a821313630217f16cb6dd5931563e4b45c1dded3f4
684cd36677889b9a38692131363021c5f385dbb14564c6d89eb3456afe015165
417dc868dcc85d62b6551169df0e34dd5eda38deb1457003663c79ac0464fe1a
3bc6aa47acae3cfcc021313021cacb8c847a08147d57e4d774bdb6918af3cb18
0efa5536bbeeafa8d592c193aa57f6b586cb5e30435548dc5f05e8964cde36e4
6dfa1aebaf21313630210277b35669dbdec6e1fdedf3512133332117c8213133
213cf945e1dddceab2f7dab7b38c8fc713cb5563cd21333421b21550f0e7a718
a464a3505141339f7cf745566dfaa69a681788b3df527090aad4daca36209806
5630c121313321eb910fc1c8be035de0fe047515d538e958cb7fcafea2ee19ba
243619c744f2d29cb3213136302167f0d1b7213921c06fa18923e66f21313221
cf4b54ccc177ab2aef8cd8758ccb5912ac4e6adac046fc8b4c21333921651997
ef84a77b9102c5f6f5cd28058642376e4e3dd324da92ab35a62ae634f4ff9475
21313321c312dfc0cbc57c81332e44d92c4aab4c4b35fa36e4b5213133217e19
b43c43b1f8213334212131363021992133392134c1132e8ac92d049e91931ffc
ae9b1621313121385c6e24cc6bf905032f8685062139217921313121defe6e24
3f4e2ac35dd21ced3e9b58bf2131363021866821392181f42c2131363021cc96
3865b5ba8e7391b61e01213132212c2626f2e886a6b1f34cb5fb450ef516df59
ba063f2d4c78258e47e6166a892f69391c213339217b3c3bba440110a9f6fd21
333321e81d213339213bf13335fa2af9be384af09bc119db66877e18e34c970e
5f82d079022e7655707721313221e91884e77e3042fd75fd6d5d04b85a296d3d
8d054916eee32f8b6523540fc6332130214c4de56428d8b1ff073e7a9dd3874a
013df39c9d1728028ba9d621333321fa6ec0db98b31f5b31020f8cfce973eeb9
21313221265d3a317c3ea7be2f7b5c213921b50221313121fc201d4acac4c2bf
3021333921bb342ada4bfb6105356716a32131363021ed055f483dd7a8db5ed6
1c248221302150c7e4d9471ea8ba7bb91901789cdf806a7190736f8d7c593dbb
d24f6c244c39e7aad98f4a2130217d587361985ab82ee345e4bb5d9c2c76b45e
82796803af21333321eaefc0413796b0bf7c4be4b2889391e37b122131363021
9b204695e7a45759f7780316fb544d2139214e67a6ff21333421a7bae7d38bf4
2edc239cebb8fe768edb74e94bbd84e8e310a7213334219bc282a9c189b57752
d89531f9205d88893b323f7c2e21313221213133210f3295239a4a3a4304aa5d
a507c015a7c585bac96a2d79ae6121313021ca403f605ef05bc63cdb5e4ead3c
41c939d6c666d403f34fc61aa12131322106e44103f8bb8d7f62cfb7ce3f9651
f1b653f0a84ebafe3a3c32894f02213131218cc9a5e821333321768a736c12c6
73afa161b5829a9a97e821313221ade75288e6a56bd8074012889ba7f5f6bc90
fbecf0eea162655df81c135c213132214cf185b8310821313221c0a76e135985
ebaff398dbe065d2c8a8da2133342135592aea7be1b0c36176f8cbd81546a53a
71ee5c49feace226c040f8db31f7a468d7c432cca62d464b13866296567a9cfb
c1345d84e73e213136302154b8d12d92c63f3481ad7277189959bd75f3e95930
c65a4b21313121f45849c9d74325b485841921313121ffd1a74b7fab7545d307
213130215f642c756fc40846f3bb23557d60e4a7bde82fae830e45bb5292875b
18f0fee0a3e1bbb1798f529b339eb811d8ab21333921da21333921213333215a
166849ca2ecc8566d034b87811d9b53195c7d9f5c85b2958eaacbe6ae829945a
a7e5e01d4316d4434562ac79101e03287de09191fbdb8f42b1556f9816457c7a
be394d21313021986621392144ff8d1dafd3afafedb482c4f5d0598598fc2a50
5fed2131312155e5213021695b5c7a2649d6c875e45a3dc5beb29a16187e90b8
a8b2e8daec02b02d319ade0ed073f06ad6c28eb949010417786cb94702e72897
164557d2ce21313221f78ad253e6d030a451b7d7eb1b2130216f2c0e4331af9c
9a5745e2f2a98f1483eee1ff50f0ea39f4ac7234f69ad5a533480f6de338edfa
7468ca87213921f66b4ab28c35646159df8df6ca92be7a82a19501e2ac72dc76
2febee5608a3025263d8fb269ec7336ef3457493506cef0737e6f2df2b1d10fb
1af2f78f03466a14d599948f8729ef026f29502133392190b35e213132214d7b
a551a6b59efe2131363021e7c7f7321fda88bf1b21333921865ff53c5a8c8cea
077ad03236ad770159a41aac1e65376229e8b33af4adcf6a74c2e6df21333421
8d1a6311ed7b21313021213334219089d277b54d721767dc8c9f66d11b2b8a21
313321075980e4fce4b44b1f2131312148cedd708f3495b166b93952cd3a5efe
17c4a12f24fd8268a4c01d5196eafe7789685bc6cca1c2f967562097bf9d77a8
01b47979518f9579d21dcdac33a674b861fd5f1d95591fc76db2cdf7ab7b2131
3121a94cef599067e57325a84c34d7c4593511dfd8b9b1efd9498bb07ead701e
b2f3831d1d66265c408f9e90786516ad21313121a3edce7ecee99df8213021d0
5d854503d6c53838986c213334212ea34a2131312196b1e98f7454d924181bee
fa213130219e50ca2d354b448db8e0492cd4e3c7a73ca4ad02b8196a11a67723
4c550f4edb53eb4d19e682076ce1b5633e80213339219d6bf89995c8ab8e4133
5ea8c5d2d94def72f70539d163392e918c93d06d3a20f8ef2139215f6c262133
392174243932608cdda4d2ad8f50cf125f1042f93fcc9ff9ad11b616ff242ec9
4f95fe1ec7c93e899c83b187f2da8b8ece9d5f89cdc19ea2968a89ce23aad06a
d7e7b688478a0f104003893e21313121e3b6610443972921333921693fc5628b
ebe555a7fc761296730ee42c213133219a772139216ac9c32131302121313021
c4e22d77e660de4fc41c206b17662501b1ae2007eeffae16efb16cfa258a9a20
622d4f61838a1641f3cf38ba59a1801dedb9efc3d0ec0ffb2d50bdd71657043a
7f3462706f34fe8c45f6259693936839d4e948898263691a9ae07a4ba1888c9f
b1de4c80d26b646bf0984d638c114b5ac22f282e8e21313221c205589383ef61
5d92129ebdfd96e6b167433846947258e84dfabf9541a1c7bc9665c67325b37c
432139218fe9576540fe394df929f465553d5d21313121409829c965eb61dccd
dcd9c54b9cb38dbe44154a7474fd867c59f636766c45f98d419562c2ff46e121
3130219abb213021784835d78ef4f5876f5b213130213152207c127deb013f98
213339214f62472131312195e0e3213131210fd3ab1e67ac653ca4caca1d174e
bd131e1f913020ba4c5d16dc62f8876bdc19c5e6cf05c1ff5d2131312168d154
3299508e8b7c4b80b703be7136a4c4535645ee61213133217ab4526929213334
2187b80e5a80917f94ed82213133219514fb7d9014e12fc841a95c88bdd48dfd
4505c0cd67d12aa6c4bc45a5dd6f78e13ea5d17162918b9701cb7078bfd82cf2
75213339215c4dfa21333421c38ab26d8d475acd7ec05d983b26994e4ad64a16
fcf43d446521333321e095452682315477e499c0ed36ce993eeb7fb1eb23b164
c7df04fef57eae1fa685299845310fbe1831199a2bb5fec36645985b4e382133
332123826e80ebb7dd9f2131363021567b465e6bdecefe016947e750bb64126b
3bc6e77569335a2dd9fb751162be642139214eb72d62872dafdd2eb0df2fee30
643fc3264da18d26114774eed4844a717573a94e31e8891af2972b592b329d60
673e599028036adb9177511de4b090e53ab6b1e329ec726d07e1e53dbfa71278
65af9d352f7afbb167056b213921019e52e94713b94ac68d21313321aea803f3
753c21313121ed23fab08608a8e37e25f88b3e7f4e2139217e1869e41f44439d
6ebd8e4ee9011fc49c17f1e37708f4fbc7017d0f2a2b2131302175135c423dfa
598fe1d3be7c36efaf8e1e99f4c880eaaaedd6cfaee4f8467d694abd23e387d8
9d82cd03202c2cf96eb0cbb9213133215619bb05f75b52213131219741d9b367
0effc75e775b2d05d1864421313021752131332146283a76c33e1f94827fc8bd
543b209990c7024e29e0fe2413d47ecee39fdee243fe2f9ab496a68133f47b
Encrypted(F8DE50750E50605E3E39B0A628A57FCE25E4BF68)
25f5ede818088f88dc93f5236d1b8921313630215f182b923eed213021ddb45e31
c78bd4e06b18af65931e360e6794371a6ae6d738e38925dfd0e02130216e9d62
9aa12318266430ad3aa6d224a235b4842397b189213921de213130217be58992
24c9f25e65702ec6187db81afc34780115bb37d0e170493630235c85dc03aa6f
3238af46c988cfd41e213136302101c814637ffcbb96419080d4d4b9f5448112
76a28f506fb51f306d36b1361e64629c2e248332a6aa637ff4b59759eadfc385
3b6ab9233ad95d3121313630217035b0661c2133342133e479c3e30252868921
3130213c291cdf0708c9ca21313221b3c21d1e56fb572e6f36fc65348e3f84d6
34dd76de9764ba2d499d4afcda16f69e54a8c0153ad080dd304377af3e213133
2183a221333321cd46155a332131363021258e95b65e5b9dc6f60f21313221c9
45bc4dd4d93e67ec08e08420f9375783af89b1f6a4156a9158143de0ad1524ff
ec26172021313021f405ff7b39c24ecd14c9531b72c1e1cf62f749b3e8f345c4
1fd1fc6e10ceba4ed1a2839e9593eff911d8782be8baccbcf9213921e4a5c87a
24fa21313021f5db3f21313221d5f5a57ce34f33d3f0b92139216d9215d6c494
751e8a6e301221333321cff0c83246f6114ca4745454295e2e01c97ee9769191
cab2f218658a578881ca544cb784d695aafe938cf67dd2d89063956f352b3743
f4282131363021976348cebe5e7cef4154aef33666c16279460f64d8c16e3b7a
2ecada10da1ec62133392182b1d91c324a5bacbd3dac55be5b2341fea12c7873
606a4195afe2b798c4c92131322188ab1f9514788ee1da7b516e6753d370aa36
2f9474d379a6f6462f458488bd2a2350ff167b65b7e5d9d5e9265f266b7a8ef7
7ccc7177857a2c21313221603c64d926e69155dc12109e90d2850496f0f9e045
ed787a14a9248bc16382fd59be9d5c4cf31e456a8d170640c2398885a183b893
b6213131217cf5a352ba2cb5fee9a4d68ced034fb52133392147955c9e89fde9
57dd1d89213021d1d97a3a21313321c2a7741fe4c07d4c8dda597db931e5e6ce
372d4672538c061eadb740be58987b862f833ba20e6a495913328d7450d5a24e
2955354b35a82372bfc421333921e538795a9568953b6d6f598978e61ba520e2
1ce5a138541e7b011fa1d5de2954bbad1671bfdcd8b7d7faf8ea9dbfa9cbe28a
fc5adceb2130213c829ff830aa9153e3e5e6a52662fa9b80f1dbb6a4c7bde421
3339212e8f5244d108ae21313321cb9d307732d23e67601ce72131363021b273
9c3712213133214079e495af213021fa70cc5fa1ae2d1f21313321ca7f924221
302114c2b49751eca9ea408ebc0e2e5469bbaabcfa57a26f4dee7bf5b6fbe59d
042fa145373b57b4b985ca904f814e50bff8cfea213021d0e31eb5c48b3e90c4
d121313121c9e1ec31d46fd77c98a3d5d5c0e45a1f1b079ae06b8a7638f4eb71
1bded55747b2d0c45c7eb9e604e9b2200685b65f8ad5e5cc3e5f8699c3393deb
d623872131322154d81de4b52ba1b744213131213acbf4a8648f019d65213333
21aaced03f5b15a3bb015bcc9decb99a314957f65dd5077a903a5cffb05966df
b8213339212130217277213133213bc0cd98c5b92eb558d5dceea59470a5d598
68e88271ceb15a0641a2a3da9ac63393bd9d4cd9b11f9d1493e734c66dbb3d6a
e56e743299ff6b987d6b617e92692f17802130213e8d7f3e8cb1787c520ed7d7
595387f5a4761c1dfb1815f5effd24032332d44d213921d640c4a6c2164d425f
5b13e0cf8e21333421b8d9bd1ba6da70de607377178c07a36924e54a1526363d
1cbdd220c38d132e4e2131322181628d946b5737213334213096521feae87ad1
d42bcfc9add72130216f7b388a80e09b5fb49c4830af25c85eef9074ee213333
21f6e361bb3c957c5add6b01ac179b16f504213339210484441119d87942da48
ac1f645b421421313121e17255ef04f07365e3b821333321567480b456c5f3d7
36bc1fff6a1ea1c886ad152d52012d5790ecf215dcd4c6749d6e0624d991fe44
23759254fa7f073c7cc39b5fd5fc17fa96ca826f653012d02133392121333321
0f5a30cf471f24839771e6c3e0b79e78b24cceba726c1c29c3b7b8f8af510e65
7db29eda1becec7d4c4a49b3d21f19cdde792aa13d21333321213131212e33f3
52793659eae4aa2130215e78681b9d2cd2c703d0a24a1af0c3d251666b252b59
753bb74655face1732bfe96b70ae4bfc7a957f824a64292cb2f2e0d07a89e049
8e9f92a9c629f8f621313321ad3159c817e303e8f4f3d426c41f4f29f2b11308
3d7b1437f3bedb05068c81e5b9c215e1eafa2fb44f88d1c3539fc17460a13e6e
1f798cca6948d5dbe2b948c2f2de08f9075fc35cd4f10121313021db6f745326
2130217976262a4481c0c156d3db642131332108213021c9a13a0f890643e42b
9072835295a8b021313021714a6f700e5a411b535099e07e01ce3be8ae5f1659
b48eb9d4d0f853512ea14aa21e5c28ffa4dce38dd8cd9a779d24213132219b95
f9ed4c5d20eb300736af66647ef798ebf6b0ece46a6a213131218d34b4383914
8d154f3e2441d5b0dfc5de13f532fc7df811f636a89dc6b84721333921ef626a
3b4fdb624fed5fcf16e6de7da19394d2ba9b60d731bae26552e7e17704a2daf8
fa6846f2f4425e2c5533c32fc92432be501a5689f64aea30b320e4fcc7302133
3921eb2c7c2130210f9a165a12c1a8205b875cdb3913e531b779c65814fc89f3
786857e843d69c240f2aa6f8438b0790315576e9cbef452ec9a4e8213339216c
30e61f1356b96896d23b481f5052e50502213132218d08df6cb8e6de43e49bb0
17c20205e289d75a5c72c474c4b7dd33388b80e14a5b572321313630219290ed
441d9eeb447001cbaf356d29f606cc4b23e20ea7a3a2c8a5621328a303901e80
7494cd4a82b5f3d7213333217787243b368d425ad4362d72b798dacdd365869b
f7ed4c87f916f2fb4b213132212131322169a6
Encrypted(E0CB2A0E57D842AB9D4C90C08983924FA852788C)
fa9fd750d7630512cad185be5e37fd7aeae956fa44143f34ed2eff7cc921313221
f7a470b0f8213921bacba52e659816699588ab93213921f98949adcd4decbcc0
3fb12f38abb4bcf27e97618120bc2096765def773939601f03a20886d9eef4ed
cefffd7b4b37ae0556af87d83589e975b1f13339807821333321ef2133392188
268af7f985ae4e70b580fd6666c73d796711255bae3e05deef1bb73d779ef742
b3203d8cd76f1d7aa6393aa73cacc3dd553e5eb064dc916dda51a6ddec9dc073
1a559e965538906404ba0311f08f5782a8282131363021542a31d44dd602779f
1e823edd17b1f368e578408f8d213132216856f21099db7f0e21313221d38743
df5bdac8e48b5d5596be183b1918c921313221213921117d08083ba959069ba7
93c41559e94767342a2f7787ec7332637f21313121baf587142130212db72d67
2579a8c4f8e87bcd554865825337c7e0395fbc7ed5f825dafb782139216138a5
3c7bab17ef12c603985419d96dab55247fa72f6d12bb0317e23aae9ed42d
Encrypted(3E289D3F11379CDFDCBDCF1E74BA67D9F5E35713)
021ad752167b04186996cd16f1927b793f7ce6e5cfdb18d2165597bd8121313021
cc4145213132212fc6c31953b42131363021a7b1ddf1071ac94172f228213021
88b6ce91a382b4cf68a27e664e666928b2fc9958a2213130214679ed1db642b0
04b22ea7fd977790cbeab06b192133342147ddc1c02131363021be2133332160
1a40f5d682f0c96b428f20bd553fc95c1db07154a3d9f5e1bacd283f67f72e68
213334218c213136302114213021ce6db97968196bd6f5494d08944d7fdb5cf3
7cd26d0fd8fcb8ea4eedbcfcb8eabacc21333921d805c37062b1e78807c47029
afe978026198615aa933c6b65c3e24fb6706c5414c1710a14a8ad7fa16c50ecc
b7d5de2010058d213021b921333321364b39d16b1507c5c73bc3f75b30cc03f5
02b0ce2d917a2e29e992771b6d213136302189712c768ec58c6d529e75855433
9d3dfb68eadba84c82bd98daeb6324580579f0656a12671d931b57f01d4669f7
2cfcf130653e3eeeb3efb52bbbd50e98f254926cff709d01129110f5ed904b16
8fbe77fed6fe1936b9e77598f7a23d6451f5df4915ecfa21313321df23da26e2
1f4d52923c05e30466573f504d3ecda71faeb4bf264a213333213121333921a7
c315abb83f60a79a19044c75c3e9023c254cae365d236eaae92133332161484b
dff0fec5445c4121333321741ce8ea4343bd987a1d7490e9cbf0792131363021
83bbe66e72446977c378213334219328508b488c894854a13392872133342160
4b08e5ab41213130217dd0434e2133342197bf72c580f2dd953376662c73e0d6
a2ddeadd42853c2139218724e81689f8bfb9dd7bdb78654f34af9a6d8ab77e31
a3a14c5cb58b787c21302171db21333921ee2638bd4f8153abd12da5d43ff329
2e789406665d48c42131312137bb69ff2130216f2ed0cc4928e0909c2317e721
3132213aee1e787074a654444b831707cf68afd521313221d1d6c5b8c1c8d3ef
a821333321cee433762f21333421681a761218ad606921302120f83d61d52d73
c97ace3b2b193782c3f02033712a6184e286213021207b889b9aaf8edd8c1665
779a3ab6a697c857dc89e6e042e6b6f7f73f1a9b9e7ee51e06885703dc989ad6
b3f65da1f8b4ab5ee1988ceb5db089e6e3d144aa0316b674615fd89af23a8bd0
8be515bbc8795107d2bcf5213021dde7b05037335852209c4cc1694a56402131
3630212666f68b84181b2eea5621313021d5adc0a31b3fd0403b7542a2077221
31322163c0b6844c7a53fe20e4bc69905fa721313321cba279b384b3fb8b35a6
b5ebeac66b797d6b5c44d058f42e2c04b7e2c598f2e0d150d01c8f943558c408
393d56368936cae42af5f231d8392c6c72153abb5f88d8a157de5648d4420421
313321c6e34788aacf50429f0ea33c8864131950436e2fe117890f67d0517a3f
236bb2c0aacb93a775d3a2c8941fe4e9a5bf5012eeba213132214494e55c3c6f
9720f484334efaff652d2901cbde3aafad053ab86b34213132214ec352016f85
0320dfdf62ea85dcfa393a2e2a544a72639aa298832131363021a42020ce12a7
baa925ad45efa83cdff2936d213021aaef13371d8debc7e7e4fdb91584dbcc97
d221313121aff2b8e112e56cba9961ff99ac81be96b865feb3ae77c942621e15
af2a90629d3aaaa68aad65075fe5061c864411c4c22139213253ca113c788769
1953d66d19a4074382b3b5cba5c0c64f15d26352d5b7ca50f6dd15e8e3b6f135
685e638a213339217e4de7d7941c6c1f1534f148e07b04452619711f2fd22133
3321f1505644a4c1f3601084efec520474c66b867ebf213921fd7226cd96c089
e4742c132bf4b6b651dc37684a75e7e1653411e0bd08237384089a4151068556
a58f40fd7221313221ea182131302148b468d3cbab21313021a6be1871bcab12
e4e6547f915a0f625a8167eeca7678b1e866edd5c68db14746e616ed16147594
a1a18aee5cf56430ab909206eb9aa54b66dbd321333921dbb4f4ebee49688272
98213921c788702bcb8eed9b1ac521313121322e94a43d4a1001d06a89388539
ad5899df315ea323bb1b41a6ac8e399617c3cf1c7de0f4d4a5f016ac6365c479
7326d3ed21313321d52133392170b47796409606fc52b6c2ab6ea6bbfad08332
b21d21313021053eeae8838e07213131210ee199d7fa5e5b810f213132212131
332104eac09c2fb3aa8c21333921914283b22133342121313221c28967980121
33392105bd448d26a8679ab4deb51098fa61ab1b213130217f62824b017df372
21333321dbc1294e4bbb59b721333321a83d89a6da2a4079fbe1433e21333921
ae5e7959cd1b71d0213021f8c6c802cdc3af82db53d08b1c60c83dfc69839f76
95cbcc6938d19cfb213021b491fd21333321731c9a9e2a2ab144da32f9fd6129
e9fbb921313021cc9580906b7e21313221df012a654d9f29281ef6cfddbe9b21
313630211287bc213334216c69e550ed9b03e841ebe0a14dbe7a179d02046c5a
6026f17c53d107cd21333321f8d88b69213131216e0e042131363021d6306dd6
c763b6d0cdfe55e72cffe570d870a47c242af2df886861f13f13617354eee78b
9d55347ebf05ba906b35116dab0e8332cc7d5c2a392fd052792131332161d48f
617899f4d72ad3b0a30721313121c574346ff2cc4b46180fe641213921c71f28
992a2ae9ed5a3d8515860ff58621313630214d0ec3a368a7c9dc506396bca56b
63213921d5e1a186213130217cd04ede6a19a758fc072131322124b83c2e75e6
789d2512885921333421b3ce719377655cee48cf9fe5ee66ab9038ca97f8c02d
5aba66f2a5c85f9584ffc661dcd020c83eb87fe278fac8029521333321448be4
fbeb0275f254015be6dc2c043691e0a94a9a3b1346e6c1a683cfd7ae0fa72133
3921485fe15c89fff101c4ecccbf1f47d3cf3e28528de5d1f6fb06ce46ef7216
e7fb7e4dcc638e7d3f9cbb9f012fcf6956689b16291de50692ac6c451b3566b9
2fda67340ef4d76f4067441a38a91fd31cd4c4493e9780cba2462074d9888121
333321dfc94aa1148c373db6f03ac5834fd02f6b06f7ecd4b3322cc62bb3a65e
a31805f14c52b8e91c5e7d4ef17de38e9ae1167d81e8436de50f6ab221313630
21d38899a6b170eee96ed8d26bc5391612021b44af9817c23bda5f03dd86b526
05d65c86af53fad55585a8d8929a883c7774d6ad20794e7cd92b3aa984213133
2106c9f95030b781770ef125841e9f9aa5936c1bbc03a64eaec4ccde7c646421
313321df41510813b471a5ea5b193f5e77eb21313021f3ca767a9cb4a1888821
313221d5dc176aa80e79fe213131215ea38f213921fcf84a61e4b299a97464e1
04f9336c90a931df013ddb42b0a952ea284ad0508962d224a4f9ada8d09799ca
213333213a4d88615585b9df6539103d35065d10e7baac88fa21333921d62dd0
657cb8062456355ff83677e9459c7e456a99f9996bde05f9748ad8cc2f190f98
87957c9aa37161ff3476e00817daf0ae8d70145f135c5baa5e427437e51ec821
333321c8d6e93d213921509175f71a21333921265b42f2db25213334218feda9
17b2c779213333212c3f2133392145aad77678213334213523b48acc4f4a8af3
dba32883775c8049567062f399372bbc3bb472
Encrypted(89772A202342C07D37E85A8B7C9445CF147E00D8)
0fd921392181213921d64b15313953698b21313221018affb02133392121333421
dcab787eab9753ba21313121a3d79d21313121bd6dc8942cfaea3f46b0ab2133
34217d9861acd5c497c6bad07d18e6662133392114db9d38309c11b3f0cf8d15
b82e9d946db7b2303c301d3d0f25314bebb15f757f2f7a74adab8e0613dde9cd
5671a2bfeda7674108faef2f617d9605689ecbd2d1213333217da58bdf916324
1661236fa437bdb69d662b74f17dfa323af4812131312120c2544f6eb9d4d321
3131216bda8e3249fe5bcc14de23d5d30e9eaf129da98dd70e43be61cceed128
1198213921f34ed9c154b979b18148a101b7488093d8abb25cd0d461aaff5a04
dec4662481d124dc835ad6c881e2d0f9e3dc765f8bf874958856cd5e21333921
f6f384739558d589e887c92f213130215377d2381d28d7f403c157c385c7bc2a
9bc1619102e278d3882130216fa9ceeeb3230792e5bf6ede7e9c2139211a5fbb
a757ce4124346960d8b72efd102b7508c97e37ff44b5213132216574022dd3d2
213131213d828421313121754e8c8367be643a67caa244a79f64a483ada62414
e3d103656bc25c1c7c34bae7f625bd5e473f6938c1ad6ac2ea0641e566010856
db7e9644f22f2a0429fd6fb324e7e96a53a3d814718bd3e76bd7e28b21333321
96d63fc6e0033255f595179921333421f519467638a38f49022d6e6df258af5b
c7457064758bb841591a132bd4d0ca75285659b0dded21313321c9108c66d370
cb6638d63242c4bd7655f268c9aae067d9fd91e1d01f3aa1304c9017e99fa6ad
665abf6701571f21313221592bdaf0c890a369e3956ef2e89e90d821302126db
f177abb25f458fc43519641a40105cd214af8ffdb2aa316ec18f179726f93265
21333321e76f4f4799029068ccc27ed712a247f93a3fe57cc2e9892b74a1019d
7557ea08a35035e5eab766e0edb356a77d9417b26e35c5baee815520519b864f
ba3bd24957b53776306f4432750335985d21313121e714782c6ea3bc5e731d47
d62fab6d482d8bac6fb95f9a9e8f43efc03cbd5eeed564d9e9402453a217f9dc
6c48f72b0e29c48d2f1c2f145ebbb13c2d125021313630215ef5b9a9949cb2af
3daf35a1c010f121313221e677b89d408c15751bd7ecaf832a8050afd8fce77f
18885cf8213021f26a911fd80ee30f7ea12fd344eae7213334217618b8104eae
78f37f8f3965c46347d62029e96065d5188f3e2c53c4ce3942b999be2474a50e
c82fbdcc6604181396bc43c3de2133342119358a284a19c380c02e12751293f5
797b55b2d33861ffdad1b8663a1b92682edfb004017faddb1dddea7dd5dfdcaf
e59e1552d9f87b861cbe24c634fb4f54fd72d3e256bf213334212130213b02de
3bf853ae68a528c3bf42069bea5d9adfda4faedf95f770ecebcbdf1016213136
302158cee1144886c12495bfd45608e7de7b3221333321d6fe5734ee0113e663
f23062e4bceca8a828f5a3a8a2748aec1e69df46339634fee333d45d21333421
b37f593b6b8bc7d944046bcdd72fa78935de23789972d61bbaf12bb0724d563f
6f2849308ff83d37ef68e01278c53a213021c89071f24321333321116ad0478c
2c06b0c4c2f2fd3797aac9ef472131363021f2116ef345fc73d274101c213131
21adbf38dc4135c956b644efce9b3783ab2808baa1eba421392116695030a5d4
015b892131302152213921e1c028f2e7b9f07bc84690f3cacd112e11b7eb453c
e4254d329fcedb53418ee87164842521302121313121e2d0bc6bde518a1c3369
49cc23213136302107137e9624bccaacf09a034a4269bf9b6972ce64fec649a1
d87fc3213333219920f47bc3581fdcf1c721302131019e8f564103b8c5e12928
aba9b31bebaaca7ee3ba1e05bec6cbf52bc9502f53985b48437d7d16ff8a5321
33392182595e621cdd05c5d4fe777759973a745b213130214e0eb48cb1d4a2d5
2624986e5fba5ba5baee21313221894c69682133332138b339ba15f383e7c8fe
f82e23c0f7ee7d21333921dab441bb40365e923228c88e691e8de5678e10052d
35538f652a41555a7a88eff7112131312192fabe9aa9e280a82131322131855d
95d415dbcf6c4997df91ff377f99cc84930466bd21313630213469aa4f78d3cd
1c7b24abe60f213130214b97f73fbd7abb28383b6b60df589a06ad4e13b85745
cb3b34d45557acb0c51350cc8172203dd021302119ab259b0ff8142131363021
202471baee8248fe979c1afb2c2e413e32b75bbe2b322821333921994af51601
9940b57273e4e893896b1b2987f6f848b933c2d4058acc95f7e18cde95558eef
7c7ac82139217bb9d4156490ecd2c575579433fe496c55b7d748b6ade84cecbb
21333921dc1ea2503f57f1c7f95cacf054ffdad2e0bcb6fcf86507213334214b
65eb2318d5502d242933b996a1b796c6a1cad895b280ff28de94605457ed6970
997f55446ee8a9048723af44abe3a9363041a2d82e209f65795fda24ae8bc88e
b0cb6dc05b7de7e9365c7849067c11bce904ee9080eab9b516bc4a77ec41a6ec
0f4d532a2ab1c31e2416fbdf0615696d7b603b8ce6aef94d15f2188032b74f2c
189366fe32aac95b62126e82d91eeb18745258fb406ff7df60ed8da6045e2133
33215b8f33131ebcf7423e91e18e85cb42ba8b8bcf6fce6d5aef8128a5ac932b
657fbb97724c7114ef46e29366f29799ab39e3ab21313321792e8491b3653ce1
13a4aed621313121bbff6cb114d6ba1f479548af24e8a73c3c2cc66121313221
64535a56f7eebd4a9ca48f2eaee8c77945e242b88a01fa7a2133392129fa3360
8480555dd08c95d24fcd06b41d971b3041998d429504f51d0f21313121563442
3745e3a9e2eee202bb3e61fa6976eb7e7d11befc8e6faf262f9ad164af90aaee
de1a213021cefcdf054b112c3d2133342199bb21313021ed893e251214e6ff53
1edc293da2bb97dd3772aed64cfd3f24a5b55767ba713aed8f9dcb1a9e824bbf
2bb217abd3950503159e28ad213021335ec095267739d46d18dfddf12e5e1f7a
737bdc23bd6e9c9e65cb3089c9f6c031436d1f55dfc4213130216e8551213131
21da88d76596d5d9841e018eb4adc62139215a0621313630217824e66b886b3f
68c8d3da5e88f93b49bffe7b2f4f12c74157089476e9494e45083e2139215e68
408b73dae2857ea7577d20cf4121313321c5e182073c454998213130214b52b8
022131332188625bbdb63c825c987b2947e56545a63af0628604213131212f5f
0499762133332160d7c59b719fae86fb21333321b8fca3aa4b232ca257d1c06b
9dd06e76ecb06a4755957d3b8d2131332180a97ae4aeeaf805726267efb02f05
932cf02131322108a8d3ef07c35010c17ff1fd4af62f7ccd0f0e4c9c93242133
332121313630214833c9b9ab33ca3a9bd2762f2130219a4ce4e4576b84a67940
4634d160e55dfc851128865e90b12130212da75cc1cae147b96565acf5ab7858
597bad3c43cb143c106b0e2521313221a925444e3805c42831213021cb16c1ff
c3402d2fd9d663e3603fcb1540531df157de24213131219d6d0876f7364c9e37
dce9213130214178d8deef2f4acbf36598e6dd946bdb21313121e42f8c7f68e8
83cde77dd9c6a98497ed7169992c6d829fb9069eb5a15cda5ad9bb764a20986e
b0dde5a49dd91dacc32a91b9343cc8072130212f95dc77147dec62f5f4ce3a62
1225ca825d77dfe180156a11bc6821333921ed413de0485ec116213133216752
1e1ae85ac9dcdb9ad93b072dd9401a5464e3fe06cd1513233897500f44157b23
b5b81821333421ccad5e04bfdcb96e6d25716e8bec4c77111b41dd2ef89bdf4f
2464aef0bca9c3c3f59580a95f8c1c5e58122a11d8896a257f624610585d3bd4
0e497bedd776a718cec8fef6d15a5ad241f9d908c9d19a4c5bf3536746a971f3
66b29508709094b366851e328be1e360d3c0e31745bd15d64ad13c02d239988a
36cbb595a1c4d267c94f4d893a842cbdb3de1d31543621313121969cee213333
2155162ffea468d0393a79213133216bcb26ed9b351fe0b95f29ca4d060e9361
3790321ae77ba83b5cef213333211b45d7fa8b4d37188970b969046150b640c5
7f3e344a2342d36a06cbbde2dff2c069cfa15c1521313021ae84c721333321fb
029a918f4fc0d6bd42d7d9905afb4d2c5121313321dac349a823e5a1eb3fa862
809ecc8eb0e68d37947c68f7ad48c4bc3929821289d7dbb6ab58713f95fe4371
8e35f1a821313221cc323a7d25e94a7fb9848616fd7ab9f4fee45fff06d245da
eb2ee278e7786aa55cecbd7312c4b44221313630218686ec21333321fd5bba21
302121392135a524ef4521392171a21901854ea148741421392133dd75b744fb
8702075fe5c4651ced9e2bb22d8f119a802a9976113a36ac88b0ec6293eb807d
4db9685307f57db4c5ae98cbfc17bd2bad7f3fccbbd2b04579ef42f52bc2fbf0
a820f7826079efe42eb9cdd485da059073f27297709c7602e56380f5c13d55f6
ed2f59d5810f92633efa6c52213334214925abbe8917e92089f4213334217e3a
ec0513cfd1f9a29c5e3ac3de831ae211213021f18faccea3db58292c596e67f9
25acfcdb166c34ed1c76943dcdc558a540ff1c122131322117d45143ec0364a8
3176128b58ff148fa3ee90cbdead85cb05472061df3bba4c384a9fffff50ba77
a318633b9c7059e7817e94f032382131363021f51e73b4ed2ccc6b948e28144b
38625b1189ae3572721424c085652516c4a232fbfa9017f63b4507a860198287
41b105b735c3dbbc0fab4e978020d7213133211863e3c26eadaf3b8a4b47f4b2
8992c89e62e364996876a3e434dd4030b2747a025a2064e49f309f2131363021
10d1f13a50da7357a153e121313221e4fceb4a0863cc5676a1451841b9b292ef
91ab26f8c52131302198a44694a36a44cd531d5018345c5f3ee795cccc2ce858
4396213130212133392116d756ac62c3598d6e71ec37562131363021c4ae9c81
2481537b2e3b2131312136f34fd02133332185f89b556421392107836f2e963f
baad45bea21653b36c2fa2406db13789da71a4fc872133342171b09324b33412
43c22b3185de7dd4a834ff33342131363021e77757e4b3cbb048014cd288195c
759eb1929e57398acdb33b9b8ad9144777decc082f3791baa938a93ef2281107
ae471f07923d213333216794f64bc5c9e47c7c21392191cc823cc637d666d9a9
7431cf11a9e82bcf654454f32ba3fac262a1dfeb8d335a08a73fb72131363021
c2f8f58e6c06213921370e5d2c9a94ad3ca16af34c536cc74378a6563a01e563
d4e0a1c7ffe24321333421dfb485e38b68413cc093cc2139213b910566d674fb
9f357c39dc15aed60608880666a71b3d21333321a5789d684c52d8ec9ae1e363
b01be3f645dd6c6821333321de63ff4bc9b96621333921e3ccbf312546746120
b44f8d5ac21a213131211139b3705bb54d74db67f847183aca50c331ea08fb78
bbdd07bf8bd85b3d637ce8a661b152df20d5e745312f9639041f50b99e90e486
b3d591661ad44753532131332189f4b825309de6bb7d4a213132215372152021
313021444228b4579134296a493fa279213339217575c8ecd06ecdfbf89b1644
08f8b2668f213021fceabbf348081e702c10ce2c2341751af776bac458ccf3c4
b9e13bb5ffb8dc213131218f965c1298af213130214d9631ab49980704c46980
eb911b84c89c91c3a341a559ad10d49662caeba5f3590fce2d349b6d988a66bc
42ea98fe44caa6fbabb4a292978a8e0e509829a31357cbac7cf6c4834b196e5b
9ce0edf032f53625f23adc58c81ce521313121e39d97ad3c87c153de73bd555b
6dd75ccb3192bf213021a951e547df5fcb2133342157543949688d3fb63983da
fa9f25a96a712fc454c9b9f31a248532e7753e184b29e293997f6b37c251ffbc
5256b598b477c3748c9523a41454d563eaa7cf28125afca315d23b1521313121
82761f252dbddd112e65ff683358670fd211416917551393523fff2a3b40d92b
65f65ba345c583a5c4fec58c90fb213334213dfcfc23015f21313321d2cfb8fe
60bc21313321f52fbd93793485931b930697431c79ea6fec61d198a344e2ba42
d239b3ad8946e6295944700fd41b5c98dc875d7f7bd3dfeb31528b6aa6c6108b
59a738d93bf75918b7c4213131219f466f8d06b830a5b5c7fb34598bb5a6d3ac
b87ee821333921db3714cbe48ba1ea04adac772ed075b8e7d85d304da5fa3b21
31312101c2ecb3d6f368f7bcf82821313321378b19b3213334219c4501213130
21e7a9b04fda3864909ec6f0ff44698e21313321732e606fe51ee0830e999e51
1fc952ba68ee4eb490982131363021cb59a6cf2ef19e9db5ba9b2dd3797bb52f
33f38cbe3e988fffe5f8da03dc5afae50ee8ed537c9ba990bfe9f6d5945bf3f0
459f4a790250c13bfa2c804e8637d3544fcd0608a3eb4828b8a5dab5c2213334
214e5c2dc4043a9414a2d76f6d28a4fa56ffacc00162b93f64da9f2131332132
a57c08c113f082def89eed9e29213021182cfb21392125c6549e65e6f17a51ac
4fa5cc166f7da3213136302117f576ff6a48ee92c1dfd0bd21313021642f8167
db75c2b225ab83043885184e4ff469d7e39b25ac3ddb48a390eb235f36afac12
d0d2021e8a315808fa82ca2c38478af76c0ffc76618ee6df451a7a91bbf92130
2115b11a97b79e9efb3cde21392155b9b41595ef213021eec141a4283582dfa4
6e9490506653beeb3321333921e237533fd5bdb9442c21302143f7ab7a7c9138
4e781a80a88cd3eb01d7e3d84f6d56a1ba6552213131210458c162012c89d930
d9c696c06f1c11f250650ffee0b771213133215dd12da690c3b001fe2444eae9
2131322156905fa64c6c544221313021053b96cd956773dc424d36113b398c21
302117a1b9b4213132213faa74e566771897f970ef5b0ee14682ac86dbccc4d7
6370fab1f334398eb5feba0235caf3c88ccdb3e23321333921eedb165a7dff99
8bbd46c9168a3ee62131312156f2d2a36fc87196ee5e1485454b8ab9f4cca9c9
6e8324f2d5f52c8cbc8fdd5bae213136302115765e49244b2472faeaa4b5c789
aed963bbce9a168140b0a1b1c26dde0fafd83b531d83213921072f0fcdfd0821
3339215c79771cc26c66852f8433c583c0762a593bda07feac8ccf9c213921ad
6b3aa2b64782f493d46fef81cf37e75a676abf7df91fd85262faebbd5ce4d484
e61e339c2130212e407c33497d43eeacf3311f6de3e088911df05c7c394e7fd1
c6088bb131fd69205cc459e58ddee0244c16e7e21dba986021313121549abf8e
264d6121333421248a6752ad25fe5bf1e980701c6bed586198328eb7f2d3b39c
96d2386f95be6021333321eacd369b348be344927a9a44ea7c824abfbfc82131
3221761e6e45eef09aa983ed0881f88f213136302134c79bf6bce5c1213921e3
c35f41a2f4be3763bcc452bfef746612c0989d10cba77f597c944b9c21392119
d6c28e59d7d21be413e2e5641e2c51e03d8706bcf613d054511f952569c983b5
756a994eb06112ffd6db4928ad73b61c53feac4aea9523f99d7e7a1fe710bc21
313021213334214ecf16396e8aa4da31cffcd5f36e5c2b3421333921628fa539
e7393c8b59f4419421313321148cc2101c1da8213130210e993ba421313121d2
ad7ac8ff1b05b7443e5abe7a39566eb340cc122a7cb9dd4bb2a6213334213121
31363021b1d4e07c9e152ab517e36cabbd21313321f733722131322121333921
2a3439c6a11e9f21333921b921313221be21333321b477676edfba213921f07f
4e299ffbe816c2213130218799c5fa07c4306f96051f7e069633cefd21313221
c42f2d7866f9a69c45318b5d4421313321c7ca7e2131363021795ff0cae4df03
f9134881a1f0847afe864d92fa9a97b7213133212f44e8f3aa937dd026bde76b
1b689a652ccbe8ce506084fbee4b04e9b31f25396ec680315321333321d6aab5
d372d52ea52884d2e733065b57dbc718a88e36bd90e77476edb3d2a1f8caf405
04bce64ff9eaf774b158b740b07f814d5b33d9ec1b0110452133342118057d91
85d87f9094d96dd3de61be78653fec1b36fb4a896f1d14126e0817b5bb2f1c5d
6df50584bacb65f74f5180213333216aa5d5a8422e5bf371565784c45bb73f4e
ce9f6f151721302152b7e9d11d21333921dc15231dd03381cabd9e420169c7b1
Encrypted(6E6D524CDFC70307DA084FF6A46B64D196DBE7FC)
1340f94175c693158058213131219e1e23865e118bad8e9affd8d7213131213c99
112d7d1cfa95177ded61ce481d15386a6ca6d5b79ef426b17973d69524d97291
d7183481c4a12f6ac328ab634d8cbefdd1c8eaae9b05c43943dd431374213339
21943f71e495a1eed334aa61bce437e7e2e5d89e1c6ef4665dcae5af3cfb74a1
af9d213021a3b8996c0710a16b3c3853e3d480df16e12943a5f43f6403dd321d
d8cc39213921aa21313021cd937021333421444af697c09efd3d60b521313630
21213132217d66c721313221da42948c213130218b213333217d902131322171
050f2bdfee154de9b6d23eaeae15033942fd6b2130217d6daaf10f7693134c57
ce296c692379742e37b44c1b6cc889b3213921f43b551fa3eeff6cb830cb6858
c605ccedbe56d9fefff4f56dc5d99d3dd776cc8b1c7c1271cac988c37339a1bc
df252d23107c4582ef2af4e80fa5fccf304525736711190ea1213136302124e8
ed4ecadfee79016ec1e35fc5ca5526d7847a61b367579f3c2131322138404e67
bd283ada3b8f5ccda198a3e392d817cdd8fb31e0dcd2e261d3dc51213132217e
f211d15aaa242131302132498a5c1c89d107fd1c8ccd1ef81159bd2a85aaf81d
7b717b8758f09f8c57058836317ca170e17ee6ea73ce4bd50f13fdc55e3e69c8
0293bc939b116e3886aeb3f4f24523dfabcfe05fa38eb5877dbfb4ae447ddd19
91e5c74d3396b01fa27c0fa39d90ecccd4dca75b3c6fb14e21333921285b6454
d77cc0491934b0f82139212c141580a1b756a17bd68e5058e212c7213021df66
3df3448fd18fe1fc24a30565641d54e35d41626fe74e61fb5510881aae162133
392152fbc86023d62855e92590a7838c9df73f8a445afe3a2f97ffd8b291f821
313021d59a8893195b92b51dfdb11df5f08182a25c4bbfa64adf902bded09e8c
c04311da37a157b1f13601c27bdfe42fe38b8921313321497e4ba16a94015721
313321be5275501c865bfe5d40ce9fc2011c4132dbb957e3322e642131312121
3921f283e11de10876751c63ecb9f0cac362865055a7a77c19169e4ee2085595
4a35e3dfc54d8b2f82124ae2d2cf72e4cd3b4d6c3cc33541c0d682cde9213130
2118c431308050464ffb8302b999be60d0df81213130212fe92f6b4f2bf45959
96b44bfcae435f2a7f3f3dcb4ce93c8dd0213131213db39c46fa76383ab88b1d
9894a14e0e875142833abd3d789c83504b2cec45cff029b5551e9521313321d4
ee7be02e23014015fffb7504494db9f4ce11ec67dbf314cd6fbcfefd7a213131
21d564ae2ff00f21333321742131322153fb8a55808f15bdda8a86efb676f05a
011b2bba67a86ab82d4cb44aa5503818213333218f96213339214d690313ef11
1bcf0859dd92d59be21801d577eb5570ef6e1effdb3773213136302130d51ca4
961ec5ef1a164e44c64ade38821bdd25a7910fa1e98174ba947f21333321d5a5
f282c5b7477befe0e9d8e04fe6c8dced814c89cb84a92e182e25b406f2213136
302128ba9031ac7b99d6a67e6ea5f174046d9cbf6d725c305c6b6cd037d32f50
21313021bc6b6ce8c971b79fc0f81aac6b5ca9b5e121313221a7a94b38213132
2195ae17621c3d6e213921026ee3e53ae33887d461d479df9f2e644f1a15fb58
3f4f9b292e3bff6545213132213bd36ef6f34cda4e041b68ddf696213021a4d6
d085ba238c2d3bd7b0af11d590394c1d615a946569c6448edd3bff752d1fd2d2
776d93d26b4be92f72e71de14df9e7cf323ea4356e64ae249255e8289ae9c890
f3c1797fba3266a9a657b850f3d12dbf213132212f5825a2291eff21302106ec
26eb8d41eb6c9c46dd9f1ca305463e2131332175cfb8c9cb52d782cc18f33c21
33332170579aae213921ce84737131ee105e2d5966d142ce21313221a885e1fe
f6909aaa33b780dff8bef64b777a213132216d662551d5958f2131322172cdaf
b881f7b97fff8fb5bc4b2078de8c070e7c70a404e004c7d067eeb778f332dd33
ffbd9ad89e8cd2f8cc06789f1d7316abb40221313021d3f53768e88b9b33a2f4
3e917d4bf2f2a729454390b99f8f693f792a37468b264357213133213bf4e8d4
dfaf34a1f321313121cdc72ca37c03eb5256c6df1eac11f8bfd93e747d4b8c5f
8c29315c9f4226a221313321d2e9b1bd067e655e1d3e2441db50c53d8336e562
213021c6728348e0c79a213131218a2139213a312e442fffbc1a3bf7a4bc119e
f254b0b8d0680389bdb78ebd05cbb8900251e0f615559494b3100687ad1fd037
c25d973ec03a25a87d213921d3b921313021188dd3b088ef34213921d9bd1fc7
359f2581ea6c73a5f32a857313f18e872504ee6275801965e6d34fb4e4a37353
a5f624a198db754071acce21313630210391ae96980fb0eaef35379270412fb3
1265e17b29032a2bd39d729426e05cdbed855d9a86f918a721392121333321ba
a9d5050e531d37d808c86d9fd801da298f94f6ff165a2e9c5547b1d01fc5ab7e
c821333921baf0213334218821313221eda3a262344d2e01b2fa1ab4f21a6a64
4a9d67a255f89c35e181c51e6eef7f968c5767bdd2db3cf4213131213cb725d2
6663afda1424d1d3a4df9d2133342131
Encrypted(251E86BC6BD8063A46228F6595F6607C9F0A6911)
d49b83c5e12130213f82e46d1312fddb1e13638981bd82d87d213921b3df579043
122a6ec02ee696a8cd82b52f8607d91121313121f08dd9c27cc7c4e1edf26fbc
69074f7c695f14de7337a3bcd35646100f1f31a1cc213132213bff31ef96b3d1
437dfb551b5ff3f14b40a684a6b66a16948b5778b49f21313121512880cddcee
5b2ae2f26cc8213921d15bc46d3b4d6545e725ded51f21333921dc6cc9a9de7d
e0f9cdc0176afc1c9491bfe967e5faa6a9df064099563dc4e31494e64e84bed8
77983d8e5a4c5296c7197598ddfba31da778602d2af01df2bbcd692a25ec4e3d
f843788c75e58f68213021a50888db63477bb1e22131322139f5c9ccde213133
21b09e53c3168b3402cd2133332164c50129feef543e7d231415ef1325ba2f8a
68aa9cfee66f39e8d82068b07b6b9236b56cc6bb57115de62612a10101c164bd
d3aeed8d0f962b0fbbe2980f2846383cbf21313630212e88908ca249ead73640
7beb2021333421e3376c213921e330bc8e213921c0071128ec6949e6dac54fe9
c349852a181b81269cff935230e0b2ba08e37185f866213131214d66fade83ff
f521313021035f1e84d5627a39796b64d8c27c89dc239d5e412dce115e034997
a32d213133213e3a8496c1741aa829a221333321213132216fabfa89e51c10fc
5303ee3717e22133332166939a43481ad9ebcaa5df0121313221ce9f333af22f
21333421cbd7fdfb3f82a74e2bc0d7dcbb876108371498297cd5213334211890
35327b2131363021241a1341bb206e3dc517a4bb3c4bd982f3713b24a569af64
62a22502c76a7483852139216b7cfb6378bc0730467ff474a915e205f2bff8c3
4a4a1f2ccaf9322f8cc47e2e2b299280b9ace1d8
Encrypted(69B1A2A111F9E3D9B5FC25EDD74DB7DF183E0AC3)
c5b4b287c76fb171753f5e89e5a9eb213339219813236c7bee7c8a716c76213131
2121313221b6855f34996221333421656d0116442133332172f8e921313221e2
491eadef4df25ad5484a90718fde34bfcec858f207b15f19a882ecae86c92131
3221101bbf052f1912a5c2601b97b8aa57915643769cd4da197d35d210ccf5d9
63d704802a51f6f71b37d91d404b79db5c726dfebe9516677e2af1daa8e04076
3480fd5ca8a1cce771f48c49086af1193063b61ce3ffdac3bf2130215b6e63d8
1e8e756b28d4d4f21fe5bf8395b9213130213ff64c1ff3076b87196aa9dbe006
459eca3b7e234c5777fef58f21313021f6230eb864ef5a14383cce347d305098
e159b0dbe298bdb1bff2d7c94deb9659a9cc3624b9b16b15330fde42ea915413
2e58b26a8ac2c5fa2ce68af7fe0fb4b13746aaf5124f77c17956fec63b141a24
a8b834fbbb6555ea2c92d492c990b7c044c2af9421313221f0addb51a7a4c815
ed213339218359057bbc533d25ca06969553f5ae15645bf4fb2b6086207a96d0
2988de3d07ba19cb6371888f1d85153ae9cade29bd64bd1bdddac3ac9a5b9029
8201d9405f899043e5c7991332b8f9f9ebce7f31708f7a2133392163b2213131
216613e5a16e1f288d91adf01c05974e080fe3d7404fd598213921af21333921
be890ff2b0
Following the idea of [[using skiplists|Skip List with Edge Information]], we construct a balanced tree over a list corresponding to the ordered traversal of all the nodes in the original tree. Beyond that, we have a balanced tree structure on top of each list corresponding to the lists consisting of elements of the same type.

A lookup would consist of navigating your way through the typed balance tree (of height $O(\log n_t)$) to find the first and last element in a subtree of the original tree including all nodes. To do this, we need to make a comparison between two arbitrary nodes in the original list at each step - this is achieved by spending $O(\log n)$ time for each comparison by consulting the overall balanced tree (using a rank trick of comparing subtree sizes stored with each internal node).

Once the first and last elements of a given type are found, the rest can be returned in $O(r)$ time by navigating the typed balanced tree.

|>|!Space and Time Complexity|
|!Space| $O(n)$ |
|!Lookup|$O(\log n \cdot \log n_t) + O(r)$|
|!Insert|$O(\log n) + O(k\cdot \log n_t)$ |
|!Delete|$O(\log n) + O(k\cdot \log n_t)$ |
Encrypted(B8EE49AE65284AE550E6EB50DFDAA136698BB587)
8e05644131cfacb24e19e139a1a7d1ed21313221bf79bd21333921d458dd7c2047
1e9bfd606194ead0a75dfa97bad183a38036b21a3716d519db67fb740f7d6aab
f87c9cbe8cae7a2133342180a7b6c5791bf71cb7b2604895c94217ba21313021
355030be975e7412941a451667c2c456282e9671e145e1c9213339213eb81d0e
848fcfab07f05bb64bac9773adc94ef9ee71e29bcd636604ee5aebdb9fddcdb9
4292b775b873ec441c88af7f85981ae5aeda3b9bbdbe497cb8e81e5d64213131
21361e791c5934a8e1ab32520eae4a24977dfd295399a82a44ef21333321d3d5
dd3f92fad3c1dc77ac14cbfac4772d1fdf5e301a4c1ab7b693d0d803f4f7f6d7
2133332148795d981eebc711ed07d5213339212b3be2991cea16937021313630
21a4eedce553213339213a63e460d668a72b17fac37bc8afe262538428ffdc99
a637ce8feb2bd79cdcd2fb55b4f081fe4e49ac66e6a310bc2b633e476c35a93b
e9e77069ef80115a735868a12bba7fab40554674749b776bc12f5751d154da4a
921921313121a49aea8f03b321333921248f7658cf440e2f6b9e02431d6ce662
a144f6213130216b116932ab416f9cec5136213131212428b692a38a971eeeab
87e94d1b748c1066b975ae695cdd1b963fbedac594babc6c34f4db06874c9c21
313630211ed5e44890d61e1be1feedd6f7884aff7b9821313630218d4b292c9f
9b7918a11061488ab3bf16999788636acd3b7dd6b3cf21313221bc71e9d8ea41
2e8233dd81e46f284546a92dac6049354759399c2bb48c6f51b55be1a29f42b0
ee2a6c5ae1dc21333421f150319506f47ab7d368a440d1e66b11f06f1da5aae5
8a40c2d12aabd54c403acd0692e2d879e8213132211affc897dc48d852e659e7
74ac31b9bc653d534b90b41014b9cc01167cde06c6304566f7d161abb76a4b57
bd2bd13d1fa69495bb7069086049ca6ba5fc6c5b066121313121d2c8b7634e03
244cff6a856d2ddcdfd13e4ae3ea55e02dc5e74c6747d1e6d982b45ff70e4c1a
f57c06ec385f68b91d6e6a9005f3d125c1fc1e316ff8638b3342590574e7969f
b9dd67c07fdb21313121fefb1d65814020c7e9e6a86167d321313121e0bea9f5
6961c3eb86cf83d4518b65c5969e752131322118897b251ff166e8f221333321
26544a675291592bf421333421dce332fb48d21b429fc4343497c321313121d7
e3fab4d9b3e28834f5547ddc213921fb6ed76996c33080213339217780bd743a
2b29c51cbd5eef02bec2fa5f6addeccc4c66ef316ed7de68f81e20e43749fd5b
21333421c1d6fdc72131332146d1eba6364e1a5040489a5a1fa8e1980fa8e0d7
52603bf435d7af6a70c2c1826ed8aac66634aed6064a62824949d398c7ac47ca
c437cd944bca1bca607c2999f234ef904ae998213130217cb4932ef4b89b75fb
7099512f0264665390857fa408459f494f9c428eceb6529f3ce6e1caa5bb153e
94196808ec21333421d2140137ddd1dbdc1f30b4c04a3fccc5c064e6e91c8478
fc1ed8bc1fb321313630216d2e213132217b3cf35d451fb7adfea1433a0391d4
fb01a4bb01753e2d1506bb80c7d8b89233ba872aeb08d121333421678f213334
21667f8dc329d0e0d4a244b84ecb5d396c9304616421313221ab7a3ddf784099
97bdddadb0256688f1ac85fcd79bf17a5e3bf65373ca86e377d7c174c9a7d608
4da70ff4195e213921ed77bb553b9b7d73d03b386bb39e5cecaa77ad490fd6de
3c6f7cd3a39d21313021b12b026a1c0eec3d8d55eded7bcdf1db081733aea446
aae2db12105a37df47fecd3ec03486074f17abb823e0e0894dcd5ae42f61d9fe
f00780add9f1c75ef68158574340f5cdecf5835e65d106836b4fe111dc9dc6ef
8d8db85f7dee5da9e2c6243e5cbecd67173930fd4c712bc43c8e0468a8591018
e908d45679c04a559c8e903ced828693474b213334212133332162c4c38b95eb
2b51cf70603e62fde885327aad1e97559de9d6e9d9928270eed349e26b213339
2196aff74ddcbcf7e49502d26b049991ea60ae3ee1d52e47d9d2d1c0025d02c5
80de828ec9a19499f5f8e9aa7bfb919f1cf9af4d16f8663163b05e5d61232477
de9ea85d61acbb280e58d056d9524cdf81e90e1f10511d969d05bc32dbbd0821
3136302154fa94d1987455cc3948abd88b19c1bc491e21313221a53776f82c3f
21313221315feb70d88c543cc4fa1c21333421963c853e7a7fa224a4af46665b
8b83ea7d7b7bd437b77eb84b954b6677b4e1a4fffc3e511e23a521333321488d
ad4e24c7f1ed6413c0f4a2b66e2b50cdb964c9538a86781f21392135033a6640
4eacef0e115ee1cdce601a21333421df2a32ce5e0e2a3ac2ba213136302111d6
f7e87a84ffd0e3ccd8198d44262c26d8425b7496a7b2cd196c6b74194a78b8b1
8a7f1230483ef735bf7dc7159053825cdf594ac621302137145aa68e21333321
213021a621313121cc67a74a16599012c4d42483ebf610f8b121313630219394
21333421af5dffc33ef22130212fee9e6f1837bcff4cca82287ad998126eeb94
e370c4aedbefc59e94860851902ffd4ae24e3efa3bd1e6e9439d1b23ad8da17c
75b5625bb3befdc1c1e5c4df5a90c2cdee83811eaeb692fc39ebd8c6b5b55a2e
decac51c99c854384cd2566335cf92a3c6d552d6f297c221333921ab2c429bf1
9ce858b2bdd959be6ba64aba34f4305adbf6a21fa4ac496975e71c46fa2b78f9
0796d8c59e5f86d33ff5ed824503a3579d2aefcb9e2edb5e36806f3197c08a28
213021889136c34e76a3d532064dc3ad04de8a8317cc4b8aeb3221333421cefe
96f22131363021dd6c24f441b449759ec3c8b501dec98da85be77271e2afeed7
cbe955ee4fd9ae81c68026fb39567a72668d3afc6c376d3e04eea9a888d3072b
9afca47537bb6a3b53dc11acdec38dce3d99b6b67a7efe7c67666dedc4ab2856
db94d9d67af0daf2fb4195db4e3be1206030cf26e22a21313121b2467c08caad
d06a038786cd7efb18e4ec24f4902392ecbbea2139216b76335aa6b401c78f2e
e3c9f995d4a7a5af03a6bb454644b6becbb08a3150eebeb2ea0f257736b24681
fbdbb26f5b04213133213394a6c649145d1208f7887cac597fd5914775be4ee7
fe0541c87a01a3213132219b3dfbeaf8539534b94772436f3678027dbd942131
3630212133332195fe1aac23e9b8399762c4f4121f87e8bec445ffb38e208ab3
753e54dd41394cdea63f575ce2213921ec5e61040817ce6f4794bece6f8e3d45
4a1b7c48d5f69b2b21313021ef307fde1bdeaf213921a8c73572bd95e83047f8
3c75025beae27c5c6d18774eea2131312152f41df8f5fb31e22913ebdfbd3c9a
56113e9642d7d1aa834843dbd17242ea782133342173369f4fe07cfcb23da161
534ab88595a31fa7cb93b38afba9dc6521333321c7d7afd507131e1da7bad421
33332155a42131363021edccc97f1959418f0402d4ab8316d794fdd1a78599d3
b6e273befbb37c9977dd49f134ec4a932e2a814f573f5b7f6b1f14fb4b95f94f
31c3bebec464729580b21759794db8925ac2aec015e22dfe015966b28cbc01d4
21333421c421302118c548302da4213133211a3e7c2c2fe36e2aa41c5b69a36a
a599b8fce3f951bfec5b427cce5d9373e51581a87ebb95d1c31ce2a953b4fbe3
2a703c713c21313630218f4db4fdc054b64f28529315cec721392121333421fc
1324c9810ef2330773741234a89f9b87708ff9ebfa899a7c2b1d21333321bc6c
74ff56726167ff8584a20405af14f1d6fa4a247f59e0ba2da702ab21313221fe
d1ab7fe1164a6606a6e3213131212e1d7c
/***
|''Name:''|CryptoFunctionsPlugin|
|''Description:''|Support for cryptographic functions|
***/
//{{{
if(!version.extensions.CryptoFunctionsPlugin) {
version.extensions.CryptoFunctionsPlugin = {installed:true};

//--
//-- Crypto functions and associated conversion routines
//--

// Crypto "namespace"
function Crypto() {}

// Convert a string to an array of big-endian 32-bit words
Crypto.strToBe32s = function(str)
{
	var be = Array();
	var len = Math.floor(str.length/4);
	var i, j;
	for(i=0, j=0; i<len; i++, j+=4) {
		be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff);
	}
	while (j<str.length) {
		be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32);
		j++;
	}
	return be;
};

// Convert an array of big-endian 32-bit words to a string
Crypto.be32sToStr = function(be)
{
	var str = "";
	for(var i=0;i<be.length*32;i+=8)
		str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff);
	return str;
};

// Convert an array of big-endian 32-bit words to a hex string
Crypto.be32sToHex = function(be)
{
	var hex = "0123456789ABCDEF";
	var str = "";
	for(var i=0;i<be.length*4;i++)
		str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF);
	return str;
};

// Return, in hex, the SHA-1 hash of a string
Crypto.hexSha1Str = function(str)
{
	return Crypto.be32sToHex(Crypto.sha1Str(str));
};

// Return the SHA-1 hash of a string
Crypto.sha1Str = function(str)
{
	return Crypto.sha1(Crypto.strToBe32s(str),str.length);
};

// Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words
Crypto.sha1 = function(x,blen)
{
	// Add 32-bit integers, wrapping at 32 bits
	add32 = function(a,b)
	{
		var lsw = (a&0xFFFF)+(b&0xFFFF);
		var msw = (a>>16)+(b>>16)+(lsw>>16);
		return (msw<<16)|(lsw&0xFFFF);
	};
	// Add five 32-bit integers, wrapping at 32 bits
	add32x5 = function(a,b,c,d,e)
	{
		var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF);
		var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16);
		return (msw<<16)|(lsw&0xFFFF);
	};
	// Bitwise rotate left a 32-bit integer by 1 bit
	rol32 = function(n)
	{
		return (n>>>31)|(n<<1);
	};

	var len = blen*8;
	// Append padding so length in bits is 448 mod 512
	x[len>>5] |= 0x80 << (24-len%32);
	// Append length
	x[((len+64>>9)<<4)+15] = len;
	var w = Array(80);

	var k1 = 0x5A827999;
	var k2 = 0x6ED9EBA1;
	var k3 = 0x8F1BBCDC;
	var k4 = 0xCA62C1D6;

	var h0 = 0x67452301;
	var h1 = 0xEFCDAB89;
	var h2 = 0x98BADCFE;
	var h3 = 0x10325476;
	var h4 = 0xC3D2E1F0;

	for(var i=0;i<x.length;i+=16) {
		var j,t;
		var a = h0;
		var b = h1;
		var c = h2;
		var d = h3;
		var e = h4;
		for(j = 0;j<16;j++) {
			w[j] = x[i+j];
			t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=16;j<20;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=20;j<40;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=40;j<60;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}
		for(j=60;j<80;j++) {
			w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]);
			t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4);
			e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t;
		}

		h0 = add32(h0,a);
		h1 = add32(h1,b);
		h2 = add32(h2,c);
		h3 = add32(h3,d);
		h4 = add32(h4,e);
	}
	return Array(h0,h1,h2,h3,h4);
};


}
//}}}
Encrypted(AF3F2F108A6AC5F9CE064A8BDEBE1D4A46B39A3F)
2c3dced55f5a08c8c83cbd79ff38593e4181344db38496a8cd1ac1989eb1798f03
ff7c62baccdd735579d464af42f84bfda4fff14d643e8af75914e4d7348a9e5a
eb7540f74ac5c7aee9c08fbcfd67951f8c876644c0ee49599a61f55032ec237e
fa06fee8213021e28b3af0afe9692c9b179114213339215f344c500733237c1a
c0128a3dad5a05b1641e213021296ce7353d53e916d5582133342177e05e5b5b
8586b341891ace5dc54dba602133392192f3a235bf549bc20f23c6eae850ee79
78e193ffaeccb2bc853b685eea47182cae77d3a13c84f705c66f3c21313221cf
ce1017d01b1b78d84875bca61ade213333214970e1d46f4cd5a3a17753bbe684
668625cdb41cd6dda6be21333921d349ed315cb7f8d51953f98cf153173ae561
c16ee2374c30cd76ef412d6af921313321146563c4c2307c7e1aa4c5bfa7d9af
2093942ea6447dab2d81f8c7a63bed44d8262bda77d5afda5c6feb655682f2a4
f7cae21c30958a509118434989e4d8729932e9fb73fabf93dfdeae1334258cad
21333921f873ddd3e91fd403d65e8cbc213333219621313021fdce71b0517dd9
3b390674429ffa1c99f357ac213131211ff0eee9e56521313321e234f818e382
e6c5fc21313630212c45b3
Information coming soon...
[[Welcome]]
/***
|''Name:''|DeprecatedFunctionsPlugin|
|''Description:''|Support for deprecated functions removed from core|
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin) {
version.extensions.DeprecatedFunctionsPlugin = {installed:true};

//--
//-- Deprecated code
//--

// @Deprecated: Use createElementAndWikify and this.termRegExp instead
config.formatterHelpers.charFormatHelper = function(w)
{
	w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
};

// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
config.formatterHelpers.monospacedByLineHelper = function(w)
{
	var lookaheadRegExp = new RegExp(this.lookahead,"mg");
	lookaheadRegExp.lastIndex = w.matchStart;
	var lookaheadMatch = lookaheadRegExp.exec(w.source);
	if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
		var text = lookaheadMatch[1];
		if(config.browser.isIE)
			text = text.replace(/\n/g,"\r");
		createTiddlyElement(w.output,"pre",null,null,text);
		w.nextMatch = lookaheadRegExp.lastIndex;
	}
};

// @Deprecated: Use <br> or <br /> instead of <<br>>
config.macros.br = {};
config.macros.br.handler = function(place)
{
	createTiddlyElement(place,"br");
};

// Find an entry in an array. Returns the array index or null
// @Deprecated: Use indexOf instead
Array.prototype.find = function(item)
{
	var i = this.indexOf(item);
	return i == -1 ? null : i;
};

// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
// @Deprecated: Use store.getLoader().internalizeTiddler instead
Tiddler.prototype.loadFromDiv = function(divRef,title)
{
	return store.getLoader().internalizeTiddler(store,this,title,divRef);
};

// Format the text for storage in an HTML DIV
// @Deprecated Use store.getSaver().externalizeTiddler instead.
Tiddler.prototype.saveToDiv = function()
{
	return store.getSaver().externalizeTiddler(store,this);
};

// @Deprecated: Use store.allTiddlersAsHtml() instead
function allTiddlersAsHtml()
{
	return store.allTiddlersAsHtml();
}

// @Deprecated: Use refreshPageTemplate instead
function applyPageTemplate(title)
{
	refreshPageTemplate(title);
}

// @Deprecated: Use story.displayTiddlers instead
function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
{
	story.displayTiddlers(srcElement,titles,template,animate);
}

// @Deprecated: Use story.displayTiddler instead
function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
{
	story.displayTiddler(srcElement,title,template,animate);
}

// @Deprecated: Use functions on right hand side directly instead
var createTiddlerPopup = Popup.create;
var scrollToTiddlerPopup = Popup.show;
var hideTiddlerPopup = Popup.remove;

// @Deprecated: Use right hand side directly instead
var regexpBackSlashEn = new RegExp("\\\\n","mg");
var regexpBackSlash = new RegExp("\\\\","mg");
var regexpBackSlashEss = new RegExp("\\\\s","mg");
var regexpNewLine = new RegExp("\n","mg");
var regexpCarriageReturn = new RegExp("\r","mg");

}
//}}}
Encrypted(6449840D624C8C0321B676B1BB6DACBE4E967AF4)
c61e2afcfd3f776a4a20bf817e37a7a61914b904ab156870c14a4162e089105d03
de5a5a73ab85ea131f700ff53db62bc3acb62df7b8326ec9824a117c651c5c9e
195572e0bec9de63b321333421921b3ec70ffe2b664304847eafbf213021b98c
badd46f38679e264b1c087d448a915e5edeb8b199f5dd9109251a7426ae4042d
213130215dd17103eea7ef77f8e1a64baf817735a82cdee4d22316466fee33df
0483124ed488bcadd050ef7cbf766fc2152131363021ffd239dbe0e76c77e153
0fc63d21313221c3a578af1746ea86aa3ceb019178d3e2ee77b32e7cfaf5a521
333321499929f186d29459af597a895de31d21313630218a8240895715d476ca
75ce869138edda58cb3b461a95a8c7131021333921b840bc213921ae9cc704b1
e577957ece68a658c8269e521d193ae2b8337cf5daf6b4c8089921333421a7fd
23dc6c8155dbc39c6853b20356aebb612660819b9ddf6c98a45e15145a676ade
1055627891c1aa4a9656a34a0665198fe32db980ccc9c4a583b25e4fc97634d6
6a213130215ee0a5f3d1dfdf
Encrypted(3C59E12631E918330DC96DE8C092C075ABAB4726)
444f98194a8c5c7c68d65f3fa43baec0f2044bcff4a547db0e4fca2131302166a8
838d3d259db7d97d3aaa66f032ab340241c7f1562449e916a58c67a8e9af1e67
5d8961dbf443248e21313121d29207d35d83f0ed8cc33b8c33442c54ec603706
21333321f06f42b058f3f3ab9c139fe8aaf0bdbda4e3c04a9895d4b120ab50ae
792d2656ea6b8f198f40213131212131332121333921df2131302142f36130ee
a46985f129fba6cdb74584dcef76c15dc321313630215b8b02e01a1994151e11
0446b58045838fa38efacda3636d7deac89ff85d56412d46bf6364f3c53685f6
781e8654366b688fe7b7805c787ba7acd5f0d4213334215b9ec3abd82a81dda8
21313121931101da9db672c6adf49a0f70550843cf744907ef17daa76b6de1cc
213136302146a6d2231d2fa143d721313121e42fd8ac91981a428623022e90e1
80f9f923fe56aa402570be5e0efdbd648a9d49ae4188cfbbdd6a6e5aa485c0cc
7efa2aa4cc56ca6273cda71481d88b13fc74ca918c424c8092dc8c5751cbe42c
46bd5c9203652f0819bfbcf617a9e21da62562580ee82130218039472139218a
213921036066c58c3fca636f48e74f4fbbb886c5ad17937f890539a6e1d107f2
ee262f9f65fdaecd4e9fca4defc772832133342175d41e1ca446af4e2deabf56
e81a54b2a69959fc4ea421313630216f808db4b3e89a7d1eac7b3c887b822131
36302178d9fdf45d620512f136036be666af93ef6a9467be6cd5e42fc11dd7e1
a538368a3ada3ab7ce4905c3cab26357011f5ec32cc578de4ad5ec213133218e
67f294352e70ca50355e816e7705b5d1d77d124d12ef21313121c921313021d1
75d2ad96e81466b4ed3aaf101185e35465c17919ae48c87dedfe462de9213333
215f31a3981a8781455e10c31f443721333921a44774b0b3815281fab8b1ea94
f83d9444292aed1496d44e3c6cf521313221ef11572d6114120feb365c66023a
2f1a34c49d2e28e9a5b867673fa9a53f89b22ee7f0d479d6213921585aff1a75
8dd1c0564d7ae8b5572130211c795eec69213021ea665cae35af3cfaf4a29004
43df68d5936dc1df98dd1292f88a735c8c45e82529b9f44c634bcb3da124393b
56bc684aa1355275387e911ef59c91ff961287c3f1a52133332197cf7dc571ed
01ac0f827d82c03d3a8766ac3a9bcc1ad32133342106bfbc8ad658d47ac6991a
cff886dfa3be21333321e5bbd6f87ef1b0e5f04b21313121255e955dce962133
3921af07118cd9b54ffba87d9cd48e4ed7e3d68beb3da459e91c29d0806a4576
1e322cfbfc21333421b625213921d6f72a799efbe4fa8b7cba8efb4621313221
69206adf9993c694a6df213339216eb33cb62133342144a35fbb6dc1ce1f02fc
678d01906908193cd715b04ae1213334216eee68d76b7fd292213021a3979bb9
9a7287434a9c5e4aba7bd833d2208cc3b69a4df19d2c67dbef4185a86ceef5ab
a73ded8e02dac52cae8382f9012e691a9746c94e866ad040903f648a45c2894b
a60504183046537f992139215985ae7179b3a7213132214ba2d1ae7e087440f6
f5558a72cfaecb043a8a21333921511eb379c8a63de1be5edb87c31d9b5315f7
fe0715e335e1c1c6caa915a255c94bdbd558378b69d95742245e50d9694474ec
e5df782872aaf7f3abdecf6fcc58f9bcae797ee1594b1733fd918d6921333421
45666c04cf2bd745363c292131332153ebac1515889dec6ed8853d499efd4916
cd4bef7a21313321e681b1a556abde2131302169204183205173811761bf2979
b317431978d503aadb0280f354fd745f54fa7d4624eadc8b968581afe62c489c
5c340621333421c83bec5e56854f92f78321313121ae61ae3b161775753bac5c
bd6687356cc1e8254d38f78d125ad1c6da93afe49c9fc2f1673497f4e38ba15d
f413420fa143213333217c4742c2c0a2cf40f910868d5d1286d8213136302136
46b918d4fb2988e4213130217d292cd14dee9721313221bbcc8eecc770213133
217021333321592bdc23d274141de536a421313121f7954083c421313021b1a3
73deada3362b14c383c2cba42e4a03842130213db7408f894d84f0f221333421
8033838d0521333921a7b829ebe01ca9a210ed803e41c82133342189f4df4d19
9b326f19fe79d0767c668036bf21333321a46e1d743268456e469e556c7a99c5
1d5ed1f7f3f72130214252489e572131302118d33a1b1429d7e2ffe220a6454d
6201383121392191e3c0268edfcacca388fa49fa12d808c0074d352133342123
74e2b64e4b964821313021c2e5f8213333215b614c884fab2bae49eede3be899
9e202521333421ce6daa7ab269d8f6e48191b791eb2131363021b4ce34405124
becd881040c636de6da77dcc2defbe47e42131363021031e458b4ecda356f6fd
95462ebd16240876523befeece213339217298254a21313121d42ef29fe090f4
1cefc581c321333921732e90f517f26f452131363021ec5a78d95bce66de4a6c
21392196fd35dfc05c36d9d3112133332161cffd0486ac2130210f19bbc1abd4
a7c9ceb411c7aa7bd3a66fc07a36bce830aa51a599cec8eb6dbcfd492b583d62
2c93984e7c1e1e152ebe44cb2a7751caec96661f08abb40ed539563f1b9c2053
dee3da3fea51f90e307117eb40cd71e520361712ae2139213d8c342ad0b21e1b
0736de5f21313321abd8898336146423374468ea84858b9921333421f9dd6468
2ecc2f8970e45ec0aa47da6eaabf6495d8ddb844944539f96185b4db69d4fce3
7078132131363021d81ffefea4d5213130210e121268f068e85b9f85b33501cc
31786021313021469370b55917fd4941633452fb23206821313221d1393a3a8c
dd68a303ba232ec3ac5834aaf31d8685c6f2e021333921816dcfbf8e3701cd31
57b3f50e66ca21302104241f1799e0810672203db6643b2668ffe42131332177
e6f6f89da872d689eed1c6f48ae37b418355ca4c5d86634bf7d7da0421313121
96e8f8198242e6711b855d86ea8ab183cf108704389891213339212131363021
e6d58bce3b213333215a73986040d1fdffdfaf235d17206436825ce29f578dee
a8e19d315aec213333218c783e98f0f166658dc69bafcb4e6a25ef3064172130
219363102ecb2139212d08cf9d48213334217313ad21333421ed36a934e5e881
febb2b6becd4bc3fd6a741367b0306f56554e9c2e4536ea13c71213334217e3d
213921fe5344213131216413a4a112f79cfa2bfcf9d8133055cc14f70e6343d0
3fbdcd9cdf62c0a4be213132211ba43bb1f12480d0f8d72c5143ef02bd735821
333921bdb0ffe82133332115b0e7b407e167b15a7a0812e696a28a769107d11e
bf0307e7a8948a88ec5e53119d8bb6416bf3a17f6b2a5a4e5b5b07733e357b38
59ccfe213021a14486988579377964086dfc181ae2491f7346537e1ca9a9733d
cda2a329eb417a906b85d32c213021d411c3be71df96dbcc4ffe398f75f7cd55
59deb9b0e2a8cb08a86cc8317a28f83cd4845058a78796bd786da576d865bea4
21313321e341cd30dda4dfac99c7448981fde7a7e2cbec32d0e6decf3d33aec3
29fa549ea62133392118bc08356069a11703f0fea4f0f5eb388e3c9f65297232
7e1f53118a81b02e2ed4fe2fd093d7f6eb9083e4f7e471d634bb519db86a08f4
7aa42dd095aa58fcbfa537213333212fb932d1f5d17cb760b6cf3d149d8a7b60
be18b4ec2d21313630214f1153694f411e0480be757ed87608fab35b47abc733
e5861f213339215f8f9853016b83e23d117b13034d101d87eb597b0576a2f9e7
5043accb23d86c63c5bdc730c9b09814ce66234da189851bbec9926bdc1c01b7
a9a65583718867295031ea1debd88d1655ba9c1e1bae57efa1b5a84bef213333
2177e1b9168798ea387342336846b62d21333321213131215c46070f21313221
6dcfe661c3bb40b8da593ae31e2db782eb4124ae54903b174bc603f3e2fdef21
3130218d7c781181f72131363021107ddc8247381dcbcbde2e19b260efcc6183
bde879b403ad14517006edb703c286b95e4cfc18e97e4b7b3685e0b2dfae3d6f
f06a474572da2bd408ed464e7a867c4277f221313121e636c774421faaa9d97c
ac6b4ac321392141be94c96a88b0ee0521333421213021611f24d9a101c5321b
4824f425bf7135a45e55d7213333212036c98e6edf6650e8bc6ac882c1d45d4d
21313121e3ffecb981a4be384ed862371d19177928c88afd4a77246dc39456e5
e0bf6abde621333921c886f353ca5f94ce385ccb213130218d6a213339212131
3221bf31b89921333921725972f7d56033eab63062209748941c2ded399fd853
64114bbf0f6e8678d8d53cd16f64bc7684cb21333321c7880287fe567bcff552
2696f544abf630317d9d6d34f62133342123fed861d2c26d92afff38ec5dd72e
b478f102aa7c28b813ee37d0d29fb8f4ae301b9eeeae132fa7718acb1404dde7
03b2999c15a53e187d44cab07ee3749213f2778f299e9608ed315f366247ff70
ddfeddc1ac7df01ca73fcbe78ccaab087c8d8176a103c41366357865d9909c4d
e5f5e3caff7d896c760844a825fedf9f6579a7cb1b7d6fd3eb163a4278213133
21ded6d34485ec36a83e6c03785a764bf5c4a2b804104521313121b9ebaf2131
3021a621392184e28a9d56cf7afd213339211032946421333921f1191cd246cb
68e812cb16b7d48d07165df8469134b0a63ec28318d6a785b1ee9f5d2e3266bd
71e17a1a0621313221926279282855dd8d21333921c878a27d21302142d23bbc
9124c5be3111e029c9631fef4670e08e21333421b4cda150b3b012fd23be7cd4
480e33bd929224522a9a585206eaf6ec3924e4b1969dda6072ca6a44ff17d1aa
fa5ef1437d798c31892444b3fd213921904d3634f848afb4f2b405986504cdb1
2133342165f286a201bd62c603cbfa7f6706069080d67238fe8f29e3e4723af3
dc6b5a21313121213136302138a33f9f7a3268cc591c76049ffae7f221313121
0125d8213021c55119ebb237bbef8a067cb88e614cd4eb213921056c8bdeb18b
c87a213339214856a4c76a5f0ee17516fb089e0e1eae5323964ec02418c741e1
87eb1a7dc76cf749ede55ae7a8a13bc83378dcc826b246ee811b3bb6c6b97854
972097bc87799b9d8188a4ad95023af596398c98de866389e1d269474b1ba719
1e634921313321b8a83d55da6d512131302171fbe189ee2cdc0565d8a27b2860
888853372131363021bea5d38823a6d96fffc732c73e34b04e4a6ba8f2fb0f4e
01acf185e8bd21333321416145ac7f69e7743eb7de412d40213132214e72777a
14477db07fe3c906d4dc7d768a6505b46496dcb908181a98378278ad28d00103
edd9d819559a5c77465c6893565a7ff821302164292130219abef7a762ba16d8
47364df4ea0144f67e17d021392108456d26ce2588de32f623b00e7e43dffb07
6ce144f6737db99cc236152593cf9088f1bdfce596abf0afe194213921f07847
eff63863418cfb71abc39ef03a7a152f6568ee2315a1f9cecf6e2ff10187cd7d
708326ea0611462d7949ba14ecd12b21313321b28e6876a9bfd215d394440132
284a55479a9f389856fa213339218bc4d2df036cf1448bf045c39866f85c1177
f7ce139736d3c12139216fe5bff9e16388213333214ef975df4c818dcb3cc7e0
eb55c1b6ba6ccc5c304f1a0e6a2f9c7e65268b056ca513ea02af3d2cc934fe93
ed0895dec42e213334215b5b87ca809fef16541657c85e957b0e0fd7a502dc7b
14bec7bea2ef4b44e93b7a4ec64021392149ff8973528ad110dbb7341b74abe3
edf65771bec5f650ef517b0538031caef793d6d4faaec9336084617af3f99d21
313021c446d484c9832ef394f8a12130212131322148e582f293f521313021ed
efcfe0ec84541987b27852eff98f614f15b0d41df251a68341825b2131322171
10d404daf76fb805ad8211a74be9eb749ea6402968025dc6fc4fedfdaa684302
36e53cdd1508bc3e15fa1617d19f80befee41b425cabb89137f534554861641d
20418e621d790e2133392174d529f073bdbe699f3420776f2dccd7bbb93882d5
450602b54404fa35186b67f9a4a220cd7e8e8269cdf5281244d84dbe83d5c30f
ec3b81a2262d29ec7f83a315b1213921a99468b87fb03040f48f2131363021fe
f58ff1a54bf0b5213136302141c77efdbad1753a5d47262be27e76c976cb24fc
a9fc13bd4e8b9bd2c43933c2bfcf2ae901913240ced45de842582b2133342188
bfd337eb38d75f0e8575213921a5cfcee76d0e41f6d5c66e8aac9886324cea42
cf7915566b103b86a731bf1aec69caf7e644d45af92c7a4f637b21313121a3be
73af05523fd942cdd5ea6ea62a0f0eba2130216dc7c27512f104a172bbd7fd08
9b75a1ab439fd4213136302126405482e543cbf59499c2cce125158c21333321
b2e55e578821333921
Encrypted(349D353509B4854BECCD1FAEB7E278046DBD4970)
f223bf3d9403b92f98d1e4b1641cafada7c901535b04c0ce464568c4ca01c56b95
af30c425ce7fd46fdeee744d6bf25b423249c82f057fa444ddb2812d98a33959
3749834cfa4bd16ba56da8f0f9e4bd857555e8ef0ff39466697921313221262b
10b87671625b644f47ab0f9e3e6baa9cb921313630210e95ce57ca45aa506221
313321907b3689736ed8b17dbec94742a47a94066aab40b5d8ba63703b71dd21
31363021c1efa1c99d7cdeb4ce43f049f4e635cedaa51c31e04c1b07a864ca3a
a414cb4e25dda41958aec2cb6252d13e1725a686c5cc213131217b99a4715269
8ca924603cc0f36e7011ed78104877e054bd2fd03bc503b6c22ae02a8398c612
0fca8a6daa2e6b2f48ada7bd343c98493ae301dca95c8ae504fb13b0ef574872
21313221a11f6879365ca3da4e7c4fd31c0583cbd0ade349c7fa66808347b24a
dfda4760ecb6d521313221ba3c4fc81c213339212a5ffe82c150b6f5fbb75521
313121313705bcedc0609837be2b34b22f4f21302168d6859521313321b6d69f
af629e14952ea9dd9b4d7fc08a60faf29c3cdb913103e0213131217bee03253d
5959258926ad967917794bb2f9b7213333218886e84d66daef69c19e5467a3fe
7ebaad2e5cdc594d11a33772f14fe318422131332143aea71b69403f26acd262
5c3357bebdb4c778c44d0757265c490f7f179b724d21313221d7213339214f7c
40d64da5f735a5d68131cdfbc1676db53ab0035b
Encrypted(6441F14CBD2FA4CC1675795582FF8F556FDD5F70)
a1963ac8aa05fa3c65bc3252a4302139219b90e4c27f621529349f172cac1a3713
e9170821333421a8a7f479fa7850c0d72ea8d59dbcde30c0db18f393b2dfc625
582cd74314320f94e7fa5804e0fc0e641a75d349f9c7f27d31fe61380ef78ae0
c3d8fbf88b5da37877e468f3c04736bc5d911fbbc96f9da96f2131322181a718
1ed396e79d5b795b396eadc9c8f74de31aedae6524178c60831832966ad002ec
e95b6a1a8513bc0fa4f9311072bf213131213a0e348415d606b35b4c72643463
f6cb7ebde33923bd4416eeffc5213921e9b70e9d8c7574b79cf3e0cd2cf047ee
16975ff4ee9c6def623b41fa3f32969d213921e0311f489a7b04af04f32d0789
e1eca766b4f9058b5258c442fd04b34e952bf44811446cd7b2a550f1c2cf2131
32212bd3bff64c7549dc6cbfe8632130215546313b0589ecdffd50600e12f725
ab2d162b2139217681caab071dcbaf0ff3213334214d7c46e3335ba38941ab26
149a1a2bf7d097e82133332178eb3323af95ad20c59def435f8994c69e40cf04
21333921ee661f474491076c5bd368f22c297530be5603191e357c2131363021
0466ab7121313321de9c26515e41d1524715f1588cb7710f213021ceb9213131
217654cddc6770c1a86cbcae9930a589f6f013f4bd21333321255cc79b30c830
d8d450eea4fee61c5f85eb411fbebfbb21313121d050313fc121313121cbd14f
18402039d020e0768b5d07d4f1a7b0a38141b991fc25f911a901dee532c8c8a2
5afc1c81d3eb3ddebf2130214f5afcc48bb54dbe97b2aa721b812978fdfb9c37
3863d74bd44231053efec6213021a1f8c27821333321d7d8c6f3424521333421
e3b4a5994da8c2ace8b9b9d3f1aea62691751a816fdb7b7432213132213bfb0e
c9d3159eb6cb6e4f80cf6531f155213132218ab8372131332170074a495e90ba
b9adde8b483686643f546821313630215f08b64ccc2d71ecfd10c23751945e6e
c759af0ee079cc213334214cce15f888f14a734c52ccb633c8ed350f3bfea7aa
f105ac5aa21f2878ab9fbef1308e7142e7bc21313021339da99e1e6beaabb0ee
4af82320
Encrypted(F714D75E7AC260576795FC812E00159393E0366A)
705c2a554b1c9ca74a13d384f83781064c7d4b6f1587e97ed4d2385054fbc4a546
21333921da78fecba421313321af614547fb9565857c5d1d8874cd877c89bccb
f46b75968c86e2695d5bbe58a185e8ad39f3d72131363021aeabcb9004b02ba6
a2e04c1fa180213130216933f1e7483743451fbd2d70136f60f4c44d7f6743ec
c418c525e6423cd5c3981f2c6247c582825e21313221ce56a8db3fb210dd2673
491178c03833b967064a0e4007f35d359df0a740c0bd2650103baf3f1f213921
b7213339215a9854058b1c5b23350f4fc7366763194b4533f663df4c71f64b96
15bbf2d2beffb2d7d25670c345bcd692bb14213339213efde49c9b4a21313221
918f5610b16a59a98993f6be8da917b4e421313321c2aee7915e311821333421
724ab6f8bf635a97e99dcb5769cd30c49862b72925f8f66cc0ec04ff1eb7178b
fcb9ae213921456b6d8581c65e9bf851c1023edd3e9d8afe4465c031901c7ddd
cbc4236cef9393b34865293723b64dbead89f110cb739a3d1c175717bb564b53
ab895d83f894d767d064e59a734d4c6994aca9e19d0e57331d2131322101df69
87eef60fcd7278e2f10394e9b4d7d783b4e9cf43176f4999fe62bfea3235ee91
89053a293cf76a2699d0f4356707b545ebba9f6d5a4bfa7a38c7d06faa927656
749c3181f43f77084ba796ace4e436553ba321313221bd9515c111176298381c
b3d8e9fb6eba0552b13388129db0f29c3fff7e555dd95417be70599ea21ad421
31312195d6149be5e6b8ba12290f4ea7213334211aa47073b52cce0721313630
21dadab8a23f9cf231bb02c17f8230d580dc9a6d52e33bef2cf8d52fde803cb1
a7baf3f3df2133332193f8958ec8fe9179a507d24a61fa1d6b3f6f53d86a4a5b
508078ba9ecc71d70221313221d6cc87d14951043734b131626e41b64c213021
902d55dba3fdc18a05aec5facbc82699905f64105a0536543605daa267ddc9d8
2e8b2ad1aad29bbc8885ca3a213132215cf331eb0551213133212130215fa8da
94895533bf1e89ecb2c4eae5014aea88f97f6ebb466bfa6e4dd65862d7a291c8
8159a278400e7ec3171ff15ec3f81dcd5be33edf6b1b6055fa03c4bf1cccb6fc
9f2f9ad49ccec5864584259f61dd06cf89fb5dff8e1b213339216761e1068081
576211cc818e61373341f49e243421333321a6213333215ec36b2e7b802a12e3
fe213132214f5c715cfc86ba5ed7e9803d6cd73d4238c1d5461aa3ba21392156
ca5d566ba247c8b028b813ca2ae16131851aae213339213e79cd4d213334211d
92f71a1a2478a8466b34d2c0ffaecd7d854b9439638608a5bdb449708078f6bf
9f409acf2130217a30771dd223ce7b8db51d2e6a403ee777301803e1bbd98bfe
446111ba433a6588213130216783b1e57c7b2d95cdcaaf9517ba9de277b17cb1
9c19712c421a92e99a4778517f242edcab38532bd1696521333421213333219f
e05eab730ffa4024b05a1dd5a1bbd87feacf66556de18728147b44a97ae52ce8
98b79738c72aebe63ec62a3e8a20af21333321c376f90484dd5aecee4e16b5da
16bc76e7843456d11c4cd76b051bd2a9377044213133211c3e3689f40847c4de
808b15bd1b596e8a231e9ccbfb42984dcd8121313121ae29aa8ceece52d43456
49dcc4bb36774ce0c8d01dc6f070ddba35a1ccb217d26cd05e15213130211849
43e8ce87e45832b3e793c0725f2b722cd6382429abd056c3902130217e6056ce
9c15f9ec578cf3d8b951724cd1bb6721392188213334214d5ff2213130213e1e
1c78d2c21eb6a18d0620fba479fea59b732b59cce1213921b7338adce3a14ec6
8c643d5ef98c2133392134941c8eb68f2d2f339c6487f8d2fa4ee0a40129bbb1
18bf4440bb04f377058934aae7aadf84d8506cbc581cbb98d2cdcd554033d872
f92d3a5273a170114f01f7bc961fe732ceff4993bc69356221302120ee656019
1c4a2133342185f680077958df6bc9cb82263bda4136dc601998ce213132214f
923b4a9f90be9bbf048be512471f21392182b8bb447c5fb85bac83213021ac01
fceb192d7c6bd7bea801c733df280321333321c915f52f3b7e4f77349d213333
21195162a804e54082dbc6912d5bd46e299ecd96bdf3f8af3a30da9513208de5
d304c7c56698ab0450db53e1262335bc84307172522af106d9af67b7da7befe5
29f9a723ed5bfd159bbe292cfa7a85daf413b572311945f22fc054fffe14a2af
802555ce451aa39ff6607e065ac9152db373d22130217c08bc213339215d5df5
7090f2634cfe18d3d36d03afb77c611e46d7d261b6e2d59de348af4e62579920
12aad257e37e747a4c9b205bcac585998a3fc41c7ac65069687b95e13add3483
bda3aeb933979811aff37bdc1655e5c23555cc3ea3292cfb737abc67da695c5b
d3041296213136302137dba65bd0cf7cdcd97f391991213334212131363021bd
967c9f89aea133b2c960eb8f45f84a816452d6dca84c8fbbd206231e647d2133
3421e37ad00379065bb6dfbb3b971cc0ceb06021392191babf66c2dec39351df
063fe506f64290af59d65755404c65adf0b382c873be98f73ea59a23fe99731d
f76a21313321080f181d3b429424d0213333218b12d9fd13621155e13f213334
212b68f0f864b6cc4986aaa920ef9083b6d5fe97d37a1351994bcf8543db0187
97ef6c30ee30736e167b45ff4f3361deb288248a2caaa5c78cc0cbc89c2534b8
971e129212c990f6ec642d0f803d9748154b4c257bd0d2bba832707371213133
21c2213333211085ce45f82b294b7a234d561b06ad0607aee526ee197e1520c0
9fc8084b7c45ddbfe57add2816cd3299bd95baf9e3596a8ac589b07b11b81377
1ef43d08f97837ee0ffc151d6f175988e599eed9ff21333321a6f01c85fc6fe3
85539b979fb08aaa7b0e97cfb5d430cb21392138c06431d27ff2e8ab288a3e19
53b78c2b637efff46577acb266ec4aee7f213131216e7cdf5af81994178fc598
93edb7575621313321cd7f148ceda908902bab21313321411c71b166e59fb58a
dff775b35ed2a94a7e2dc26fdbafb29844e19435213133210155dfa5948bc135
5fb699a32815c669ad2690d24b299a50878d213021501f8429b4ccfa8106fce8
03dc89de21302115c83ba2e6b1915d6e93b1b68c635f791a88968b9bc86d608d
cfd537e0566ce5d29b54a86a6b9e2a20865f7136807217a6bce82c851f1dd36d
badbdc6e564df8e68167d19aef83d4f0ff43376157c50efcba9bd06858eb1952
213021d05245a59337aa53aabd6c3fa5de87eaec18f94d75daec01a414a6d52e
9311adc776ef104b3ebd62d4db673908471f51213334211c37ebd0e63a41f050
d5023452a2d2de83a7b4eebf3775bfccdbfefd722d519c3f47d5f91bde6d463c
33028793db73f33ed64132779f160e66f8296adedb1f16d47171154e1fbd176d
b731fb1b9bce596e8f4588c8102e9621313121d4c237aab1d0a9fa4439e9519f
3de76d571be74abebbb9718f4025294de8819cdb354ff5f44ac15ab7ea332ab6
70b262839f67ba0534d121313121c1d547a77741213130212b1f156a2815efd5
92c48a4b28213021c03c84b079e9f2593b8db86b3921333421cc4a75b73f63bf
5ef54aac725c5b7c4904302c8c202947213132211c895df6b106462318fa1337
c121313221a1cf546aa70212c2db89619fc0b5fa2d1fc96b89d7752f83213921
57f536cac231b0575565729098c2028801b4a604c6d7a82475b4712cbe6c68fa
ca7a620769497280e5213133212bc174db08ca90f2cff078c0988197e79d81c3
52ada5ad7fdbcbfe1d2f9d29c9bbcd73f9cc5566ca499705f5861903c4806a44
28984797889b302130219b5d31144d213021df38ec2ff0936b128bd17b069e05
5b885a34e708c429a4d7b4ab213339211ccb213130218d3a601f0f213921a771
732ad6b27ea819a1e9061924190e0edb21313121afbdfa6c4ffe2387906ec515
5f3349e3e1eb556ddb80aaba78e21c614764d9d932f6f9eedc89d28b932bb8a1
40545ab01f64cfbaa641dcfaaf2aa821302196ab6033a7431a92d4213333211a
10860787c5e7fa9f2e02581a3e90de7931602131322174047575cc2133392114
6028024119aed74aa5b4e4cc2486b07c2131363021a4e9ac213021b6f049e857
3d66d0ab04511d41eecf32f901681f53e45f8fab56e2d59658a67d6be2bc5261
075ebb986fe3ea84835125e7ce0e8a6934afac231b4a114b4ee4c93350aa106d
2cb89adba6a82d2f89c1c780d42fe9e528ab5a526e8194539645c8f419726d04
21313321cd712b1398f14ec8246b318ada213136302151bf8817aad26c572133
33216c17704eab2f84c3d4f59801a13d019e94644390f83e1e8a94e648acc563
d81ee8ea3fcbba3a8149015b8b1a502d78fd6fb4e78d6f71e378876983e418ac
7fe41c468a753d2133392121313221bdd985f240dac0f77ce1411c3d1ebf6bb6
100389e473bbf7e89d5db9d081e348029c9202b5f1c95ccff862ebd9c978bbf5
9eb98567aefa17748bf12deb81bce9be9e5812f4a42b9d1726fedf84bf56beb5
c82f8c83c8cd41797aca657d554937132d775ee6751bb36b50c09395998597c4
7a5c639035b6544ebb18047ebf1e21313121288413f29314e7966f29dc2956af
26251e384fb9715734c6d75de461fa1f108b9f2336213133214aa81bde0169d5
b6ea783b213333218655ef213130217120b9eba88dec16ad41bdebd96cf91b21
313321fd3ab5ca96869dac917e7cfe02035d21313630215f9be52c7cf43c20f2
9cd839e4ad763f918898b0aac2a96534149bdbee2131363021744cbfd3fe6e30
309ad47f1e6d83fa256190dd556b77d2ebe59ab71aa3955ebe80172131302124
fdb777feb69921313021b42131302141feae1d02d825bb4b982444477a93a59e
7dad8397c5213131212f8c7f47dd4542cad1fc41af20ac36f0dfbb4047b37488
d4f37b969f896bf0930ffa491fb6c9c587bb2edf5f48a71f6143a3efa4213132
21735674c2dadc5315972f5a53a49b73991399c28e213333217c83c03539dbdb
edee4efdf6514882f90f3471ff5de2cc0facfa4b6dc6793fe60366955914b5dc
80f113b280fa9af2c5147a1ce68ddcd778d5213334212c04d6955d4264994e59
532cf521313121603c5dd9b0024c6961c204e2dc5ba790759bdc4d91d5b2023d
2bacd1b89be085355bf1c9ca9bc82f5aef4eabc1f57641f97a6fd770f8d24d66
19d016233c35beea814424a73f677f213334212ccfd593fe395e95d2a3b5debc
b32133392114bd21333321fab2a26b742133342137bb587cad431596908f7d69
fc472053fa12e543f9f1d9b5709fa6d91d2f2131302141eb208d442133332161
21333921719bade9bb7138213130219fbedb35d61d04bff7c27b68213021598c
c8ecedf6baf1c264a8e91c568fdd6f6ada2a6b7bc728703f90c04364cf213339
21eef9c5ffcf2f9c86e7919807d341213333218ebba886353bcae683e514b15e
47833a58a3592b927ef04d2823ea52ef6d213334215a53a26216ced4c3a70e72
9ad77507e4ed35e9cc93dbb74711b4d3534b7ebc8f5d70ad78b8a178a6a263ee
38bfe79c601c183a78ba44691b6f1cc6d7851798e6b434b8fc39616e8a544dbf
2c8d7e7effa6072131332148574f5f6988a38fdf8031c8c3b241c731a537b5b2
f8b1ba36e0d03c025af418a6213130218d21313321388aef5f56aebca2ed014f
55abaa77e25a8a21313221c026326a206d31d7e0a1b9f205b3772131312182a2
3b3962c08dbc24d92adbbe3edcaf29c97135fa5edd9b25adb6d9f5eb4189bb95
4dbca27a14f5ac619fedd7b341d5d7f639f6db21333421ffbc2ab48d43fb4883
7821313021138ed6aae9e8682133332143f136310349107ffa8f4a862130218d
9b7c415a618bf10308e93cf703e421392134102c98e45d602d8fae9a24951c65
12dce360aa548b016afe962133332131a4a5337e0f874d6941b87535b011fbdb
d74fcf550595d518d6188245f2b53ced38d1cd1a7f783f4513d08ff49b199223
f5c8537a177a567adaf7ed46058d2e2dfe297d7de75528bd74d1bcfc584d90f3
05dda9852133332119f19b66ef19bd48dfe1f63f488c71611dd8bd8cb65b447e
6423d562213133218e345a0e3899b8e0df58871df34f619abc98368fa6ac2497
b329f50358bea6d3d1cc78586562b73c08a321333921e826f28eeaae9366f1d6
c95a5a617550c481d57cfa3144f6e9d084fb12bbae83fa8221313121a87ae44c
52a8a5ffe7aecf79cc7bf49556da4fef8aa2881aec7b28411783038256fa7a26
7b4a94e11395c920386063a7ef2130219a2d984554213021fbe0d8fa5e28706c
213021ce4e3c789c86782f12a23a37dc860735d2b704eed584cfde1679de7247
deddce61c8b760a64811365f332d74ec457602e67c548201aa38671333213132
21de6a88945fbec768e99308511804f02e40da55f611109641b001b1b4691dec
dc1a1d21313221ee2efc5fac127fa213a3ff10667ff99c11fa677f8e33d7706f
10d797a2b7ebf07956c49d3cc578a629d1fa30bf7879b9e108a2be97c08bec74
fab760b8dcada960fe829e49fa4e7432c539ad4a8b31fe6421302117431a6d62
8be07ca8bc9bc2d67651557854b9436b213130217237293cc99a49ff347f5521
3136302198ea503974a98a978b04f58b352133342183342fd7c620fbb5d01fac
21313321b9fc01eeb24abc909c2f48f52b4b52d5eda9d8f1d641d3ea8e05bd7a
9f7315fe26d734dcb9bd117bfcf9492dfa38a78321333321f8c9aa833e2330fb
8a9dce4b4742ae3b723c1205f4232621313321213130211256f2fb1221302112
0479881b565318b6b237a2aacbdbb8be6d06d270c8db2d75c78047b390535bd9
36922130211f1a2c0834ee7a25d94a2130215aac3621313021352f2e28cc3916
13ef99326ad11cf0942131322182cb2f445cf7ba514fefd18d1190e2bb213136
3021ba3475df2fd26fc5562131363021f34f79f54f6dd8d4494e3e9ae93d2867
c5f0fc3ff6ee21333421e91d93d57055c270fb10b1fe2ecd4601053f21313321
936799b4d6dcc7a15fbbc6f472799ca7492ac78a3a136411213133212d9d06c3
7d82cd3449ad584a03a25615164202657e3866d97868848d703a5db113055843
55f2dc3a8d372856e380b697f36278acb4fcab161bd123b4aaed8290949c4c77
08901f62b90e2131312170df46d79a2a6f2a1e39e32133342141ac1619b19e8c
49fd611f199b4154506034a2167e0f29c71e3aa1c7b1677299213921c6213334
21c62133342133c68842793265df43213921be213333218bf3cacf4af78ce79a
e4e1bffc3c194735d651969353c491043b8b4d1af84ee9d4f1da1021313321f6
29bf213132214a4363493de2e0fcab013161f09fe9e57eac6031983d05647905
af43af2a4ebec2dbbc8dbd7e7e6c9abd99f774b9a9fce6e2065c9b5e20fc2133
332133a1e6cf0f31f4ad5b5c918e13a647f26b213339211707f03f64c734195c
56a19e28f214b82a26f796b221333921e04da30403ae017ebe984da8d5a14ee8
21313321bdc7131bae382d0fbe318ed4cf5ad496119f3280693cf571d37af0cb
a26ff3c049d1d1389ada6fe25b1d999828e0746d504595552131363021902133
3321db702f34ed8c6e50d62cc598c0c48d2ff1c705110712539bbd992c499b87
c1366280ff05e589128115aeb484294d63de7bb095213136302143257368454f
ff748339d4cfd926ed1b9c1469e0e439664bcbb346b4c0101b57862cff3f6076
bc498821313021646e04cf6bf38bf42afe2ad04a213130213079dd7f74c7d99a
fb03fb6f5e9b1dc417b7db03901f293b91881949e6471214ecd27da79b5ab995
de112133392114d4d3597449597d345de92859a82693d89b99d9eec33e589695
aa2db5c1bc284821313630217f1c46b61872313721313321a93fa71e06aadea5
af4343d17a11e340ef1a31da3454756381aeb4827ce39189bb21333421c31085
e63f40145377b64bec4be516552131363021076fd9e5c2cff95537f09abf28a9
c68697b6b8ee5bd1421e8d168b8d91c4d1194b41cef5bfec807ba4674a213130
2103bc07e4f9bbfd6380a6bacd5251725a5067c673076c591bd87f4c551cdda8
f92e4f213132214c213133216495b8bc85d6c9f55cef195c77a470f244fc6445
2133332130bec72321333321601bcc1db362b4d50efaf9286698233677251b06
bcfe864034642040d6409d48319e5a315d2133342121313321563acd3f5661b9
d259e3b85466a69590753769fdc880cfa9d8698c32c12974c06ac60107b1f060
5f630e402d5587e0788877ecb3f9f7b053d61e8ba3da583a3329773ce9acee29
c32c0fb0fe5f81c96ded50bb96fbc3017ae8c6999b352133342196c18e2d420f
740eb6152f04ffdeef130694379084a1e51696eaaa40f87654f389412fe2d772
bc213334210ecccbceacd703c723695673fd596af343a8e0213921543af4e55a
61ff20f502e8c9c4433ec2299ebafde538e41a9cf275edfd9020e6a121313021
5008285631865237db74b1ecc9fe213131210f037137c5b6f11a4fddf0213130
212c33a502a69b8d9cf7ad2530a1ac43563bcdc653615054b38445e6768b8b8a
99ff07ad8ca53e907f95d99c213130218644bfe26f80e721313221213021cabb
cfd655db5062ad644919e171876d8647da77213334217e07ae3607fb41857806
bf58718ebbf39210172ad137435b314597cb0656f4631b5247f7dc4975af3266
aa42ad4204ac5b97e2cf7815aad59adcbe98fdbd92b921333921e124d092f2f5
f496b141befe4ea18e2131312151a68e9ace1d567248e33516213021a1e4394e
0857bb658ce6c5e4eeeb21333321bbbfe9ec3b2421313021552131363021d6c2
b349213334211abbf758a8f166378f513e3f6481bb2de80673f4c9516c3226b9
e9e803543c1b9a5075d2745af1ec4bff68af96c74bd51903a402a593d44fd80e
21313021ce5d3a514f21313321ecfb21313121e050c4073d9de7cef22139216c
cf2cdc9a4bd33a5269e9e72a14ff4c9965775ec05c47fd21313221335f5b0e9d
a89daa880721313021172e3d9ad02521313321412d6161a7506777dbc1cde0f1
7e7e8d7ca79af9335912a8aaf7956dd1fff27216281fdf5bbe26049f968815ce
846415b526f91ac7b3313328213021fe0254a3be3d213136302199e8c23be344
b3f61395f6e8797ddfa759ca8b9ca9bd3fb2b419e6d68f38518ee873a14a146b
d45ca502feb855ee4f9e63bcacdf8c63b037430228017402eb5a433d322ed563
796d36524c85aaf06bed21392131d8671c9bd3f9d403ba6d79ea7b2bffe62133
3921c30f10f82131363021dafad6f8f151e93d89213021a7db6b2f4895b57574
802f08e5c42139212eeb1f345a7c2445c5238dedd33ba693659c706e7ec01b21
313630219ab5e55ee1b53bfb66294f6436af6e4ac5f8a81cb0b7562e4635e1e8
6e69f97224b6afac90f74f71fcacfd86ef9ea7bfe35781a4f158536421313630
21b2a744926fb92ea773fd355c5b54755817cc47a3bcfcbdf8981ebbb71724d2
b2d6acf94965a8ec70734c6f7fc531f0ad7f565e738a8af16621333921114f4c
6b91f6773fff247744c0a9e4c8d1c92567e08263cb467ccedc801e14e2eb64ae
9bdec7e860d96a4a213021fc76f66be276d81b11344e4950616577a9c0ecf819
6319cf1051ceb67fec7c538f593edff8ce3293106d9999213333217a898b25b1
463ef06d39e8cf4c5b8682c5af4d9fe82029b42008f29650f6706e4dd045c24a
aee92fab4519384e49e668e715bdb35c53ab88e4f3993b4811ae11e544e1d962
f88adab1050186f1edc3b1b6a4bdd6e529affe5a7f617181631ad2b89132cf9e
462131332176968639ea77b21cc545ae802021333421f23268a7acff08cc021a
173a4abd408e9426921d2e5e63b1b02dd59c4c646467312dc3a2d2213921a121
333321fc1792a6c2a5354920522db9213130217e789721313021f4bb1ee7d2e6
a50fe1deade104d4a15c872379d2aeee63c6fa1d88cd1f803b47942eda58532c
50c5a4c36b1adc059b5fba98fd171a425ee756d968b1324414b23d1c3296eedf
a9673c111e7a82c5eae62455c83040d858d6859e915721333421781ae2625bdc
dda6f9b5266d74642e5506994a8347dcf37a76088ebef7a518e5c2b16bc44ea4
14b0d51bf60224955efb729dc005e07d21333421924a4c7c91e92131302172f0
2130216162b32130212131312161f52b2fced06357a9213130218bd84472b434
ff84cfec1af55c2c761720593cf2fb2da6213921c1da87648c2133392172795e
ffcc2131332151a550f76990311a2bf940532823e56910213021dbf5b8477c11
7ab03d0721313021239ab5213130213872aced7a73abe7235fd042b7b64d038b
025721313221f9bde5e8369925a755f55eb0718762acff2438e9249fac60d158
d7e62131302199821fb70f357d34aa9acdb9e6d09c50616c071575b42a1d1f9b
7775213021ad5767722131332128c299ac9f15f22cd6e0db017002354425f96e
c0e23c5ea5d207ba1778317fa4e948991b1995c57cb6cbd22bd0e7e1b69e46a9
fd3edebf21333421f6fb751e362139214e7d17eacc6b6c3af38560e4da5d8732
7befc9de89534a6c6acfc36c9ba30573c35c75c936402d178c7e79c628859bc0
2ae624be1e47f295ab64457989f7f932d7e2b3c8ac43b4d21eaf924b107a66ff
c0c0b274f1c192ef73e6a811d4c321313221b204dc3a7af2b1aafd1735a71dfe
32d6501b0837d0e903ca
//''Note:'' This technique only addresses the problem of comparing two elements in a list under sublist insertion. To use it for finding subelements of a given type, refer to [[this method|Balanced Typed Trees]] and substitute the ideas listed here for the step of comparing two elements in the list.//

Idea behind this is to redirect the work of inserting large sublists to the //Lookup// phase. An implicit //insertion tree// is defined by when / where the sublists are inserted. A sublist is viewed as a single element being inserted into the list we're inserting into (which lets us use constant time single element insertions).

A comparison consists of finding the LCA of the two elements in this //insertion tree// structure, and then comparing the order of the children that contains each of the elements (done in constant time).

Issues:
* We need to be able to answer LCA* - In other words, we must be able to answer the least common ancestor query with the information of which two children correspond to the ancestors of the two elements in question. Just knowing the LCA isn't enough.
* Whatever data structure is used to maintain the //insertion tree// for LCA* queries, it needs to be able to handle entire subtree insertions (and ideally deletions as well).
* We can obtain different tradeoffs if we consider only //hiding// subtrees (respectively unhiding later in the series of operations). Deleting proves difficult.

LCA(*) Papers:
* [[Tsakalidis ('87)|http://www.springerlink.com/content/h8931352348u2k0q/]]
* [[Alstrup and Thorup ('06)|http://www.springerlink.com/content/f122623116003l47/]]
* [[Gabow ('90)|http://portal.acm.org/citation.cfm?id=320176.320229]]
Encrypted(E1D907909177F92B62895B5376860225EA9BF2D7)
8ed31fbe4cd797ee4b682f52ade8a88961e3feb11fcd16d4974b5869d11347c48c
3f2d5944efd42c21333921796e6b4ed45c925cc57f201492b0155d32ea909d15
6354b9c65621313221cef7db5ddaa79a9d21313021350319012fe5dfb34a8921
3339217914dfe3974202c4b7ca7ff6477f1b2392b8437932519a31eee35cda75
b32f213334219df4513b59fe3910f7d401173cfa74c6e45d3c24a8bdd6aab8be
1153899d61295b213136302120a9822b59f43fac213921348750b0784361879b
0385a7847b1db38c9214070e614cac4688eae794974fa3fcee7535c68e3e7121
31312169efcab0607d8ec2c3f44b95e1213136302181c85959ffabfee1d93edb
61f57ddccfa2922d1baf886e2133342112cac57a537d61597d4620d4a63eef8b
386d1ffd43358adea120adda3ea3502bc3ddd5a44e24e135f0d5cdc2ca86e632
841611a4b79ad69d897a294e533eff7efbbc38a150b099e05acf44ee54876d49
2501d104ad876c588afe9534746b213131216a6f059a2adfbd85d2a6c2296234
99c4d9172a68638b3c8e95f5e64bea9c213132213a255de1b751eb7c64428721
3921d040c8e057ed3e4f105a21313321c431d64ad8213136302146cfa8c889c1
3c32b4574e79a45beff6a1daf1ab032131363021e7c123608023151c40a72131
322158af881190acde56735e82acbc3c
Encrypted(1BDAD4B5A5E05B7F75C8D66D2B7B47007FBCC56D)
e439b55c86c44df1ae5be8213334216a9e3a773e01b5bf3383e8d0268bc710e3e0
f23dbc06fb60164ced502e691ce82f308f744aaef4f7f1e374f74a3d592c24eb
2d870653612cb4e84d14bee1ff81b2d9ee50d369213334213092a9c216d2c5cb
213131215d26927138be21313021cf94872f6644135ab51911ff087442a92130
21d3f4e72131312148ab775580470ff788d910911e1528314d4f3d5e986c1dc0
4f939ceecf2be2e5b0842139214caf2ae685c244d538d5e8be1fd905a7c7ef21
392154aa845ee3a1d5f4e98c1ef22131312190814c422ef09b5aa87471b6c9fc
2643ed6dca9f55ad82a3b275d239dafe90bdd16c1ec41a86af603921313021f2
663108ac6bc0c621333421642bf09be52ca180f468d7bed28ca8288be01d4ac8
aa5a1ec21730e2bb58f67a519e9b18e965e5f2f9042d06b3997ade44e70633ba
46b77628aa269bbb62237e50b6b32133392121313221e2d1816e2130211c44c5
a1514d104605bc9d99e3328c91ecdc86f7f7b3bd47fbb92b114bc1f041209af3
ae7bb1ca9775674539baf48626199c5954213339214179a7
Coming soon...
Encrypted(019C60369054BDBAB33FFF420CAADAD56A63F11A)
4c7d313bc5c3cdc2b517f21ae810c8213339217716b4f51eb1e39a354b49ebce03
dce6d06d6c1743f9f895b721313321b8c04fb60768361df7344a71988a517b28
3b4483deb4669efdd3906e9d5ad22a8c6d57fce7d532306e98296f45653a7cb0
2cfeec49af07ee1beb2139217ba49dc8080ff0bacf21313221fcdb59df3d47da
d26f47d2fc8391c771ed213136302197c525438604f0e5d2f0a63a37fa554050
7824c75f56564cee34ceae3adce5ee48cf9075f06854f6effaed618306ae6788
3fba581e356056031bb60fc6a821333421e62adf16cfe19d2cd017ebd2911c8c
b757991aee11e16bdfe0eb48d5fe2cb1d9cb86c4bb1c6866dfa8a1bbe3515701
1f36465f59befa99422130211dc073f255653e94d7fabc92d3c967cb70800518
a8aaad3f9883852bb1f621313221e2696861bec3e6c5e336213339214fdfde70
9eb754e944f159b84c2c57712d3790fba672dffaa6ae2130215104fefd718739
f883f507c656764de4929221333921306ff20fc6be871a3acccf06609130
Encrypted(EE92F2A032053E5E076D2F66E85BA96BE8D0F188)
a4c27106e0e6db1ade762131302176d43f6f055aa8cb594a70ae8dfb4851cef430
293d70e1c120b6561da8cfbe88f5f71cc5970514b93621333921598896874fca
b96a21313021644afc7715d54b4087df1897c1bd0e8914c6bbcc07d58cfce9b6
61c748510fe12ad1cb05167bf21ebb812b5269a7b0f144c448033e4101ad4923
a1554e879a3d21333921f6d1ed8092ea45721e26592535fb34edf36a1d77cd7c
b175e94652f892a224234345163d8f4221333321e7f793dc778f9b4a21313021
b487fd6d213921ecefc4bbae321579b5648e909f4c1adaeb1a7b85de6ed8f2f0
9aecad522d01c14f1492dc7d205f61acfe548c7d213021868dba63ad93c67b6e
bc9aac58ab8054de3198845bad32bcbe1ae121313021c7c0b08c7dcaa364ecaa
92682cf97a5331fc3cd7ca5a35cc8b7c1f92f15f31422f451079cbc24a4fc887
d87bad03628cf94a37b0493ec1cf1718187c855e55bb9f7121313630218a61a8
476fb8e81fa35e829a2c21313321f24121313021450132c3fdc49bf149f99ef1
5b2133342101cd7f41235498986ec14d152d8e758c21333921ceb2a9d1c195a3
b88ae01721313221e9ebba3011bebfa2bf28da21313021a80152f0e7d1c3d05c
655c7578d09101213921f263102cccdb8991b261d0e7aea99285d617074d6be3
079fae418ea9e9e9b8ba39b2502133342194131cec71d576ae4d0e560fbe38d6
21313021dd7cea2ff34f8ceca3fa5f577b39cf9cb90e2a301a9e859844cd45b9
f914db9395d9cb8897fe261a9f6f
/***
|''Name:''|LegacyStrikeThroughPlugin|
|''Description:''|Support for legacy (pre 2.1) strike through formatting|
|''Version:''|1.0.2|
|''Date:''|Jul 21, 2006|
|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|
|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.0|
***/

//{{{
// Ensure that the LegacyStrikeThrough Plugin is only installed once.
if(!version.extensions.LegacyStrikeThroughPlugin) {
version.extensions.LegacyStrikeThroughPlugin = {installed:true};

config.formatters.push(
{
	name: "legacyStrikeByChar",
	match: "==",
	termRegExp: /(==)/mg,
	element: "strike",
	handler: config.formatterHelpers.createElementAndWikify
});

} //# end of "install only once"
//}}}
Encrypted(E72C95771BABAAC3EC8F4549962B4983B764405F)
08855c327ddc1c8c604c81bbe39a68bf98ce01213133216bcadd2569655f213334
21d3838f3145ed79c7b1466b6c71b7033d4b18fba14d8aab9f4bf43ed6c9303d
4703213333214063b5e5b54197213334217d7a6b7ce70717605265f82543ab39
c34e4b5ebe712f4498299ce3252bde66afd60f949b2341fbf3e39850484f82ed
b94eaaeab2cc42e1f6131ad7d6fed1204b05213021e44bb9aa0730139e0e2a21
3333219f0659b0287a5092c92acf34b08898a95080e86fcf4071151b68ff2c21
313221fa51963cd85c2a052e76f8945bb9b7bf7d88b3606d03ac1ed0f3e22131
332153be5d0f2a04205bc37a8ae04a4421333321bc2b4a2ece2cac48ea15dcd6
df1f163b7c4582250558b3b6616078d5f537213333215877213131219cf3f4d5
a9213136302139fb2bc78edf9d9e94baddcaf9a1c56d7f7dc5f425f28990c554
712854dc1821313121eb9ef275230f978c94b7540fee180ec4200f37e1c11ee3
9ba49052238b88eed95caa40e1f42eedc2a5f321333921cd635b2131363021a2
a9c6a81a80e67680ba2d15ada98cba7263ad1eec93aebf105e292b47399f2131
3221c90eb09af2b6463364a4d1ead981fa5792ecc03f55da66ac425254d74614
b4590ed9ed077ab6bfe869a7ea826abb30bbbe7257cbeda6792c2b309d552133
3421f225632130219de590bfa1cb372a662399367cb8a29ed44f21313221c2a6
21313321a610446dc84994234ca25dd39cc3ea6e8e3d7ac507e6c12139215215
959a2880b17b88c7b21a3f100f3a8b25404e9f2b47beba59ea2f2a7481fc976f
a945dbfa21313321ad01967da90531bdc8d09a8dd2c23ea39b1ce48b3986c99e
68573ee404aad739ee213333215c4db5fce6486f531a506d014dbbc0c8c65010
10879721313221743f74e1503f02df0f73de75db91a74123d9499fac536319e9
fd2131312140cf6cae8f04e94b66bcb7f9fade399d572d23927ca4758c809c56
02122921313121f9fcad7163417edd148635babbeeffedb5d39a84da25520fb0
d6ec69379391351ad7ec15213333215e28bb84a25d11cdb159dcc9afbd6762e6
af12f84857e3a52c3cac213132214835b10f915d8f8b7d9c19401c9c8dc6604f
c7b2f9699eb4370e9df0268c7e557dd1ad86bf7d9f1821313221c1c2a8a9391e
13971761593cb404801021313021b5f21cf243eb52e573b57725baa421313221
58703eb24650b948d7a10e38b9cfead3af944d96ec4d8f55038d15da507ff595
3510d7fe21333321f2d773e39eec3f5d044755027df7db538a5cab75213021f3
29acc9b87e51d378579138f2f37bb57ca78f3d16234705ed50d323e94df19b78
2133332192dec85d42ac2a5904fae84d3662a36346d517a6f7d7aacea4cae971
7b0608c1abe401e4bfc6acbcb26b213130211f949f4cf0c9186df595974f18c2
a9f33db12fd9e1c6179072724d960128a4ba4d99f62659d590261fb030213130
21ea5c7b2f6174f9c83e1fe1d397e9fc0121333321ca123c3674785140318628
97d535862426e90fb169592f57c4411713b41653f33e40dadffb708d35e2b1b3
0e9a4dabadc64f995f5cae757f846a1ec581ce9e8f657c83bed4be1d15c4d53f
2b776b1d56590f40aa72c1aa6178577d9d1494b52bf3a2667405484788b4f9ce
a7e22f4878c513d51e0846af6c2ec298903d6938ac405aef7d44cb21313221c2
322a472131312186d0b9dc145e80df87bdab8035d8a7ef3d6183966694478e9d
72bbf9905170cbfe039eb0a1568eaa5b743caf62312131332138dbf0ea99903a
dee2c6bf63053aea2aa71c7e53453b1c7353d84270677b02b7d7141b2139217e
21333421bd807149c673b825293b2082b3a7edbb96f63e71cedf58172891a8a5
e892be6c24dac7cbf56baacfe1f1e121313321441d3d0310965db892a77b91bb
ff83365f3feae5d090206f4d10af01f7791dd2bfbcd46cac4d97a64ff7487306
29e9ec13178997ad157b477314dfb75ea26b3a38693a8f0f354a893fed4a472b
1a151ab70eab8721313121ad79973915e33c0f974753988dce78f41198143e21
3334211fd353cd581734c1d6b121313321b16e388990da56213132216574e34f
03f02f584462e0fd91d82820cbb9d48ef5d12a37c64863f29513fcf758f1cdc7
29cda57be2952a673eed564bfdc549861f213921acb23dd6c0da213339212131
3121918fe54226119d5eccb041acb48619b458843f9872bfe78c88d74130bf47
ca
Encrypted(F2B004D41DAA5BFD3D06F85D264A63C077B36402)
4b633b2d6ffa02716542e9bd7366fc6d3b25383dbf6b213130210eeb2cac7e88f9
6e2ba7fdf0b62393fc2386b4ed4b3e1e2b9d9d1d142a1ba9da21333321fca8ee
d2213339216d21313321cfe962443a43e321313121497466f766e7cc104f8f23
a3560e587a21313121c4cd54f15eb717fffb797f159b78d61c93675689dfe5ab
c9213136302117edd5fdfa58134695ddf21983ab0106aa9d295e282139216046
ce4e70e61a3e334d2680517b61f0664a792131302163e7b19cf536fc281a7da4
fe36e03bdb519c328a13d9e72c7f87abf55ffb2133392141e89294e9edf0da64
32a852c9da6435aa7b56c197213021bbc8fc9b3063602a16ab213921c65ec189
a7ea595271a6fc3d2defd75e865145788533df0874213021a6d0f9826f6956fb
64a2057acd4d133fbae7e673c49245ee8b55f87c0ed81dfbb5be7954689cc9b7
9039fd08f51a42aaf79378c323bedc74ab5b04bb497d9989829b2f634b235692
326395
[[DSHARP]]
---------
[[Visualizing Search Space]]
---------
[[Job Shop Schedule Partitioning]]
--------
[[Message Passing for Solving 3-SAT]]
---------
[[Maintaining Order in Linked Lists]]
---------
[[Backdoor Graphs]]
---------
[[Ideas]]
---------
[[Links]]
In general the problem was motivated by finding typed nodes in an arbitrary tree. Almost every approach comes down to the same problem: ''How do we efficiently maintain order in a linked list?''

For the insertion of single elements, this has been handled quite effectively:
* [[Original Dietz Paper | http://portal.acm.org/citation.cfm?id=802184]]
* [[Tsakalidis Paper for Ammortized $O(1)$ time | http://www.springerlink.com/content/q3337h7771w51677/]] (See section 4 for the bag trick)
* [[Modern Improvements by Bender et al. | http://www.springerlink.com/content/gm8mjdfhaa4c6fr2/]]

Problem with this is that we'd like to be able to insert //entire sublist insertions// rather than just single elements. We can assume that whatever data structure is used to maintain the entire list is also used to maintain order in the sublists we'll be inserting.

Some of the directions considered are:
&nbsp; &nbsp; //Note: not all specifically deal with sublist insertions//
* [[Naive Space Intensive Approach]] (Developed in summer '07)
* [[Skip List with Edge Information]] (Developed in summer '07)
* [[Balanced Typed Trees]] (Suggested by Prof. Ellen)
* [[Implicit Insertion Ancestor Relations]] (Developed in April '08)

Other ideas briefly touched on:
* Using the Tsakalidis $O(1)$ bag technique but merging bags on insertion.
* Splitting lists and re-ordering to keep the ancestor relations shallow (and balanced).
Encrypted(118AFFA45B4371F851BA6341D8DB3EA71968BC05)
03e645f1f776a2fe7136384935c8ebc6f7742131363021dbdf29c868f6f3c56242
5f156f36eb9cdf196477510eb777e59859d886e034b5023490142b152a5f762a
db2821313221cb6e551448d401cec49e489764495edc05773ad03e4d5d876384
73d549fb13a568bee3c871213334217405f5efe26792f52c702c57d8ce8d5d63
8d964abe06732131312116fda8a418fe8d5d48046d5783213921481b8e9973f6
ea9256196fa890b9649bc6afe42131322185869d7b7321313630218e6e07a976
96dd731d362130215288dcc74dde5e90c99f7e1b972d141f6b5e989facd7ea39
f3e66535a472d39957d6d110a19c1cdb2501bbb86cf221313321c581d6a555cf
ea6723603f2515646e1a32ae298df9e797025cf8eb598c3789cbb8d28ec53db1
6299a57a77861730472015f1ee5a041175a5cd543dc86b4a894ec2f007213021
fe4ff250e913c531df260323767c5a7e6cb2d221313021db737bf6d233349265
4c7faefce584e13b3bc342882d0433e84a6cf521333421f2113b9655e9fc7761
ef496845b0f4bde82f487fc7d83b6125d947fed67f2b21313021fb6c21313630
218b346ccd64412bf0f9e463be2131363021f1816fcac6a28fff40ba7f213921
b249cc75f588daf6019b4aa2d1383b4dff428f133bd494e77fdca879dd67cca2
a9a7c646995db11c21313021e79cdb3575ae669ef2550f1607ab3ac4dec14568
40438b11b0adbda430753708775770ed59d182d2213333210777416f2130219f
b50508171778c8a386075ed2bef73115624c25089edd465e085b63ea080120f8
6ca80f886512f30ff6e9e5d96aad2a40b7bb9d23b6b50e4c1d756b9e4492eca1
67033e2385363a7e0731b5d383dc0e61739e29e731c355bca771dbfdcaa64c1d
93a586089595feca68213133219588f963d4ff95ccf644f2a31a8a88ebf4cb5c
dd98c203a7e8a14525104da92133332141f2358c042e8bcd45802131363021dc
b38844207f
!!!Abstract:
>Backbone variables have the same assignment in all solutions to a given constraint satisfaction problem; more generally, bias represents the proportion of solutions that assign a variable a particular value. Intuitively such constructs would seem important to efficient search, but their study to date has assumed a mostly conceptual perspective, in terms of indicating problem hardness or motivating and interpreting heuristics. In this work, we first measure the ability of both existing and novel probabilistic message-passing techniques to directly estimate bias (and identify backbones) for the specific problem of Boolean Satisfiability (SAT). We confirm that methods like Belief Propagation and Survey Propagation–plus Expectation Maximization-based variants do produce good estimates with distinctive properties. We demonstrate the use of bias estimation within a modern SAT solver, and exhibit a correlation between accurate, stable, estimates and successful backtracking search. The same process also yields a family of search heuristics that can dramatically improve search efficiency for the hard random problems considered in this study.

----

{{indent{
[img[http://www.haz.ca/images/message-passing.png]]
}}}

----

Essentially message passing in [[3SAT|http://en.wikipedia.org/wiki/Boolean_satisfiability_problem]] boils down to variables and clauses informing one another what they are constrained to be (clauses can be satisfied or not, and variables can be ''True'' or ''False''). Once the messages converge to a stable setting, each variable has a bias associated with it which we take to mean //How likely am I to be set ''True''?//.

From these bias' we select the strongest variables and lock them to be what their desire was. This generates a new 3SAT problem after unit propagation, and the process is repeated. We have found some success when using this approach as a general variable/value ordering heuristic, and the following graph shows the speedup obtained when this is embedded in a popular 3SAT solver, [[MiniSat|http://minisat.se/]]

----

{{indent{
[img[http://www.cs.toronto.edu/~eihsu/VARSAT/2vary-n.jpg]]
}}}

----

|!Links|
|* [[Derivation Paper|http://www.cs.toronto.edu/~eihsu/papers/hsu-tr580.pdf]] |
|* [[Embedded Solver Paper|http://www.cs.toronto.edu/~eihsu/papers/hsu-tr577.pdf]] |
|* [[Online Results|http://www.cs.toronto.edu/~cjmuise/final-results/]] |

----

''__Direct Links:__''
This method maintains a few things:
* For each of the $k$ types, a linked list is maintained that corresponds to an ordered traversal of the entire tree.
* Each of the $n$ elements in the tree maintains $2k$ pointers for the start and end of the elements of each type that exist in the subtree rooted at the node.

''__Dummy Nodes:__''
While this idea didn't really lead to decent results, its implications and ties with set operations are interesting. Basic concept was to maintain the set of nodes that exist between two nodes of the same type.

''__Space and Time Complexity Results:__''
|>|>|>|>| !Element Pointers |
| ''Variation'' | ''Space'' | ''Lookup'' | ''Insert'' | ''Delete'' |
| //Direct Links// | $O(n\cdot k)$ | $O(1)$ | $O(k_s\cdot anc(v))$ | $O(k_s\cdot anc(v))$ |
| //Dummy Nodes// | $O(n\cdot k)$ | $O(n_s)$ | $O(n)$ | $O(n)$ |
<div class='header' macro='gradient vert #390108 #900'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu'>
<div refresh='content' tiddler='MainMenu'></div>
</div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
/***
|Name|Plugin: Scientific Notation|
|Created by|BobMcElrath|
|Email|my first name at my last name dot org|
|Location|http://bob.mcelrath.org/tiddlyjsmath-2.0.3.html|
|Version|1.0|
|Requires|[[TiddlyWiki|http://www.tiddlywiki.com]] &ge; 2.0.3, [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]] &ge; 3.0, [[Plugin: jsMath]]|
!Description
This plugin will render numbers expressed in scientific notation, such as {{{3.5483e12}}} using the jsMath plugin to display it in an intuitive way such as 3.5483e12.  You may customize the number of significant figures displayed, as well as "normalize" numbers so that {{{47392.387e9}}} is displayed as 47392.387e9.
!Installation
Install the Requirements, above, add this tiddler to your tiddlywiki, and give it the {{{systemConfig}}} tag.
!History
* 1-Feb-06, version 1.0, Initial release
!Code
***/
//{{{
config.formatters.push({
  name: "scientificNotation",
  match: "\\b[0-9]+\\.[0-9]+[eE][+-]?[0-9]+\\b",
  element: "span",
  className: "math",
  normalize: true,                          // set to 'true' to convert numbers to X.XXX \times 10^{y}
  sigfigs: 3,                               // with this many digits in the mantissa
  handler: function(w) {
    var snRegExp = new RegExp("\\b([0-9]+(?:\\.[0-9]+)?)[eE]([-0-9+]+)\\b");
    var mymatch = snRegExp.exec(w.matchText);
    var mantissa = mymatch[1];
    var exponent = parseInt(mymatch[2]);
    // normalize the number.
    if(this.normalize) {
      mantissa = parseFloat(mantissa);
      while(mantissa > 10.0) {
        mantissa = mantissa / 10.0;
        exponent++; 
      }
      while(mantissa < 1.0) {
        mantissa = mantissa * 10.0;
        exponent--;
      }
      var sigfigsleft = this.sigfigs;
      mantissa = parseInt(mantissa) + "." + (Math.round(Math.pow(10,this.sigfigs-1)*mantissa)+"").substr(1,this.sigfigs-1);
    }
    var e = document.createElement(this.element);
    e.className = this.className;
    if(exponent == 0) {
      e.appendChild(document.createTextNode(mantissa));
    } else {
      e.appendChild(document.createTextNode(mantissa + "\\times 10^{" + exponent + "}"));
    }
    w.output.appendChild(e);
  }
});
//}}}
/***
|Name|Plugin: jsMath|
|Created by|BobMcElrath|
|Email|my first name at my last name dot org|
|Location|http://bob.mcelrath.org/tiddlyjsmath.html|
|Version|1.5.1|
|Requires|[[TiddlyWiki|http://www.tiddlywiki.com]] &ge; 2.0.3, [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]] &ge; 3.0|
!Description
LaTeX is the world standard for specifying, typesetting, and communicating mathematics among scientists, engineers, and mathematicians.  For more information about LaTeX itself, visit the [[LaTeX Project|http://www.latex-project.org/]].  This plugin typesets math using [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]], which is an implementation of the TeX math rules and typesetting in javascript, for your browser.  Notice the small button in the lower right corner which opens its control panel.
!Installation
In addition to this plugin, you must also [[install jsMath|http://www.math.union.edu/~dpvc/jsMath/download/jsMath.html]] on the same server as your TiddlyWiki html file.  If you're using TiddlyWiki without a web server, then the jsMath directory must be placed in the same location as the TiddlyWiki html file.

I also recommend modifying your StyleSheet use serif fonts that are slightly larger than normal, so that the math matches surrounding text, and \\small fonts are not unreadable (as in exponents and subscripts).
{{{
.viewer {
  line-height: 125%;
  font-family: serif;
  font-size: 12pt;
}
}}}

If you had used a previous version of [[Plugin: jsMath]], it is no longer necessary to edit the main tiddlywiki.html file to add the jsMath <script> tag.  [[Plugin: jsMath]] now uses ajax to load jsMath.
!History
* 11-Nov-05, version 1.0, Initial release
* 22-Jan-06, version 1.1, updated for ~TW2.0, tested with jsMath 3.1, editing tiddlywiki.html by hand is no longer necessary.
* 24-Jan-06, version 1.2, fixes for Safari, Konqueror
* 27-Jan-06, version 1.3, improved error handling, detect if ajax was already defined (used by ZiddlyWiki)
* 12-Jul-06, version 1.4, fixed problem with not finding image fonts
* 26-Feb-07, version 1.5, fixed problem with Mozilla "unterminated character class".
* 27-Feb-07, version 1.5.1, Runs compatibly with TW 2.1.0+, by Bram Chen
!Examples
|!Source|!Output|h
|{{{The variable $x$ is real.}}}|The variable $x$ is real.|
|{{{The variable \(y\) is complex.}}}|The variable \(y\) is complex.|
|{{{This \[\int_a^b x = \frac{1}{2}(b^2-a^2)\] is an easy integral.}}}|This \[\int_a^b x = \frac{1}{2}(b^2-a^2)\] is an easy integral.|
|{{{This $$\int_a^b \sin x = -(\cos b - \cos a)$$ is another easy integral.}}}|This $$\int_a^b \sin x = -(\cos b - \cos a)$$ is another easy integral.|
|{{{Block formatted equations may also use the 'equation' environment \begin{equation}  \int \tan x = -\ln \cos x \end{equation} }}}|Block formatted equations may also use the 'equation' environment \begin{equation}  \int \tan x = -\ln \cos x \end{equation}|
|{{{Equation arrays are also supported \begin{eqnarray} a &=& b \\ c &=& d \end{eqnarray} }}}|Equation arrays are also supported \begin{eqnarray} a &=& b \\ c &=& d \end{eqnarray} |
|{{{I spent \$7.38 on lunch.}}}|I spent \$7.38 on lunch.|
|{{{I had to insert a backslash (\\) into my document}}}|I had to insert a backslash (\\) into my document|
!Code
***/
//{{{

// AJAX code adapted from http://timmorgan.org/mini
// This is already loaded by ziddlywiki...
if(typeof(window["ajax"]) == "undefined") {
  ajax = {
      x: function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest()}}},
      gets: function(url){var x=ajax.x();x.open('GET',url,false);x.send(null);return x.responseText}
  }
}

// Load jsMath
jsMath = {
  Setup: {inited: 1},          // don't run jsMath.Setup.Body() yet
  Autoload: {root: new String(document.location).replace(/[^\/]*$/,'jsMath/')}  // URL to jsMath directory, change if necessary
};
var jsMathstr;
try {
  jsMathstr = ajax.gets(jsMath.Autoload.root+"jsMath.js");
} catch(e) {
  alert("jsMath was not found: you must place the 'jsMath' directory in the same place as this file.  "
       +"The error was:\n"+e.name+": "+e.message);
  throw(e);  // abort eval
}
try {
  window.eval(jsMathstr);
} catch(e) {
  alert("jsMath failed to load.  The error was:\n"+e.name + ": " + e.message + " on line " + e.lineNumber);
}
jsMath.Setup.inited=0;  //  allow jsMath.Setup.Body() to run again

// Define wikifers for latex
config.formatterHelpers.mathFormatHelper = function(w) {
    var e = document.createElement(this.element);
    e.className = this.className;
    var endRegExp = new RegExp(this.terminator, "mg");
    endRegExp.lastIndex = w.matchStart+w.matchLength;
    var matched = endRegExp.exec(w.source);
    if(matched) {
        var txt = w.source.substr(w.matchStart+w.matchLength, 
            matched.index-w.matchStart-w.matchLength);
        if(this.keepdelim) {
          txt = w.source.substr(w.matchStart, matched.index+matched[0].length-w.matchStart);
        }
        e.appendChild(document.createTextNode(txt));
        w.output.appendChild(e);
        w.nextMatch = endRegExp.lastIndex;
    }
}

config.formatters.push({
  name: "displayMath1",
  match: "\\\$\\\$",
  terminator: "\\\$\\\$\\n?", // 2.0 compatability
  termRegExp: "\\\$\\\$\\n?",
  element: "div",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

config.formatters.push({
  name: "inlineMath1",
  match: "\\\$", 
  terminator: "\\\$", // 2.0 compatability
  termRegExp: "\\\$",
  element: "span",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

var backslashformatters = new Array(0);

backslashformatters.push({
  name: "inlineMath2",
  match: "\\\\\\\(",
  terminator: "\\\\\\\)", // 2.0 compatability
  termRegExp: "\\\\\\\)",
  element: "span",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

backslashformatters.push({
  name: "displayMath2",
  match: "\\\\\\\[",
  terminator: "\\\\\\\]\\n?", // 2.0 compatability
  termRegExp: "\\\\\\\]\\n?",
  element: "div",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

backslashformatters.push({
  name: "displayMath3",
  match: "\\\\begin\\{equation\\}",
  terminator: "\\\\end\\{equation\\}\\n?", // 2.0 compatability
  termRegExp: "\\\\end\\{equation\\}\\n?",
  element: "div",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

// These can be nested.  e.g. \begin{equation} \begin{array}{ccc} \begin{array}{ccc} ...
backslashformatters.push({
  name: "displayMath4",
  match: "\\\\begin\\{eqnarray\\}",
  terminator: "\\\\end\\{eqnarray\\}\\n?", // 2.0 compatability
  termRegExp: "\\\\end\\{eqnarray\\}\\n?",
  element: "div",
  className: "math",
  keepdelim: true,
  handler: config.formatterHelpers.mathFormatHelper
});

// The escape must come between backslash formatters and regular ones.
// So any latex-like \commands must be added to the beginning of
// backslashformatters here.
backslashformatters.push({
    name: "escape",
    match: "\\\\.",
    handler: function(w) {
        w.output.appendChild(document.createTextNode(w.source.substr(w.matchStart+1,1)));
        w.nextMatch = w.matchStart+2;
    }
});

config.formatters=backslashformatters.concat(config.formatters);

window.wikify = function(source,output,highlightRegExp,tiddler)
{
    if(source && source != "") {
        if(version.major == 2 && version.minor > 0) {
            var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
            wikifier.subWikifyUnterm(output);
        } else {
            var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler);
            wikifier.subWikify(output,null);
        }
        jsMath.ProcessBeforeShowing();
    }
}
//}}}
Encrypted(15487E453734D9BC156E64E54555448D51233356)
a43d3f3e5a7e9935b275ac60a4d862ae3594c8e7103fe04f21333321602a39488b
5d3387cdbefc3b6a3e8ca84e3dc0527d36eb2c4cad126b795b9f4f16e7ac4bd1
d02f292e7f56a3213130219ab3f080a35e7cc64cb7dd6b156203d43971742504
833da5d43295a721333921dec0a2e1f45fa54bcbd471805eeebe93bb9e89d82f
32a99ea22c377603b6d9a49a21333421ca236e7bf89e062131302167b1035a4d
84130168f72bdf045aafaa96405982f82f2515cb3c7b49f4732b8b5107480389
6953c483ccf664fb01f2126fdcff28f9ec1bd1811eff30a6942bd28a71937252
1e1d83b6d94371b8c352769a570f
<<tabs txtMainTab "Tags" "All tags" TabTags "More" "More lists" TabMore>>
personal research notes and project ideas
Research Wiki
The general idea here is to take an ordered traversal of the entire tree and build a skip list structure on top of the list. The edges of the skip list at every level would contain the types seen in the nodes below it. There are a number of variations depending on if links between nodes of the same type are used, and how the information is stored on the edges.

For more information, refer to the paper [[[here]| http://www.haz.ca/docs/papers/order-linked-lists.pdf ]].

|>|>|>|>|!Skip List Covering|
| ''Variation'' | ''Space'' | ''Lookup'' | ''Insert'' | ''Delete'' |
| //Bit Vector//<br> //Type Links// | $O(n\log k)$ | $O(\log n_s + r)$ | $O(k\cdot\log\frac{n}{k} + k + k_s \cdot \log n)$ |  $O(k\cdot\log\frac{n}{k} + k + k \cdot \log n)$ |
| //Hash Table//<br> //Type Links// | $O(\frac{n\cdot k}{\log n})$ | $O(\log n_s + r)$ | $O(\log n + k + k_s \cdot \log n)$ | $O(\log n + k + k \cdot \log n)$ |
| //Bit Vector//<br> //No Type Links// | $O(n\log k)$ | $O(\log n_s + r\cdot \log(n_s / r))$ | $O(k\cdot\log\frac{n}{k} + k)$ | $O(k\cdot\log\frac{n}{k} + k)$ |
| //Hash Table//<br> //No Type Links// | $O(\frac{n\cdot k}{\log n})$ | $O(\log n_s + r\cdot \log(n_s / r))$ | $O(\log n + k)$ | $O(\log n + k)$ |
Encrypted(7273829A4983400B3906CA7DCCD14EF12A4298D0)
76f83361e71c213333210f3725fc81168240ad51cc348ba9b9f18ef021313221ff
c1679eb3be94ad8df5c82131322192a56ec16fab86cb213021699cc5b20469ef
f00573ab072cf294581645a22c3eb8cbce172131363021b45fa1cade91867b74
ea772801d26dd171a89d10213334212bb7787e91063d8ebbaf7370809ffbdd48
81213130215aaf8bfdaddc5e4e9d761eb465e182c823c1ac2f672ed6e9213136
302137052e6eb10668ab3821333921595958dd939957635b44a1c786213021f6
0f53139ede572a25409d2302aa800e34538195c3e1213131214eaf7621313630
2140b03698d637c88df69aa3100380e77d0191426b8138e1f1a62e6c5d454b65
d8a4b6bcb518e0ef77e518515521313630216d782133342128f6f3e27be0337c
1a1a92ffc11f0e785c40ac7be21dc8fcc0c5763af3c3f244516529676cc34a38
ec47b0213133213b81a22646bfa7db40d72301b0571e9842770eba4436a75eb0
558dc7a5e8dcdadde275f82c8aae2090bd343f5c3bd7ba6ed7f6fed12a893f5c
078fea752c50e96bdaefb212c1a4babfe8c7e0f9a2ff01bf922da69421313321
21313021aa33b2ff61bc32d96d8310b9fe31267965fc629a3f3057f316bf482b
b92e61546937213333215d7d9938a1a3a82479cfcad853bcf1d6290839c0f928
4ab8cb2131322188db20196b9a2589a7814f1fa71094f80453e61a2efd6588ee
db239461ebf93720adc1c0e21fc2
/***
|''Name:''|SparklinePlugin|
|''Description:''|Sparklines macro|
***/
//{{{
if(!version.extensions.SparklinePlugin) {
version.extensions.SparklinePlugin = {installed:true};

//--
//-- Sparklines
//--

config.macros.sparkline = {};
config.macros.sparkline.handler = function(place,macroName,params)
{
	var data = [];
	var min = 0;
	var max = 0;
	var v;
	for(var t=0; t<params.length; t++) {
		v = parseInt(params[t]);
		if(v < min)
			min = v;
		if(v > max)
			max = v;
		data.push(v);
	}
	if(data.length < 1)
		return;
	var box = createTiddlyElement(place,"span",null,"sparkline",String.fromCharCode(160));
	box.title = data.join(",");
	var w = box.offsetWidth;
	var h = box.offsetHeight;
	box.style.paddingRight = (data.length * 2 - w) + "px";
	box.style.position = "relative";
	for(var d=0; d<data.length; d++) {
		var tick = document.createElement("img");
		tick.border = 0;
		tick.className = "sparktick";
		tick.style.position = "absolute";
		tick.src = "data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B";
		tick.style.left = d*2 + "px";
		tick.style.width = "2px";
		v = Math.floor(((data[d] - min)/(max-min)) * h);
		tick.style.top = (h-v) + "px";
		tick.style.height = v + "px";
		box.appendChild(tick);
	}
};


}
//}}}
/***
http://tiddlystyles.com/#theme:DevFire
Author: Clint Checketts
***/

/*{{{*/
body {
background: #000;
}
/*}}}*/
/***
!Link styles /% ============================================================= %/
***/
/*{{{*/
a,
a.button,
#mainMenu a.button,
#sidebarOptions .sliderPanel a{
 color: #ffbf00;
 border: 0;
 background: transparent;
}

a:hover,
a.button:hover,
#mainMenu a.button:hover,
#sidebarOptions .sliderPanel a:hover
#sidebarOptions .sliderPanel a:active{
 color: #ff7f00;
 border: 0;
 border-bottom: #ff7f00 1px dashed;
 background: transparent;
 text-decoration: none;
}

#displayArea .button.highlight{
 color: #ffbf00;
 background: #4c4c4c;
}
/*}}}*/
/***
!Header styles /% ============================================================= %/
***/
/*{{{*/
.header{
 border-bottom: 2px solid #ffbf00;
 color: #fff;
}

.headerForeground a {
 color: #fff;
}

.header a:hover {
 border-bottom: 1px dashed #fff;
}
/*}}}*/
/***
!Main menu styles /% ============================================================= %/
***/
/*{{{*/
#mainMenu {color: #fff;}
#mainMenu h1{
 font-size: 1.1em;
}
#mainMenu li,#mainMenu ul{
 list-style: none;
 margin: 0;
 padding: 0;
}
/*}}}*/
/***
!Sidebar styles /% ============================================================= %/
***/
/*{{{*/
#sidebar {
 right: 0;
 color: #fff;
 border: 2px solid #ffbf00;
 border-width: 0 0 2px 2px;
}
#sidebarOptions {
 background-color: #4c4c4c;
 padding: 0;
}

#sidebarOptions a{
 margin: 0;
 color: #ffbf00;
 border: 0;
}
#sidebarOptions a:hover {
 color: #4c4c4c;
 background-color: #ffbf00;

}

#sidebarOptions a:active {
 color: #ffbf00;
 background-color: transparent;
}

#sidebarOptions .sliderPanel {
 background-color: #333;
 margin: 0;
}

#sidebarTabs {background-color: #4c4c4c;}
#sidebarTabs .tabSelected {
 padding: 3px 3px;
 cursor: default;
 color: #ffbf00;
 background-color: #666;
}
#sidebarTabs .tabUnselected {
 color: #ffbf00;
 background-color: #5f5f5f;
 padding: 0 4px;
}

#sidebarTabs .tabUnselected:hover,
#sidebarTabs .tabContents {
 background-color: #666;
}

.listTitle{color: #FFF;}
#sidebarTabs .tabContents a{
 color: #ffbf00;
}

#sidebarTabs .tabContents a:hover{
 color: #ff7f00;
 background: transparent;
}

#sidebarTabs .txtMoreTab .tabSelected,
#sidebarTabs .txtMoreTab .tab:hover,
#sidebarTabs .txtMoreTab .tabContents{
 color: #ffbf00;
 background: #4c4c4c;
}

#sidebarTabs .txtMoreTab .tabUnselected {
 color: #ffbf00;
 background: #5f5f5f;
}

.tab.tabSelected, .tab.tabSelected:hover{color: #ffbf00; border: 0; background-color: #4c4c4c;cursor:default;}
.tab.tabUnselected {background-color: #666;}
.tab.tabUnselected:hover{color:#ffbf00; border: 0;background-color: #4c4c4c;}
.tabContents {
 background-color: #4c4c4c;
 border: 0;
}
.tabContents .tabContents{background: #666;}
.tabContents .tabSelected{background: #666;}
.tabContents .tabUnselected{background: #5f5f5f;}
.tabContents .tab:hover{background: #666;}
/*}}}*/
/***
!Message area styles /% ============================================================= %/
***/
/*{{{*/
#messageArea {background-color: #666; color: #fff; border: 2px solid #ffbf00;}
#messageArea a:link, #messageArea a:visited {color: #ffbf00; text-decoration:none;}
#messageArea a:hover {color: #ff7f00;}
#messageArea a:active {color: #ff7f00;}
#messageArea .messageToolbar a{
 border: 1px solid #ffbf00;
 background: #4c4c4c;
}
/*}}}*/
/***
!Popup styles /% ============================================================= %/
***/
/*{{{*/
.popup {color: #fff; background-color: #4c4c4c; border: 1px solid #ffbf00;}
.popup li.disabled{color: #fff;}
.popup a {color: #ffbf00; }
.popup a:hover { background: transparent; color: #ff7f00; border: 0;}
.popup hr {color: #ffbf00; background: #ffbf00;}
/*}}}*/
/***
!Tiddler Display styles /% ============================================================= %/
***/
/*{{{*/
.title{color: #fff;}
h1, h2, h3, h4, h5 {
 color: #fff;
 background-color: transparent;
 border-bottom: 1px solid #333;
}

.subtitle{
 color: #666;
}

.viewer {
  line-height: 125%;
  font-family: serif;
  font-size: 12pt;
  color: #fff; 
}

.viewer table{background: #666; color: #fff;}

.viewer th {background-color: #996; color: #fff;}

.viewer pre, .viewer code {color: #ddd; background-color: #4c4c4c; border: 1px solid #ffbf00;}

.viewer hr {color: #666;}

.tiddler .button {color: #4c4c4c;}
.tiddler .button:hover { color: #ffbf00; background-color: #4c4c4c;}
.tiddler .button:active {color: #ffbf00; background-color: #4c4c4c;}

.toolbar {
 color: #4c4c4c;
}

.toolbar a.button,
.toolbar a.button:hover,
.toolbar a.button:active,
.editorFooter a{
 border: 0;
}

.footer {
 color: #ddd;
}

.selected .footer {
 color: #888;
}

.highlight, .marked {
 color: #000;
 background-color: #ffe72f;
}
.editorFooter {
 color: #aaa;
}

.tab{
-moz-border-radius-topleft: 3px;
-moz-border-radius-topright: 3px;
}

.tagging,
.tagged{
 background: #4c4c4c;
 border: 1px solid #4c4c4c; 
}

.selected .tagging,
.selected .tagged{
 background-color: #333;
 border: 1px solid #ffbf00;
}

.tagging .listTitle,
.tagged .listTitle{
 color: #fff;
}

.tagging .button,
.tagged .button{
 color: #ffbf00;
 border: 0;
 padding: 0;
}

.tagging .button:hover,
.tagged .button:hover{
background: transparent;
}

.selected .isTag .tagging.simple,
.selected .tagged.simple,
.isTag .tagging.simple,
.tagged.simple {
 float: none;
 display: inline;
 border: 0;
 background: transparent;
 color: #fff;
 margin: 0;
}

.cascade {
 background: #4c4c4c;
 color: #ddd;
 border: 1px solid #ffbf00;
}

.justifyright {
 text-align: right;
}

/*}}}*/
<<tabs txtMoreTab "Missing" "Missing tiddlers" TabMoreMissing "Shadowed" "Shadowed tiddlers" TabMoreShadowed>>
/***
|Name|TiddlerEncryptionPlugin|
|Author|Lyall Pearce|
|Source|http://www.Remotely-Helpful.com/TiddlyWiki/TiddlerEncryptionPlugin.html|
|License|[[Creative Commons Attribution-Share Alike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|Version|3.2.1|
|~CoreVersion|2.4.0|
|Requires|None|
|Overrides|store.getSaver().externalizeTiddler(), store.getTiddler() and store.getTiddlerText()|
|Description|Encrypt/Decrypt Tiddlers with a Password key|

!!!!!Usage
<<<
* Tag a tiddler with Encrypt(prompt)
** Consider the 'prompt' something to help you remember the password with. If multiple tiddlers can be encrypted with the same 'prompt' and you will only be asked for the password once.
* Upon save, the Tiddler will be encrypted and the tag replaced with Decrypt(prompt).
** Failure to encrypt (by not entering a password) will leave the tiddler unencrypted and will leave the Encrypt(prompt) tag in place. This means that the next time you save, you will be asked for the password again.
** To have multiple tiddlers use the same password - simply use the same 'prompt'.
** Tiddlers that are encrypted may be automatically tagged 'excludeSearch' as there is no point in searching encrypted data - this is configurable by an option - you still may want to search the titles of encrypted tiddlers
** Tiddlers that are encrypted may be automatically tagged 'excludeLists', if you have them encrypted, you may also want to keep them 'hidden' - this is configurable by an option.
** Automatic removal of excludeLists and excludeSearch tags is performed, if the above two options are set, only if these two tags are the last 2 tags for a tiddler, if they are positioned somewhere else in the tags list, they will be left in place, meaning that the decrypted tiddler will not be searchable and/or will not appear in lists.
** Encrypted tiddlers are stored as displayable hex, to keep things visibly tidy, should you display an encrypted tiddler. There is nothing worse than seeing a pile of gobbledy gook on your screen. Additionally, the encrypted data is easily cut/paste/emailed if displayed in hex form.
* Tiddlers are decrypted only if you click the decrypt button or the decryptAll button, not when you load the TiddlyWiki
** If you don't display a tiddler, you won't have the option to decrypt it (unless you use the {{{<<EncryptionDecryptAll>>}}} macro)
** Tiddlers will re-encrypt automatically on save.
** Decryption of Tiddlers does not make your TiddlyWiki 'dirty' - you will not be asked to save if you leave the page.
* Errors are reported via diagnostic messages.
** Empty passwords, on save, will result in the tiddler being saved unencrypted - this should only occur with new tiddlers, decrypted tiddlers or with tiddlers who have had their 'prompt' tag changed.
** Encrypted tiddlers know if they are decrypted successfully - failure to decrypt a tiddler will ''not'' lose your data.
** Editing of an encrypted (that has not been unencrypted) tiddler will result in loss of that tiddler as the SHA1 checksums will no longer match, upon decryption. To this end, it is best that you do not check the option. You can, however edit an encrypted tiddler tag list - just do ''not'' change the tiddler contents.
** To change the password on a Tiddler, change the Encrypt('prompt') tag to a new prompt value, after decrypting the tiddler.
** You can edit the tags of an encrypted tiddler, so long as you do not edit the text.
** To change the password for all tiddlers of a particular prompt, use the {{{<<EncryptionChangePassword ["button text" ["tooltip text" ["prompt string" ["accessKey"]]]]>>}}} macro.
** To decrypt all tiddlers of a particular "prompt string", use the {{{<<EncryptionDecryptAll ["button text" ["tooltip text" ["prompt string" ["accessKey"]]]]>>}}} macro - this will make tiddlers encrypted with "prompt string" searchable - or prompt for all 'prompt strings', if none is supplied.
<<<
!!!!!Configuration
<<<
Useful Buttons: 
<<EncryptionChangePassword>> - Change passwords of encrypted tiddlers.
<<EncryptionDecryptAll>> - Decrypt ALL tiddlers - enables searching contents of encrypted tiddlers.
<<option chkExcludeEncryptedFromSearch>> - If set, Encrypted Tiddlers are excluded from searching by tagging with excludeSearch. If Clear, excludeSearch is not added and it is also removed from existing Encrypted Tiddlers only if it is the last Tag. Searching of Encrypted Tiddlers is only meaningful for the Title and Tags.
<<option chkExcludeEncryptedFromLists>> - If set, Encrypted Tiddlers are excluded from lists by tagging with excludeLists. If Clear, excludeLists is not added and it is also removed from existing Encrypted Tiddlers only if it is the last Tag. Preventing encrypted tiddlers from appearing in lists effectively hides them.
<<option chkShowDecryptButtonInContent>> - If set, Encrypted Tiddlers content is replaced by <<EncryptionDecryptThis>> button. This has consequences, in the current version as, if you edit the tiddler without decrypting it, you lose the contents.
<<<
!!!!!Revision History
<<<
* 3.2.1 - Returned the <<EncryptionDecryptThis>> button as an option.
* 3.2.0 - Ditched the 'Decrypt' button showing up in the tiddler contents if the tiddler is encrypted. It caused too much pain if you edit the tiddler without decrypting it - you lost your data as it was replaced by a Decrypt Macro call!  Additionally, a 'decrypt' button will now appear in the toolbar, just before the edit button, if the tiddler is encrypted. This button only appears if using core TiddlyWiki version 2.4 or above.
* 3.1.1 - Obscure bug whereby if an encrypted tiddler was a certain length, it would refuse to decrypt.
* 3.1.0 - When creating a new Encrypt(prompt) tiddler and you have not previously decrypted a tiddler with the same prompt, on save, you will be prompted for the password to encrypt the tiddler. Prior to encrypting, an attempt to decrypt all other tiddlers with the same prompt, is performed. If any tiddler fails to decrypt, the save is aborted - this is so you don't accidentally have 2 (or more!) passwords for the same prompt. Either you enter the correct password, change the prompt string and try re-saving or you cancel (and the tiddler is saved unencrypted).
* 3.0.1 - Allow Enter to be used for password entry, rather than having to press the OK button.
* 3.0.0 - Major revamp internally to support entry of passwords using forms such that passwords are no longer visible on entry. Completely backward compatible with old encrypted tiddlers. No more using the javascript prompt() function.
<<<
!!!!!Additional work

***/
//{{{
version.extensions.TiddlerEncryptionPlugin = {major: 3, minor: 2, revision: 1, date: new Date(2008,10,26)};

// where I cache the passwords - for want of a better place.
config.encryptionPasswords = new Array();
config.encryptionReEnterPasswords = false;

if(config.options.chkExcludeEncryptedFromSearch == undefined) config.options.chkExcludeEncryptedFromSearch = false;
if(config.options.chkExcludeEncryptedFromLists == undefined) config.options.chkExcludeEncryptedFromLists = false;
if(config.options.chkShowDecryptButtonInContent == undefined) config.options.chkShowDecryptButtonInContent = false;

config.macros.EncryptionChangePassword = {};
config.macros.EncryptionChangePassword.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
    var theButton = createTiddlyButton(place,
				       (params[0] && params[0].length > 0) ? params[0] : "Change Passwords", 
				       (params[1] && params[1].length > 0) ? params[1] : "Change Passwords" + (params[2] ? " for prompt "+params[2] : ""), 
				       onClickEncryptionChangePassword,
				       null,
				       null,
				       params[3]);
    if(params[2] && params[2].length > 0) {
	theButton.setAttribute("promptString", params[2]);
    }
};

config.macros.EncryptionDecryptAll = {};
config.macros.EncryptionDecryptAll.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
    var theButton = createTiddlyButton(place,
				       (params[0] && params[0].length > 0) ? params[0] : "Decrypt All", 
				       (params[1] && params[1].length > 0) ? params[1] : "Decrypt All Tiddlers" + ((params[2] && params[2].length > 0) ? " for prompt "+params[2] : " for a given 'prompt string'"), 
				       onClickEncryptionDecryptAll,
				       null,
				       null,
				       params[3]);
    if(params[2] && params[2].length > 0) {
	theButton.setAttribute("promptString", params[2]);
    }
};

config.macros.EncryptionDecryptThis = {};
config.macros.EncryptionDecryptThis.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
    var theButton = createTiddlyButton(place,
				       (params[0] && params[0].length > 0) ? params[0] : "Decrypt", 
				       (params[1] && params[1].length > 0) ? params[1] : "Decrypt this Tiddler", 
				       onClickEncryptionDecryptThis,
				       null,
				       null,
				       params[3]);
    if(params[2] && params[2].length > 0) {
	theButton.setAttribute("theTiddler", params[2]);
    }
};
// toolbar button to decrypt tiddlers.
config.commands.decryptThis = {
  text: "decrypt",
  tooltip: "Decrypt this tiddler",
  isEnabled : function(tiddler) {
	// Only show decrypt button if tiddler is tagged as Decrypt(
	if(tiddler.tags.join().indexOf('Decrypt(') == -1)  {
	    return false;
	} else {
	    return true;
	}
    },	
  handler: function(event, src, title) {
	encryptionGetAndDecryptTiddler(title);
	return false; 
    }
};
// core version 2.4 or above get a 'decrypt' button in the toolbar.
if(config.shadowTiddlers && config.shadowTiddlers.ToolbarCommands  && config.shadowTiddlers.ToolbarCommands.indexOf('decryptThis') == -1) {
    // put our toolbar button in before the edit button.
    // won't work if editTiddler is not the default item (prefixed with plus)
    config.shadowTiddlers.ToolbarCommands.replace(/\+editTiddler/,'decryptThis +editTiddler');
}


// Called by the EncryptionChangePassword macro/button
// Also invoked by the callback for password entry
function onClickEncryptionChangePassword(eventObject) {
    var promptString;
    if(!promptString && this.getAttribute) {
	promptString = this.getAttribute("promptString");
    }
    // I do call this function directly
    if(!promptString && typeof(eventObject) == "string") {
	promptString = eventObject;
    }
    if(!promptString) {
	promptString = prompt("Enter 'prompt string' to change password for:","");
    }
    if(!promptString) {
	return;
    }
    if(! config.encryptionPasswords[promptString]) {
	var changePasswordContext = {changePasswordPromptString: promptString,
				     callbackFunction: MyChangePasswordPromptCallback_TiddlerEncryptionPlugin};
	MyPrompt_TiddlerEncryptionPlugin(promptString,"",changePasswordContext);
	return;
	// Callback function will re-invoke this function
    }

    // Decrypt ALL tiddlers for that prompt
    onClickEncryptionDecryptAll(promptString);
    // Now ditch the cached password, this will force the re-request for the new password, on save.
    displayMessage("Save TiddlyWiki to set new password for '"+promptString+"'");
    config.encryptionPasswords[promptString] = null;
    // mark store as dirty so a save will be requrested.
    store.setDirty(true);
    autoSaveChanges(); 
    return;
};
// Called by the password entry form when the user clicks 'OK' button.
function MyChangePasswordPromptCallback_TiddlerEncryptionPlugin(context) {
    config.encryptionPasswords[context.passwordPrompt] = context.password;
    onClickEncryptionChangePassword(context.changePasswordPromptString);
    return;
}
// Called by the EncryptionDecryptThis macro/button
function onClickEncryptionDecryptThis() {
    var theTiddler = this.getAttribute("theTiddler");
    if(!theTiddler) {
	return;
    }
    encryptionGetAndDecryptTiddler(theTiddler);
    return;
};

function encryptionGetAndDecryptTiddler(title) {
    config.encryptionReEnterPasswords = true;
    try {
	theTiddler = store.getTiddler(title);
	config.encryptionReEnterPasswords = false;
	story.refreshAllTiddlers();
    } catch (e) {
	if(e == "DecryptionFailed") {
	    displayMessage("Decryption failed");
	    return;
	}
    } // catch
    return;
};

// called by the EncryptionDecryptAlll macro/button
// Also called by the callback after the user clicks 'OK' button on the password entry form
function onClickEncryptionDecryptAll(eventObject) {
    var promptString;
    if(!promptString && this.getAttribute) {
	promptString = this.getAttribute("promptString");
    }
    // I do call this function directly
    if(!promptString && typeof(eventObject) == "string") {
	promptString = eventObject;
    }
    if(!promptString) {
	promptString = "";
    }

    // Loop through all tiddlers, looking to see if there are any Decrypt(promptString) tagged tiddlers
    // If there are, check to see if their password has been cached.
    // If not, ask for the first one that is missing, that we find
    // the call back function will store that password then invoke this function again, 
    // which will repeat the whole process. If we find all passwords have been cached
    // then we will finally do the decryptAll functionality, which will then
    // be able to decrypt all the required tiddlers, without prompting.
    // We have to do this whole rigmarole because we are using a 'form' to enter the password
    // rather than the 'prompt()' function - which shows the value of the password.
    var tagToSearchFor="Decrypt("+promptString;
    config.encryptionReEnterPasswords = true; 
    var promptGenerated = false;
    store.forEachTiddler(function(store,tiddler) {
	    // Note, there is no way to stop the forEachTiddler iterations
	    if(!promptGenerated && tiddler && tiddler.tags) {
		for(var ix=0; ix<tiddler.tags.length && !promptGenerated; ix++) {
		    if(tiddler.tags[ix].indexOf(tagToSearchFor) == 0) {
			var tag = tiddler.tags[ix];
			var lastBracket=tag.lastIndexOf(")");
			if(lastBracket >= 0) {
			    // Ok, tagged with Encrypt(passwordPrompt)
			    // extract the passwordPrompt name
			    var passwordPromptString=tag.substring(8,lastBracket);
			    if(!config.encryptionPasswords[passwordPromptString]) {
				// no password cached, prompt and cache it, rather than decryptAll
				// callback from prompting form will resume decryptAll attempt.
				var decryptAllContext = {decryptAllPromptString: promptString,
							 callbackFunction: MyDecryptAllPromptCallback_TiddlerEncryptionPlugin};
				MyPrompt_TiddlerEncryptionPlugin(passwordPromptString,"",decryptAllContext);
				promptGenerated = true;
			    } // if(!config.encryptionPasswords
			} // if(lastBracket
		    } // if(tiddler.tags[ix]..
		} // for
	    } // if
	}); // store.forEachTiddler
    // If we get here, all passwords have been cached.
    if(!promptGenerated) {
	config.encryptionReEnterPasswords = false;
	// Now do the decrypt all functionality
	try {
	    store.forEachTiddler(function(store,tiddler) {
		    // Note, there is no way to stop the forEachTiddler iterations
		    if(tiddler && tiddler.tags) {
			for(var ix=0; ix<tiddler.tags.length; ix++) {
			    if(tiddler.tags[ix].indexOf(tagToSearchFor) == 0) {
				try {
				    CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler);
				} catch (e) {
				    displayMessage("Decryption of '"+tiddler.title+"' failed.");
				    // throw e;
				}
			    } // if(tiddler.tags
			} // for
		    } // if
		}); // store.forEachTiddler
	    displayMessage("All tiddlers" + (promptString != "" ? " for '"+promptString+"'" : "") + " have been decrypted");
	} catch (e) {
	    if(e == "DecryptionFailed") {
		return;
	    }
	} // catch
    }
    return;
};

function MyDecryptAllPromptCallback_TiddlerEncryptionPlugin(context) {
    config.encryptionPasswords[context.passwordPrompt] = context.password;
    // restart the decryptAll process again after the user has entered a password.
    onClickEncryptionDecryptAll(context.decryptAllPromptString);
    return;
}

saveChanges_TiddlerEncryptionPlugin = saveChanges;
saveChanges = function(onlyIfDirty,tiddlers) {
    // Loop through all tiddlers, looking to see if there are any Encrypt(string) tagged tiddlers
    // If there are, check to see if their password has been cached.
    // If not, ask for the first one that is missing, that we find
    // the call back function will store that password then invoke this function again, 
    // which will repeat the whole process. If we find all passwords have been cached
    // then we will finally call the original saveChanges() function, which will then
    // be able to save the tiddlers.
    // We have to do this whole rigmarole because we are using a 'form' to enter the password
    // rather than the 'prompt()' function - which shows the value of the password.
    config.encryptionReEnterPasswords = true; 
    var promptGenerated = false;
    store.forEachTiddler(function(store,tiddler) {
	    if(!promptGenerated && tiddler && tiddler.tags) {
		for(var ix=0; ix<tiddler.tags.length && !promptGenerated; ix++) {
		    if(tiddler.tags[ix].indexOf("Encrypt(") == 0) {
			var tag = tiddler.tags[ix];
			var lastBracket=tag.lastIndexOf(")");
			if(lastBracket >= 0) {
			    // Ok, tagged with Encrypt(passwordPrompt)
			    // extract the passwordPrompt name
			    var passwordPrompt=tag.substring(8,lastBracket);
			    if(!config.encryptionPasswords[passwordPrompt]) {
				// no password cached, prompt and cache it, rather than save
				var saveContext = {onlyIfDirty: onlyIfDirty, 
						   tiddlers: tiddlers, 
				                   callbackFunction: MySavePromptCallback_TiddlerEncryptionPlugin};
				MyPrompt_TiddlerEncryptionPlugin(passwordPrompt,"",saveContext);
				promptGenerated = true;
			    } // if(!config.encryptionPasswords
			} // if(lastBracket
		    } // if(tiddler.tags[ix]..
		} // for
	    } // if
	}); // store.forEachTiddler
    // If we get here, all passwords have been cached.
    if(!promptGenerated) {
	config.encryptionReEnterPasswords = false;
	saveChanges_TiddlerEncryptionPlugin(onlyIfDirty,tiddlers);
    }
    return;
}

function MySavePromptCallback_TiddlerEncryptionPlugin(context) {
    config.encryptionPasswords[context.passwordPrompt] = context.password;
    // validate the password entered by attempting to decrypt all tiddlers
    // with the same encryption prompt string.
    onClickEncryptionDecryptAll(context.passwordPrompt);

    // restart the save process again
    saveChanges(context.onlyIfDirty, context.tiddlers);
    return;
}

store.getSaver().externalizeTiddler_TiddlerEncryptionPlugin = store.getSaver().externalizeTiddler;
store.getSaver().externalizeTiddler = function(store, tiddler) {
    // Ok, got the tiddler, track down the passwordPrompt in the tags.
    // track down the Encrypt(passwordPrompt) tag
    if(tiddler && tiddler.tags) {
	for(var g=0; g<tiddler.tags.length; g++) {
	    var tag = tiddler.tags[g];
	    if(tag.indexOf("Encrypt(") == 0) {
		var lastBracket=tag.lastIndexOf(")");
		if(lastBracket >= 0) {
		    // Ok, tagged with Encrypt(passwordPrompt)
		    // extract the passwordPrompt name
		    var passwordPrompt=tag.substring(8,lastBracket);
		    // Ok, Encrypt this tiddler!
		    var decryptedSHA1 = Crypto.hexSha1Str(tiddler.text);
		    var password =  GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(passwordPrompt);
		    if(password) {
			var encryptedText = TEAencrypt(tiddler.text, password);
			encryptedText = StringToHext_TiddlerEncryptionPlugin(encryptedText);
			tiddler.text = "Encrypted("+decryptedSHA1+")\n"+encryptedText;
			// Replace the Tag with the Decrypt() tag
			tiddler.tags[g]="Decrypt("+passwordPrompt+")";
			// let the store know it's dirty
			store.setDirty(tiddler.title, true);
			// prevent searches on encrypted tiddlers, still nice to search on title though.
			if(config.options.chkExcludeEncryptedFromSearch == true) {
			    tiddler.tags.push("excludeSearch");
			}
			// prevent lists of encrypted tiddlers
			if(config.options.chkExcludeEncryptedFromLists == true) {
			    tiddler.tags.push("excludeLists");
			}
		    } else {
			// do not encrypt - no password entered
		    }
		    break;
		} // if (lastBracket...
	    } // if(tag.indexOf(...
	} // for(var g=0;...
    } // if(tiddler.tags...
    
    // Then, finally, do the save by calling the function we override.

    return store.getSaver().externalizeTiddler_TiddlerEncryptionPlugin(store, tiddler);
};

function CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler) {
    if(tiddler && tiddler.tags) {
	for(var g=0; g<tiddler.tags.length; g++) {
	    var tag = tiddler.tags[g];
	    if(tag.indexOf("Decrypt(") == 0) {
		var lastBracket=tag.lastIndexOf(")");
		if(lastBracket >= 0) {
		    if(tiddler.text.substr(0,10) == "Encrypted(") {
			var closingSHA1Bracket = tiddler.text.indexOf(")");
			var decryptedSHA1 = tiddler.text.substring(10, closingSHA1Bracket);
			// Ok, tagged with Decrypt(passwordPrompt)
			// extract the passwordPrompt name
			var passwordPrompt=tag.substring(8,lastBracket);
			// Ok, Decrypt this tiddler!
			var decryptedText = tiddler.text.substr(closingSHA1Bracket+2);
			decryptedText = HexToString_TiddlerEncryptionPlugin(decryptedText);
                        // prompt("Decryption request for Tiddler '"+tiddler.title+"'");
			var password = GetAndSetPasswordForPromptToDecrypt_TiddlerEncryptionPlugin(passwordPrompt);
			if(password) {
			    decryptedText = TEAdecrypt(decryptedText, password );
			    var thisDecryptedSHA1 = Crypto.hexSha1Str(decryptedText);
			    if(decryptedSHA1 == thisDecryptedSHA1) {
				tiddler.text = decryptedText;
				// Replace the Tag with the Encrypt() tag
				tiddler.tags[g]="Encrypt("+passwordPrompt+")";
				if(tiddler.tags[tiddler.tags.length-1] == 'excludeLists') {
				    // Remove exclude lists only if it's the last entry
				    // as it's automatically put there by encryption
				    tiddler.tags.length--;
				}
				if(tiddler.tags[tiddler.tags.length-1] == 'excludeSearch') {
				    // Remove exclude search only if it's the last entry
				    // as it's automatically put there by encryption
				    tiddler.tags.length--;
				}
			    } else {
				// Did not decrypt, discard the password from the cache
				config.encryptionPasswords[passwordPrompt] = null;
				config.encryptionReEnterPasswords = false;
				throw "DecryptionFailed";
			    }
			} else {
			    // no password supplied, dont bother trying to decrypt
			    config.encryptionReEnterPasswords = false;
			    throw "DecryptionFailed";
			}
		    } else {
			// Tagged as encrypted but not expected format, just leave it unchanged
		    }
		    break; // out of for loop
		} // if (lastBracket...
	    } // if(tag.indexOf(...
	} // for(var g=0;...
    } // if (tiddler && tags)
    return tiddler;
};

store.getTiddler_TiddlerEncryptionPlugin = store.getTiddler;
store.getTiddler = function(title) {
    var tiddler = store.getTiddler_TiddlerEncryptionPlugin(title);
    if(tiddler) { // shadow tiddlers are not expected to be encrypted.
	try {
	    return CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler);
	} catch (e) {
	    if (config.options.chkShowDecryptButtonInContent == true) {
		if(e == "DecryptionFailed") {
		    var tiddler = store.getTiddler("DecryptionFailed");
		    if(!tiddler) {
			tiddler = new Tiddler();
			tiddler.set(title,
				    "<<EncryptionDecryptThis \"Decrypt\" \"Decrypt this tiddler\" \""+title+"\">>",
				    config.views.wikified.shadowModifier,
				    version.date,[],version.date);
		    } 
		    return tiddler;
		} // if(e)
	    }
	    return(tiddler);
	} // catch
    } // if(tiddler) {
    return null;
};

store.getTiddlerText_TiddlerEncryptionPlugin = store.getTiddlerText;
store.getTiddlerText = function(title,defaultText) {
    // Simply retrieve the tiddler, normally, if it requires decryption, it will be decrypted
    var decryptedTiddler = store.getTiddler(title);
    if(decryptedTiddler) {
	return decryptedTiddler.text;
    }
    //Ok, rather than duplicate all the core code, the above code should fail if we reach here
    // let the core code take over.
    return  store.getTiddlerText_TiddlerEncryptionPlugin(title,defaultText);
};

// Given a prompt, search our cache to see if we have already entered the password.
// Can return null if the user enters nothing.
function MyPrompt_TiddlerEncryptionPlugin(promptString,defaultValue,context) {
    if(!context) {
	context = {};
    }
    context.passwordPrompt = promptString;
    PasswordPrompt.prompt(MyPromptCallback_TiddlerEncryptionPlugin, context);
    return;
}

function MyPromptCallback_TiddlerEncryptionPlugin(context) {
    if(context.callbackFunction) {
	context.callbackFunction(context);
    } else {
	config.encryptionPasswords[context.passwordPrompt] = context.password;
	story.refreshAllTiddlers(true);
    }
    return;
}

function GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(promptString) {
    if(!config.encryptionPasswords[promptString]) {
	config.encryptionPasswords[promptString] = MyPrompt_TiddlerEncryptionPlugin(promptString, "");
    }
    return config.encryptionPasswords[promptString]; // may be null, prompt can be cancelled.
}

function GetAndSetPasswordForPromptToDecrypt_TiddlerEncryptionPlugin(promptString) {
    if(config.encryptionReEnterPasswords) {
	return GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(promptString);
    } else {
	return config.encryptionPasswords[promptString];
    }
}

// Make the encrypted tiddlies look a little more presentable.
function StringToHext_TiddlerEncryptionPlugin(theString) {
    var theResult = "";
    for(var i=0; i<theString.length; i++) {
	var theHex = theString.charCodeAt(i).toString(16);
	if(theHex.length<2) {
	    theResult += "0"+theHex;
	} else {
	    theResult += theHex;
	}
	if(i && i % 32 == 0)
	    theResult += "\n";
    }
    return theResult;
}

function HexToString_TiddlerEncryptionPlugin(theString) {
    var theResult = "";
    for(var i=0; i<theString.length; i+=2) {
	if(theString.charAt(i) == "\n") {
	    i--;	// cause us to skip over the newline and resume
	    continue;
	}
	theResult += String.fromCharCode(parseInt(theString.substr(i, 2),16));
    }
    return theResult;
}
//
// Heavily leveraged from http://trac.tiddlywiki.org/browser/Trunk/contributors/SaqImtiaz/verticals/Hesperian/PasswordPromptPlugin.js  Revision 5635
//
PasswordPrompt ={
  prompt : function(callback,context){
	if (!context) {
	    context = {};
	}
	var box = createTiddlyElement(document.getElementById("contentWrapper"),'div','passwordPromptBox');
	box.innerHTML = store.getTiddlerText('PasswordPromptTemplate');
	box.style.position = 'absolute';
	this.center(box);
	document.getElementById('promptDisplayField').value = context.passwordPrompt;
	var passwordInputField = document.getElementById('passwordInputField');
	passwordInputField.onkeyup = function(ev) {
	    var e = ev || window.event;
	    if(e.keyCode == 10 || e.keyCode == 13) { // Enter
		PasswordPrompt.submit(callback, context);
	    }
	};
	passwordInputField.focus();
	document.getElementById('passwordPromptSubmitBtn').onclick = function(){PasswordPrompt.submit(callback,context);};
	document.getElementById('passwordPromptCancelBtn').onclick = function(){PasswordPrompt.cancel(callback,context);};
    },     
 	       
  center : function(el){
	var size = this.getsize(el);
	el.style.left = (Math.round(findWindowWidth()/2) - (size.width /2) + findScrollX())+'px';
	el.style.top = (Math.round(findWindowHeight()/2) - (size.height /2) + findScrollY())+'px';
    },
 	       
  getsize : function (el){
	var x = {};
	x.width = el.offsetWidth || el.style.pixelWidth;
	x.height = el.offsetHeight || el.style.pixelHeight;
	return x;
    },
 	       
  submit : function(cb,context){
	context.passwordPrompt = document.getElementById('promptDisplayField').value;
	context.password = document.getElementById('passwordInputField').value;
	var box = document.getElementById('passwordPromptBox');
	box.parentNode.removeChild(box);
	cb(context);
	return false;
    },

  cancel : function(cb,context){
	var box = document.getElementById('passwordPromptBox');
	box.parentNode.removeChild(box);
	return false;
    },
 	       
  setStyles : function(){
	setStylesheet(
	    "#passwordPromptBox dd.submit {margin-left:0; font-weight: bold; margin-top:1em;}\n"+
	    "#passwordPromptBox dd.submit .button {padding:0.5em 1em; border:1px solid #ccc;}\n"+
	    "#passwordPromptBox dt.heading {margin-bottom:0.5em; font-size:1.2em;}\n"+
	    "#passwordPromptBox {border:1px solid #ccc;background-color: #eee;padding:1em 2em;}",'passwordPromptStyles');
    },
 	       
  template : '<form action="" onsubmit="return false;" id="passwordPromptForm">\n'+
  '    <dl>\n'+
  '        <dt class="heading">Please enter the password:</dt>\n'+
  '        <dt>Prompt:</dt>\n'+
  '        <dd><input type="text" readonly id="promptDisplayField" class="display"/></dd>\n'+
  '        <dt>Password:</dt>\n'+
  '        <dd><input type="password" tabindex="1" class="input" id="passwordInputField"/></dd>\n'+
  '        <dd class="submit">\n'+
  '            <a tabindex="2" href="javascript:;" class="button" id="passwordPromptSubmitBtn">OK</a>\n'+
  '            <a tabindex="3" href="javascript:;" class="button" id="passwordPromptCancelBtn">Cancel</a>\n'+
  '        </dd>\n'+
  '    </dl>\n'+
  '</form>',
 	                         
  init : function(){
	config.shadowTiddlers.PasswordPromptTemplate = this.template;
	this.setStyles();
    }
};
 	
PasswordPrompt.init();

// http://www.movable-type.co.uk/scripts/tea-block.html
//
// TEAencrypt: Use Corrected Block TEA to encrypt plaintext using password
//             (note plaintext & password must be strings not string objects)
//
// Return encrypted text as string
//
function TEAencrypt(plaintext, password)
{
    if (plaintext.length == 0) return('');  // nothing to encrypt
    // 'escape' plaintext so chars outside ISO-8859-1 work in single-byte packing, but keep
    // spaces as spaces (not '%20') so encrypted text doesn't grow too long (quick & dirty)
    var asciitext = escape(plaintext).replace(/%20/g,' ');
    var v = strToLongs(asciitext);  // convert string to array of longs
    if (v.length <= 1) v[1] = 0;  // algorithm doesn't work for n<2 so fudge by adding a null
    var k = strToLongs(password.slice(0,16));  // simply convert first 16 chars of password as key
    var n = v.length;

    var z = v[n-1], y = v[0], delta = 0x9E3779B9;
    var mx, e, q = Math.floor(6 + 52/n), sum = 0;

    while (q-- > 0) {  // 6 + 52/n operations gives between 6 & 32 mixes on each word
        sum += delta;
        e = sum>>>2 & 3;
        for (var p = 0; p < n; p++) {
            y = v[(p+1)%n];
            mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
            z = v[p] += mx;
        }
    }

    var ciphertext = longsToStr(v);

    return escCtrlCh(ciphertext);
}

//
// TEAdecrypt: Use Corrected Block TEA to decrypt ciphertext using password
//
function TEAdecrypt(ciphertext, password)
{
    if (ciphertext.length == 0) return('');
    var v = strToLongs(unescCtrlCh(ciphertext));
    var k = strToLongs(password.slice(0,16)); 
    var n = v.length;

    var z = v[n-1], y = v[0], delta = 0x9E3779B9;
    var mx, e, q = Math.floor(6 + 52/n), sum = q*delta;

    while (sum != 0) {
        e = sum>>>2 & 3;
        for (var p = n-1; p >= 0; p--) {
            z = v[p>0 ? p-1 : n-1];
            mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
            y = v[p] -= mx;
        }
        sum -= delta;
    }

    var plaintext = longsToStr(v);

    // strip trailing null chars resulting from filling 4-char blocks:
    plaintext = plaintext.replace(/\0+$/,'');

    return unescape(plaintext);
}


// supporting functions

function strToLongs(s) {  // convert string to array of longs, each containing 4 chars
    // note chars must be within ISO-8859-1 (with Unicode code-point < 256) to fit 4/long
    var l = new Array(Math.ceil(s.length/4));
    for (var i=0; i<l.length; i++) {
        // note little-endian encoding - endianness is irrelevant as long as 
        // it is the same in longsToStr() 
        l[i] = s.charCodeAt(i*4) + (s.charCodeAt(i*4+1)<<8) + 
               (s.charCodeAt(i*4+2)<<16) + (s.charCodeAt(i*4+3)<<24);
    }
    return l;  // note running off the end of the string generates nulls since 
}              // bitwise operators treat NaN as 0

function longsToStr(l) {  // convert array of longs back to string
    var a = new Array(l.length);
    for (var i=0; i<l.length; i++) {
        a[i] = String.fromCharCode(l[i] & 0xFF, l[i]>>>8 & 0xFF, 
                                   l[i]>>>16 & 0xFF, l[i]>>>24 & 0xFF);
    }
    return a.join('');  // use Array.join() rather than repeated string appends for efficiency
}

function escCtrlCh(str) {  // escape control chars etc which might cause problems with encrypted texts
    return str.replace(/[\0\t\n\v\f\r\xa0'"!]/g, function(c) { return '!' + c.charCodeAt(0) + '!'; });
}

function unescCtrlCh(str) {  // unescape potentially problematic nulls and control characters
    return str.replace(/!\d\d?\d?!/g, function(c) { return String.fromCharCode(c.slice(1,-1)); });
}

//}}}
Coming soon...
This wiki houses the personal research endevours I embark on during the course of my graduate studies at [[U of T|http://cs.toronto.edu/]]. It is meant as a personal whiteboard for me to return to when various things pop into my head.

Due to the possibility of random researchers scooping my potential projects, various sections with soon-to-be-published ideas are encrypted. If I've given you the go-ahead to view this, you can decrypt the text by clicking: <<EncryptionDecryptAll>>
Encrypted(FAD094ADBDFB29620E1D63C27814F1A32030C17E)
74e5c0e2ef377a313f5a213132215a2c21333321ee2f6a01213021382868b12131
3121bbb2f0c8a272dbd7762a1946819bf28dc87ba91285f62e5636666ef0056b
b9e78a3d9c149ab8a8a8eb1b086fe9c2b98f4dd2386ca955ad767d8d3c866d60
7f78e776772a442c9243fb2133342121313321985ce6f17043571ecb7ab78ff8
8931cd9421333421f206e50f4dfedf91d8cddcc9e0f44a316529a963f4213131
21187c31b9fc9d6da82133332114cf5dfcd43d7448862d57836beb4eea5c5cca
94570721313321169f7e4869d960ea9163854baff52131322199ad2abf4863e6
c35fa2a72f23eb5621313121d1e69726964ae02eb11007e8dd2bd32321333321
a940dc7cb734cdf39a2b7e706221313630213e73a4e8a52ac11e494dffb5b5e2
b7df68861c99c92b932131332121313021e98fee9aa3186fece737dfce96ffbd
b29f21313221c15ad42c7ab15824e8688f1264bc3dcd1cc9cb63137c5f213334
2199ff66d4d28deb7a7155da4983d6ef752130215a4b213133211dc7f976ee90
faf936ad8f0fd90f1f95ead7726e68d5e134ded3d52131363021e15f2bb1